/ Hex Artifact Content
Login

Artifact e01537d4d8b8b81a6507e07ebb17fc232dacdda7:


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 2a 0a 2a 2a 20 24 49 64 3a 20  ite..**.** $Id: 
01f0: 73 65 6c 65 63 74 2e 63 2c 76 20 31 2e 34 38 36  select.c,v 1.486
0200: 20 32 30 30 38 2f 31 31 2f 31 39 20 30 39 3a 30   2008/11/19 09:0
0210: 35 3a 32 37 20 64 61 6e 69 65 6c 6b 31 39 37 37  5:27 danielk1977
0220: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
0230: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0240: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  .../*.** Delete 
0250: 61 6c 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  all the content 
0260: 6f 66 20 61 20 53 65 6c 65 63 74 20 73 74 72 75  of a Select stru
0270: 63 74 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74  cture but do not
0280: 20 64 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74   deallocate.** t
0290: 68 65 20 73 65 6c 65 63 74 20 73 74 72 75 63 74  he select struct
02a0: 75 72 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73  ure itself..*/.s
02b0: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
02c0: 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Select(sqlite3 *
02d0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  db, Select *p){.
02e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
02f0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
0300: 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  EList);.  sqlite
0310: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
0320: 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73  b, p->pSrc);.  s
0330: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
0340: 28 64 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  (db, p->pWhere);
0350: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
0360: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
0370: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c  pGroupBy);.  sql
0380: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0390: 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  b, p->pHaving);.
03a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
03b0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
03c0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69  OrderBy);.  sqli
03d0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
03e0: 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a  db, p->pPrior);.
03f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
0400: 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
0410: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
0420: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
0430: 4f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Offset);.}../*.*
0440: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53  * Initialize a S
0450: 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74  electDest struct
0460: 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
0470: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
0480: 69 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70  it(SelectDest *p
0490: 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c  Dest, int eDest,
04a0: 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70   int iParm){.  p
04b0: 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 65 44  Dest->eDest = eD
04c0: 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 50  est;.  pDest->iP
04d0: 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20 70  arm = iParm;.  p
04e0: 44 65 73 74 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Dest->affinity =
04f0: 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 4d 65   0;.  pDest->iMe
0500: 6d 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e  m = 0;.  pDest->
0510: 6e 4d 65 6d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a  nMem = 0;.}.../*
0520: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
0530: 65 77 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  ew Select struct
0540: 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ure and return a
0550: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74   pointer to that
0560: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
0570: 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  /.Select *sqlite
0580: 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 50 61  3SelectNew(.  Pa
0590: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
05a0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
05b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
05c0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
05d0: 20 20 2f 2a 20 77 68 69 63 68 20 63 6f 6c 75 6d    /* which colum
05e0: 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e  ns to include in
05f0: 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20   the result */. 
0600: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
0610: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52         /* the FR
0620: 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20 77 68 69  OM clause -- whi
0630: 63 68 20 74 61 62 6c 65 73 20 74 6f 20 73 63 61  ch tables to sca
0640: 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  n */.  Expr *pWh
0650: 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ere,         /* 
0660: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
0670: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
0680: 70 47 72 6f 75 70 42 79 2c 20 20 20 2f 2a 20 74  pGroupBy,   /* t
0690: 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
06a0: 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48  se */.  Expr *pH
06b0: 61 76 69 6e 67 2c 20 20 20 20 20 20 20 20 2f 2a  aving,        /*
06c0: 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   the HAVING clau
06d0: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
06e0: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
06f0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
0700: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ause */.  int is
0710: 44 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20  Distinct,       
0720: 2f 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 44  /* true if the D
0730: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
0740: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
0750: 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 20 20  Expr *pLimit,   
0760: 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76        /* LIMIT v
0770: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
0780: 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  s not used */.  
0790: 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 20 20  Expr *pOffset   
07a0: 20 20 20 20 20 20 2f 2a 20 4f 46 46 53 45 54 20        /* OFFSET 
07b0: 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61  value.  NULL mea
07c0: 6e 73 20 6e 6f 20 6f 66 66 73 65 74 20 2a 2f 0a  ns no offset */.
07d0: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  ){.  Select *pNe
07e0: 77 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e  w;.  Select stan
07f0: 64 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  din;.  sqlite3 *
0800: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
0810: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
0820: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
0830: 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  , sizeof(*pNew) 
0840: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
0850: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
0860: 20 21 70 4f 66 66 73 65 74 20 7c 7c 20 70 4c 69   !pOffset || pLi
0870: 6d 69 74 20 29 3b 20 2f 2a 20 4f 46 46 53 45 54  mit ); /* OFFSET
0880: 20 69 6d 70 6c 69 65 73 20 4c 49 4d 49 54 20 2a   implies LIMIT *
0890: 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  /.  if( pNew==0 
08a0: 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 26 73  ){.    pNew = &s
08b0: 74 61 6e 64 69 6e 3b 0a 20 20 20 20 6d 65 6d 73  tandin;.    mems
08c0: 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
08d0: 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a  of(*pNew));.  }.
08e0: 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
08f0: 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  ){.    pEList = 
0900: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
0910: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
0920: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
0930: 54 4b 5f 41 4c 4c 2c 30 2c 30 2c 30 29 2c 20 30  TK_ALL,0,0,0), 0
0940: 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70  );.  }.  pNew->p
0950: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
0960: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70    pNew->pSrc = p
0970: 53 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68  Src;.  pNew->pWh
0980: 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20 20  ere = pWhere;.  
0990: 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
09a0: 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65   pGroupBy;.  pNe
09b0: 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48 61  w->pHaving = pHa
09c0: 76 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  ving;.  pNew->pO
09d0: 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
09e0: 79 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c  y;.  pNew->selFl
09f0: 61 67 73 20 3d 20 69 73 44 69 73 74 69 6e 63 74  ags = isDistinct
0a00: 20 3f 20 53 46 5f 44 69 73 74 69 6e 63 74 20 3a   ? SF_Distinct :
0a10: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d   0;.  pNew->op =
0a20: 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e   TK_SELECT;.  pN
0a30: 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69  ew->pLimit = pLi
0a40: 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  mit;.  pNew->pOf
0a50: 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
0a60: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0a70: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
0a80: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0a90: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
0aa0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0ab0: 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  [2] = -1;.  if( 
0ac0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
0ad0: 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65   ) {.    clearSe
0ae0: 6c 65 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a  lect(db, pNew);.
0af0: 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73      if( pNew!=&s
0b00: 74 61 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33  tandin ) sqlite3
0b10: 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29  DbFree(db, pNew)
0b20: 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  ;.    pNew = 0;.
0b30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
0b40: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  w;.}../*.** Dele
0b50: 74 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c  te the given Sel
0b60: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
0b70: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
0b80: 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76  structures..*/.v
0b90: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
0ba0: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
0bb0: 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  *db, Select *p){
0bc0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
0bd0: 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62 2c 20  clearSelect(db, 
0be0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
0bf0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
0c00: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
0c10: 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69 66 69   1 to 3 identifi
0c20: 65 72 73 20 70 72 65 63 65 65 64 69 6e 67 20 74  ers preceeding t
0c30: 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64 2c  he JOIN keyword,
0c40: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a 2a   determine the.*
0c50: 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e 20  * type of join. 
0c60: 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
0c70: 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  er constant that
0c80: 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74 20   expresses that 
0c90: 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d 73  type.** in terms
0ca0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0cb0: 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a 2a  g bit values:.**
0cc0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45 52  .**     JT_INNER
0cd0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53 53  .**     JT_CROSS
0ce0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45 52  .**     JT_OUTER
0cf0: 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55 52  .**     JT_NATUR
0d00: 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45 46  AL.**     JT_LEF
0d10: 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47 48  T.**     JT_RIGH
0d20: 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20 6f  T.**.** A full o
0d30: 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68 65  uter join is the
0d40: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
0d50: 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f 52  JT_LEFT and JT_R
0d60: 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  IGHT..**.** If a
0d70: 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e 73  n illegal or uns
0d80: 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74 79  upported join ty
0d90: 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e  pe is seen, then
0da0: 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a 2a   still return.**
0db0: 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62 75   a join type, bu
0dc0: 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20 69  t put an error i
0dd0: 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  n the pParse str
0de0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ucture..*/.int s
0df0: 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 50  qlite3JoinType(P
0e00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
0e10: 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20 2a  ken *pA, Token *
0e20: 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b 0a  pB, Token *pC){.
0e30: 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20 3d    int jointype =
0e40: 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70 41   0;.  Token *apA
0e50: 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20 2a  ll[3];.  Token *
0e60: 70 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  p;.  static cons
0e70: 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63  t struct {.    c
0e80: 6f 6e 73 74 20 63 68 61 72 20 7a 4b 65 79 77 6f  onst char zKeywo
0e90: 72 64 5b 38 5d 3b 0a 20 20 20 20 75 38 20 6e 43  rd[8];.    u8 nC
0ea0: 68 61 72 3b 0a 20 20 20 20 75 38 20 63 6f 64 65  har;.    u8 code
0eb0: 3b 0a 20 20 7d 20 6b 65 79 77 6f 72 64 73 5b 5d  ;.  } keywords[]
0ec0: 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6e 61 74 75   = {.    { "natu
0ed0: 72 61 6c 22 2c 20 37 2c 20 4a 54 5f 4e 41 54 55  ral", 7, JT_NATU
0ee0: 52 41 4c 20 7d 2c 0a 20 20 20 20 7b 20 22 6c 65  RAL },.    { "le
0ef0: 66 74 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c 45  ft",    4, JT_LE
0f00: 46 54 7c 4a 54 5f 4f 55 54 45 52 20 7d 2c 0a 20  FT|JT_OUTER },. 
0f10: 20 20 20 7b 20 22 72 69 67 68 74 22 2c 20 20 20     { "right",   
0f20: 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f  5, JT_RIGHT|JT_O
0f30: 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 66  UTER },.    { "f
0f40: 75 6c 6c 22 2c 20 20 20 20 34 2c 20 4a 54 5f 4c  ull",    4, JT_L
0f50: 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f  EFT|JT_RIGHT|JT_
0f60: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  OUTER },.    { "
0f70: 6f 75 74 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f  outer",   5, JT_
0f80: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  OUTER },.    { "
0f90: 69 6e 6e 65 72 22 2c 20 20 20 35 2c 20 4a 54 5f  inner",   5, JT_
0fa0: 49 4e 4e 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  INNER },.    { "
0fb0: 63 72 6f 73 73 22 2c 20 20 20 35 2c 20 4a 54 5f  cross",   5, JT_
0fc0: 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 7d  INNER|JT_CROSS }
0fd0: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20  ,.  };.  int i, 
0fe0: 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d 20 3d 20  j;.  apAll[0] = 
0ff0: 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31 5d 20 3d  pA;.  apAll[1] =
1000: 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b 32 5d 20   pB;.  apAll[2] 
1010: 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = pC;.  for(i=0;
1020: 20 69 3c 33 20 26 26 20 61 70 41 6c 6c 5b 69 5d   i<3 && apAll[i]
1030: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
1040: 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20 20 66 6f  apAll[i];.    fo
1050: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
1060: 7a 65 28 6b 65 79 77 6f 72 64 73 29 3b 20 6a 2b  ze(keywords); j+
1070: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
1080: 3e 6e 3d 3d 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e  >n==keywords[j].
1090: 6e 43 68 61 72 20 0a 20 20 20 20 20 20 20 20 20  nChar .         
10a0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
10b0: 43 6d 70 28 28 63 68 61 72 2a 29 70 2d 3e 7a 2c  Cmp((char*)p->z,
10c0: 20 6b 65 79 77 6f 72 64 73 5b 6a 5d 2e 7a 4b 65   keywords[j].zKe
10d0: 79 77 6f 72 64 2c 20 70 2d 3e 6e 29 3d 3d 30 20  yword, p->n)==0 
10e0: 29 7b 0a 20 20 20 20 20 20 20 20 6a 6f 69 6e 74  ){.        joint
10f0: 79 70 65 20 7c 3d 20 6b 65 79 77 6f 72 64 73 5b  ype |= keywords[
1100: 6a 5d 2e 63 6f 64 65 3b 0a 20 20 20 20 20 20 20  j].code;.       
1110: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1120: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e      }.    if( j>
1130: 3d 41 72 72 61 79 53 69 7a 65 28 6b 65 79 77 6f  =ArraySize(keywo
1140: 72 64 73 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f  rds) ){.      jo
1150: 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52  intype |= JT_ERR
1160: 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
1170: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1180: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
1190: 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f  & (JT_INNER|JT_O
11a0: 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45  UTER))==(JT_INNE
11b0: 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20  R|JT_OUTER) ||. 
11c0: 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20      (jointype & 
11d0: 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29  JT_ERROR)!=0.  )
11e0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
11f0: 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20   *zSp = " ";.   
1200: 20 61 73 73 65 72 74 28 20 70 42 21 3d 30 20 29   assert( pB!=0 )
1210: 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20  ;.    if( pC==0 
1220: 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20  ){ zSp++; }.    
1230: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1240: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
1250: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
1260: 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20  join type: ".   
1270: 20 20 20 20 22 25 54 20 25 54 25 73 25 54 22 2c      "%T %T%s%T",
1280: 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43   pA, pB, zSp, pC
1290: 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  );.    jointype 
12a0: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65  = JT_INNER;.  }e
12b0: 6c 73 65 20 69 66 28 20 6a 6f 69 6e 74 79 70 65  lse if( jointype
12c0: 20 26 20 4a 54 5f 52 49 47 48 54 20 29 7b 0a 20   & JT_RIGHT ){. 
12d0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12e0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
12f0: 20 20 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c    "RIGHT and FUL
1300: 4c 20 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72  L OUTER JOINs ar
1310: 65 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  e not currently 
1320: 73 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20  supported");.   
1330: 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49   jointype = JT_I
1340: 4e 4e 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  NNER;.  }.  retu
1350: 72 6e 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a  rn jointype;.}..
1360: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1370: 20 69 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75   index of a colu
1380: 6d 6e 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20  mn in a table.  
1390: 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65  Return -1 if the
13a0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f   column.** is no
13b0: 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
13c0: 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  he table..*/.sta
13d0: 74 69 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e  tic int columnIn
13e0: 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c  dex(Table *pTab,
13f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
1400: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
1410: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e  or(i=0; i<pTab->
1420: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
1430: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1440: 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d  mp(pTab->aCol[i]
1450: 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  .zName, zCol)==0
1460: 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
1470: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
1480: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
1490: 61 6c 75 65 20 6f 66 20 61 20 74 6f 6b 65 6e 20  alue of a token 
14a0: 74 6f 20 61 20 27 5c 30 30 30 27 2d 74 65 72 6d  to a '\000'-term
14b0: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
14c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
14d0: 74 54 6f 6b 65 6e 28 54 6f 6b 65 6e 20 2a 70 2c  tToken(Token *p,
14e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
14f0: 0a 20 20 70 2d 3e 7a 20 3d 20 28 75 38 2a 29 7a  .  p->z = (u8*)z
1500: 3b 0a 20 20 70 2d 3e 6e 20 3d 20 7a 20 3f 20 73  ;.  p->n = z ? s
1510: 74 72 6c 65 6e 28 7a 29 20 3a 20 30 3b 0a 20 20  trlen(z) : 0;.  
1520: 70 2d 3e 64 79 6e 20 3d 20 30 3b 0a 7d 0a 0a 2f  p->dyn = 0;.}../
1530: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 74 6f 6b  *.** Set the tok
1540: 65 6e 20 74 6f 20 74 68 65 20 64 6f 75 62 6c 65  en to the double
1550: 2d 71 75 6f 74 65 64 20 61 6e 64 20 65 73 63 61  -quoted and esca
1560: 70 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  ped version of t
1570: 68 65 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65  he string pointe
1580: 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 2e 20 46 6f  d.** to by z. Fo
1590: 72 20 65 78 61 6d 70 6c 65 3b 0a 2a 2a 0a 2a 2a  r example;.**.**
15a0: 20 20 20 20 7b 61 22 62 63 7d 20 20 2d 3e 20 20      {a"bc}  ->  
15b0: 7b 22 61 22 22 62 63 22 7d 0a 2a 2f 0a 73 74 61  {"a""bc"}.*/.sta
15c0: 74 69 63 20 76 6f 69 64 20 73 65 74 51 75 6f 74  tic void setQuot
15d0: 65 64 54 6f 6b 65 6e 28 50 61 72 73 65 20 2a 70  edToken(Parse *p
15e0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 2c  Parse, Token *p,
15f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
1600: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
1610: 74 68 65 20 73 74 72 69 6e 67 20 61 70 70 65 61  the string appea
1620: 72 73 20 74 6f 20 62 65 20 71 75 6f 74 65 64 20  rs to be quoted 
1630: 75 73 69 6e 67 20 22 2e 2e 2e 22 20 6f 72 20 60  using "..." or `
1640: 2e 2e 2e 60 0a 20 20 2a 2a 20 6f 72 20 5b 2e 2e  ...`.  ** or [..
1650: 2e 5d 20 6f 72 20 27 2e 2e 2e 27 20 6f 72 20 69  .] or '...' or i
1660: 66 20 74 68 65 20 73 74 72 69 6e 67 20 63 6f 6e  f the string con
1670: 74 61 69 6e 73 20 61 6e 79 20 22 20 63 68 61 72  tains any " char
1680: 61 63 74 65 72 73 2e 20 20 0a 20 20 2a 2a 20 49  acters.  .  ** I
1690: 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e 20  f it does, then 
16a0: 72 65 63 6f 72 64 20 61 20 76 65 72 73 69 6f 6e  record a version
16b0: 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 77   of the string w
16c0: 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a  ith the special.
16d0: 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20    ** characters 
16e0: 65 73 63 61 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  escaped..  */.  
16f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d  const char *z2 =
1700: 20 7a 3b 0a 20 20 69 66 28 20 2a 7a 32 21 3d 27   z;.  if( *z2!='
1710: 5b 27 20 26 26 20 2a 7a 32 21 3d 27 60 27 20 26  [' && *z2!='`' &
1720: 26 20 2a 7a 32 21 3d 27 5c 27 27 20 29 7b 0a 20  & *z2!='\'' ){. 
1730: 20 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b     while( *z2 ){
1740: 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 32 3d 3d  .      if( *z2==
1750: 27 22 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  '"' ) break;.   
1760: 20 20 20 7a 32 2b 2b 3b 0a 20 20 20 20 7d 0a 20     z2++;.    }. 
1770: 20 7d 0a 0a 20 20 69 66 28 20 2a 7a 32 20 29 7b   }..  if( *z2 ){
1780: 0a 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 63  .    /* String c
1790: 6f 6e 74 61 69 6e 73 20 22 20 63 68 61 72 61 63  ontains " charac
17a0: 74 65 72 73 20 2d 20 63 6f 70 79 20 61 6e 64 20  ters - copy and 
17b0: 71 75 6f 74 65 20 74 68 65 20 73 74 72 69 6e 67  quote the string
17c0: 2e 20 2a 2f 0a 20 20 20 20 70 2d 3e 7a 20 3d 20  . */.    p->z = 
17d0: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 50 72  (u8 *)sqlite3MPr
17e0: 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
17f0: 20 22 5c 22 25 77 5c 22 22 2c 20 7a 29 3b 0a 20   "\"%w\"", z);. 
1800: 20 20 20 69 66 28 20 70 2d 3e 7a 20 29 7b 0a 20     if( p->z ){. 
1810: 20 20 20 20 20 70 2d 3e 6e 20 3d 20 73 74 72 6c       p->n = strl
1820: 65 6e 28 28 63 68 61 72 20 2a 29 70 2d 3e 7a 29  en((char *)p->z)
1830: 3b 0a 20 20 20 20 20 20 70 2d 3e 64 79 6e 20 3d  ;.      p->dyn =
1840: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
1850: 65 7b 0a 20 20 20 20 2f 2a 20 53 74 72 69 6e 67  e{.    /* String
1860: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 22 20 63   contains no " c
1870: 68 61 72 61 63 74 65 72 73 20 2d 20 63 6f 70 79  haracters - copy
1880: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 20 2a 2f   the pointer. */
1890: 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 28 75 38 2a  .    p->z = (u8*
18a0: 29 7a 3b 0a 20 20 20 20 70 2d 3e 6e 20 3d 20 28  )z;.    p->n = (
18b0: 7a 32 20 2d 20 7a 29 3b 0a 20 20 20 20 70 2d 3e  z2 - z);.    p->
18c0: 64 79 6e 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  dyn = 0;.  }.}..
18d0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20  /*.** Create an 
18e0: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
18f0: 66 6f 72 20 61 6e 20 69 64 65 6e 74 69 66 69 65  for an identifie
1900: 72 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20  r with the name 
1910: 6f 66 20 7a 4e 61 6d 65 0a 2a 2f 0a 45 78 70 72  of zName.*/.Expr
1920: 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74 65 49   *sqlite3CreateI
1930: 64 45 78 70 72 28 50 61 72 73 65 20 2a 70 50 61  dExpr(Parse *pPa
1940: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
1950: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 54 6f 6b 65 6e  *zName){.  Token
1960: 20 64 75 6d 6d 79 3b 0a 20 20 73 65 74 54 6f 6b   dummy;.  setTok
1970: 65 6e 28 26 64 75 6d 6d 79 2c 20 7a 4e 61 6d 65  en(&dummy, zName
1980: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
1990: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
19a0: 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 64   TK_ID, 0, 0, &d
19b0: 75 6d 6d 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ummy);.}../*.** 
19c0: 41 64 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68  Add a term to th
19d0: 65 20 57 48 45 52 45 20 65 78 70 72 65 73 73 69  e WHERE expressi
19e0: 6f 6e 20 69 6e 20 2a 70 70 45 78 70 72 20 74 68  on in *ppExpr th
19f0: 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65 0a  at requires the.
1a00: 2a 2a 20 7a 43 6f 6c 20 63 6f 6c 75 6d 6e 20 74  ** zCol column t
1a10: 6f 20 62 65 20 65 71 75 61 6c 20 69 6e 20 74 68  o be equal in th
1a20: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 70 54 61  e two tables pTa
1a30: 62 31 20 61 6e 64 20 70 54 61 62 32 2e 0a 2a 2f  b1 and pTab2..*/
1a40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64  .static void add
1a50: 57 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72  WhereTerm(.  Par
1a60: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1a70: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
1a80: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f   context */.  co
1a90: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20  nst char *zCol, 
1aa0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1ab0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  f the column */.
1ac0: 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20 2a 70    const Table *p
1ad0: 54 61 62 31 2c 20 20 20 20 20 20 2f 2a 20 46 69  Tab1,      /* Fi
1ae0: 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63  rst table */.  c
1af0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 6c 69 61  onst char *zAlia
1b00: 73 31 2c 20 20 20 20 20 2f 2a 20 41 6c 69 61 73  s1,     /* Alias
1b10: 20 66 6f 72 20 66 69 72 73 74 20 74 61 62 6c 65   for first table
1b20: 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
1b30: 2f 0a 20 20 63 6f 6e 73 74 20 54 61 62 6c 65 20  /.  const Table 
1b40: 2a 70 54 61 62 32 2c 20 20 20 20 20 20 2f 2a 20  *pTab2,      /* 
1b50: 53 65 63 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a  Second table */.
1b60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
1b70: 6c 69 61 73 32 2c 20 20 20 20 20 2f 2a 20 41 6c  lias2,     /* Al
1b80: 69 61 73 20 66 6f 72 20 73 65 63 6f 6e 64 20 74  ias for second t
1b90: 61 62 6c 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  able.  May be NU
1ba0: 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 52 69 67  LL */.  int iRig
1bb0: 68 74 4a 6f 69 6e 54 61 62 6c 65 2c 20 20 20 20  htJoinTable,    
1bc0: 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20   /* VDBE cursor 
1bd0: 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 74 61  for the right ta
1be0: 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a  ble */.  Expr **
1bf0: 70 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  ppExpr,         
1c00: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 71 75    /* Add the equ
1c10: 61 6c 69 74 79 20 74 65 72 6d 20 74 6f 20 74 68  ality term to th
1c20: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  is expression */
1c30: 0a 20 20 69 6e 74 20 69 73 4f 75 74 65 72 4a 6f  .  int isOuterJo
1c40: 69 6e 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  in          /* T
1c50: 72 75 65 20 69 66 20 64 65 61 6c 69 6e 67 20 77  rue if dealing w
1c60: 69 74 68 20 61 6e 20 4f 55 54 45 52 20 6a 6f 69  ith an OUTER joi
1c70: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  n */.){.  Expr *
1c80: 70 45 31 61 2c 20 2a 70 45 31 62 2c 20 2a 70 45  pE1a, *pE1b, *pE
1c90: 31 63 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 61  1c;.  Expr *pE2a
1ca0: 2c 20 2a 70 45 32 62 2c 20 2a 70 45 32 63 3b 0a  , *pE2b, *pE2c;.
1cb0: 20 20 45 78 70 72 20 2a 70 45 3b 0a 0a 20 20 70    Expr *pE;..  p
1cc0: 45 31 61 20 3d 20 73 71 6c 69 74 65 33 43 72 65  E1a = sqlite3Cre
1cd0: 61 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65  ateIdExpr(pParse
1ce0: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 70 45 32 61 20  , zCol);.  pE2a 
1cf0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49  = sqlite3CreateI
1d00: 64 45 78 70 72 28 70 50 61 72 73 65 2c 20 7a 43  dExpr(pParse, zC
1d10: 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 41 6c 69 61  ol);.  if( zAlia
1d20: 73 31 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 41 6c  s1==0 ){.    zAl
1d30: 69 61 73 31 20 3d 20 70 54 61 62 31 2d 3e 7a 4e  ias1 = pTab1->zN
1d40: 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45 31 62 20  ame;.  }.  pE1b 
1d50: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49  = sqlite3CreateI
1d60: 64 45 78 70 72 28 70 50 61 72 73 65 2c 20 7a 41  dExpr(pParse, zA
1d70: 6c 69 61 73 31 29 3b 0a 20 20 69 66 28 20 7a 41  lias1);.  if( zA
1d80: 6c 69 61 73 32 3d 3d 30 20 29 7b 0a 20 20 20 20  lias2==0 ){.    
1d90: 7a 41 6c 69 61 73 32 20 3d 20 70 54 61 62 32 2d  zAlias2 = pTab2-
1da0: 3e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 70 45  >zName;.  }.  pE
1db0: 32 62 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  2b = sqlite3Crea
1dc0: 74 65 49 64 45 78 70 72 28 70 50 61 72 73 65 2c  teIdExpr(pParse,
1dd0: 20 7a 41 6c 69 61 73 32 29 3b 0a 20 20 70 45 31   zAlias2);.  pE1
1de0: 63 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  c = sqlite3PExpr
1df0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
1e00: 20 70 45 31 62 2c 20 70 45 31 61 2c 20 30 29 3b   pE1b, pE1a, 0);
1e10: 0a 20 20 70 45 32 63 20 3d 20 73 71 6c 69 74 65  .  pE2c = sqlite
1e20: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
1e30: 4b 5f 44 4f 54 2c 20 70 45 32 62 2c 20 70 45 32  K_DOT, pE2b, pE2
1e40: 61 2c 20 30 29 3b 0a 20 20 70 45 20 3d 20 73 71  a, 0);.  pE = sq
1e50: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1e60: 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 63 2c 20  e, TK_EQ, pE1c, 
1e70: 70 45 32 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  pE2c, 0);.  if( 
1e80: 70 45 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  pE && isOuterJoi
1e90: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
1ea0: 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
1eb0: 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 70  FromJoin);.    p
1ec0: 45 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  E->iRightJoinTab
1ed0: 6c 65 20 3d 20 69 52 69 67 68 74 4a 6f 69 6e 54  le = iRightJoinT
1ee0: 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 45  able;.  }.  *ppE
1ef0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1f00: 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
1f10: 2a 70 70 45 78 70 72 2c 20 70 45 29 3b 0a 7d 0a  *ppExpr, pE);.}.
1f20: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45  ./*.** Set the E
1f30: 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65  P_FromJoin prope
1f40: 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73  rty on all terms
1f50: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78   of the given ex
1f60: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64  pression..** And
1f70: 20 73 65 74 20 74 68 65 20 45 78 70 72 2e 69 52   set the Expr.iR
1f80: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f  ightJoinTable to
1f90: 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76 65 72   iTable for ever
1fa0: 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a  y term in the.**
1fb0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a   expression..**.
1fc0: 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  ** The EP_FromJo
1fd0: 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73 20 75  in property is u
1fe0: 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20  sed on terms of 
1ff0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  an expression to
2000: 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46   tell.** the LEF
2010: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f  T OUTER JOIN pro
2020: 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 74 68  cessing logic th
2030: 61 74 20 74 68 69 73 20 74 65 72 6d 20 69 73 20  at this term is 
2040: 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a  part of the.** j
2050: 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f 6e 20  oin restriction 
2060: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
2070: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2080: 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20 70 61  use and not a pa
2090: 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72  rt.** of the mor
20a0: 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52 45 20  e general WHERE 
20b0: 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65 20 74  clause.  These t
20c0: 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64 20 6f  erms are moved o
20d0: 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48  ver to the.** WH
20e0: 45 52 45 20 63 6c 61 75 73 65 20 64 75 72 69 6e  ERE clause durin
20f0: 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e  g join processin
2100: 67 20 62 75 74 20 77 65 20 6e 65 65 64 20 74 6f  g but we need to
2110: 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 20 74   remember that t
2120: 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65  hey.** originate
2130: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
2140: 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  SING clause..**.
2150: 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52 69 67  ** The Expr.iRig
2160: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c  htJoinTable tell
2170: 73 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  s the WHERE clau
2180: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  se processing th
2190: 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  at the.** expres
21a0: 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20  sion depends on 
21b0: 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e  table iRightJoin
21c0: 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20 74 68  Table even if th
21d0: 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a  at table is not.
21e0: 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 6d 65  ** explicitly me
21f0: 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 65  ntioned in the e
2200: 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 61 74  xpression.  That
2210: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2220: 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61  needed.** for ca
2230: 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ses like this:.*
2240: 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
2250: 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
2260: 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
2270: 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a  .b AND t1.x=5.**
2280: 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20 63 6c  .** The where cl
2290: 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20 64 65  ause needs to de
22a0: 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67  fer the handling
22b0: 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a   of the t1.x=5.*
22c0: 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61 66 74  * term until aft
22d0: 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f  er the t2 loop o
22e0: 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20  f the join.  In 
22f0: 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e  that way, a.** N
2300: 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c 6c 20  ULL t2 row will 
2310: 62 65 20 69 6e 73 65 72 74 65 64 20 77 68 65 6e  be inserted when
2320: 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20 20 49  ever t1.x!=5.  I
2330: 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64  f we do not.** d
2340: 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69 6e  efer the handlin
2350: 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69 74 20  g of t1.x=5, it 
2360: 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65  will be processe
2370: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  d immediately.**
2380: 20 61 66 74 65 72 20 74 68 65 20 74 31 20 6c 6f   after the t1 lo
2390: 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69 74 68  op and rows with
23a0: 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65   t1.x!=5 will ne
23b0: 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a  ver appear in.**
23c0: 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77 68 69   the output, whi
23d0: 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63 74 2e  ch is incorrect.
23e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
23f0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72  setJoinExpr(Expr
2400: 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29   *p, int iTable)
2410: 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  {.  while( p ){.
2420: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
2430: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
2440: 69 6e 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67  in);.    p->iRig
2450: 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 69 54  htJoinTable = iT
2460: 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69  able;.    setJoi
2470: 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  nExpr(p->pLeft, 
2480: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d  iTable);.    p =
2490: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
24a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
24b0: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
24c0: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
24d0: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
24e0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
24f0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
2500: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
2510: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
2520: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
2530: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
2540: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
2550: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
2560: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
2570: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73  .**.** The terms
2580: 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
2590: 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  e are contained 
25a0: 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  in the Select.pS
25b0: 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  rc structure..**
25c0: 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74   The left most t
25d0: 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73  able is the firs
25e0: 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63  t entry in Selec
25f0: 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67  t.pSrc.  The rig
2600: 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65  ht-most.** table
2610: 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
2620: 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70  ry.  The join op
2630: 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69  erator is held i
2640: 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a  n the entry to.*
2650: 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75  * the left.  Thu
2660: 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69  s entry 0 contai
2670: 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ns the join oper
2680: 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69  ator for the joi
2690: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74  n between.** ent
26a0: 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41  ries 0 and 1.  A
26b0: 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ny ON or USING c
26c0: 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65  lauses associate
26d0: 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20  d with the join 
26e0: 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61  are.** also atta
26f0: 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
2700: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
2710: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
2720: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
2730: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
2740: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
2750: 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  nt sqliteProcess
2760: 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  Join(Parse *pPar
2770: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
2780: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a0: 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20    /* All tables 
27b0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
27c0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  se */.  int i, j
27d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27e0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
27f0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74  counters */.  st
2800: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2810: 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a  m *pLeft;     /*
2820: 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e   Left table bein
2830: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74  g joined */.  st
2840: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2850: 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a  m *pRight;    /*
2860: 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69   Right table bei
2870: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20  ng joined */..  
2880: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
2890: 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d    pLeft = &pSrc-
28a0: 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20  >a[0];.  pRight 
28b0: 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66  = &pLeft[1];.  f
28c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
28d0: 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69  nSrc-1; i++, pRi
28e0: 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b  ght++, pLeft++){
28f0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66  .    Table *pLef
2900: 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54  tTab = pLeft->pT
2910: 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ab;.    Table *p
2920: 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68  RightTab = pRigh
2930: 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74  t->pTab;.    int
2940: 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69   isOuter;..    i
2950: 66 28 20 70 4c 65 66 74 54 61 62 3d 3d 30 20 7c  f( pLeftTab==0 |
2960: 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 20 29  | pRightTab==0 )
2970: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2980: 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67 68 74  sOuter = (pRight
2990: 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
29a0: 4f 55 54 45 52 29 21 3d 30 3b 0a 0a 20 20 20 20  OUTER)!=0;..    
29b0: 2f 2a 20 57 68 65 6e 20 74 68 65 20 4e 41 54 55  /* When the NATU
29c0: 52 41 4c 20 6b 65 79 77 6f 72 64 20 69 73 20 70  RAL keyword is p
29d0: 72 65 73 65 6e 74 2c 20 61 64 64 20 57 48 45 52  resent, add WHER
29e0: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66  E clause terms f
29f0: 6f 72 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20  or.    ** every 
2a00: 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20  column that the 
2a10: 74 77 6f 20 74 61 62 6c 65 73 20 68 61 76 65 20  two tables have 
2a20: 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a  in common..    *
2a30: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
2a40: 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
2a50: 4e 41 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20  NATURAL ){.     
2a60: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e   if( pRight->pOn
2a70: 20 7c 7c 20 70 52 69 67 68 74 2d 3e 70 55 73 69   || pRight->pUsi
2a80: 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ng ){.        sq
2a90: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2aa0: 61 72 73 65 2c 20 22 61 20 4e 41 54 55 52 41 4c  arse, "a NATURAL
2ab0: 20 6a 6f 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61   join may not ha
2ac0: 76 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ve ".           
2ad0: 22 61 6e 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  "an ON or USING 
2ae0: 63 6c 61 75 73 65 22 2c 20 30 29 3b 0a 20 20 20  clause", 0);.   
2af0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2b00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
2b10: 28 6a 3d 30 3b 20 6a 3c 70 4c 65 66 74 54 61 62  (j=0; j<pLeftTab
2b20: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nCol; j++){.  
2b30: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
2b40: 65 20 3d 20 70 4c 65 66 74 54 61 62 2d 3e 61 43  e = pLeftTab->aC
2b50: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol[j].zName;.   
2b60: 20 20 20 20 20 69 66 28 20 63 6f 6c 75 6d 6e 49       if( columnI
2b70: 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20  ndex(pRightTab, 
2b80: 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20  zName)>=0 ){.   
2b90: 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54         addWhereT
2ba0: 65 72 6d 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  erm(pParse, zNam
2bb0: 65 2c 20 70 4c 65 66 74 54 61 62 2c 20 70 4c 65  e, pLeftTab, pLe
2bc0: 66 74 2d 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20  ft->zAlias, .   
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
2bf0: 74 54 61 62 2c 20 70 52 69 67 68 74 2d 3e 7a 41  tTab, pRight->zA
2c00: 6c 69 61 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lias,.          
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c20: 20 20 20 20 70 52 69 67 68 74 2d 3e 69 43 75 72      pRight->iCur
2c30: 73 6f 72 2c 20 26 70 2d 3e 70 57 68 65 72 65 2c  sor, &p->pWhere,
2c40: 20 69 73 4f 75 74 65 72 29 3b 0a 20 20 20 20 20   isOuter);.     
2c50: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a       .        }.
2c60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2c70: 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62     /* Disallow b
2c80: 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  oth ON and USING
2c90: 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20   clauses in the 
2ca0: 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f  same join.    */
2cb0: 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d  .    if( pRight-
2cc0: 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e  >pOn && pRight->
2cd0: 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  pUsing ){.      
2ce0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2cf0: 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20  pParse, "cannot 
2d00: 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64  have both ON and
2d10: 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20   USING ".       
2d20: 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65   "clauses in the
2d30: 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20   same join");.  
2d40: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2d50: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20    }..    /* Add 
2d60: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f  the ON clause to
2d70: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2d80: 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f  WHERE clause, co
2d90: 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a  nnected by.    *
2da0: 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  * an AND operato
2db0: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
2dc0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b  ( pRight->pOn ){
2dd0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75 74  .      if( isOut
2de0: 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72  er ) setJoinExpr
2df0: 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52  (pRight->pOn, pR
2e00: 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  ight->iCursor);.
2e10: 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20        p->pWhere 
2e20: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2e30: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
2e40: 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e  pWhere, pRight->
2e50: 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67  pOn);.      pRig
2e60: 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20  ht->pOn = 0;.   
2e70: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
2e80: 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e  e extra terms on
2e90: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2ea0: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
2eb0: 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69  n named.    ** i
2ec0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
2ed0: 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66  se.  Example: If
2ee0: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
2ef0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65  to be joined are
2f00: 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42   .    ** A and B
2f10: 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63   and the USING c
2f20: 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59  lause names X, Y
2f30: 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64  , and Z, then ad
2f40: 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f  d this.    ** to
2f50: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2f60: 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e  e:    A.X=B.X AN
2f70: 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e  D A.Y=B.Y AND A.
2f80: 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70  Z=B.Z.    ** Rep
2f90: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20  ort an error if 
2fa0: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69  any column menti
2fb0: 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e  oned in the USIN
2fc0: 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20  G clause is.    
2fd0: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64  ** not contained
2fe0: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20   in both tables 
2ff0: 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20  to be joined..  
3000: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69    */.    if( pRi
3010: 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20  ght->pUsing ){. 
3020: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69       IdList *pLi
3030: 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73  st = pRight->pUs
3040: 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  ing;.      for(j
3050: 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; j<pList->nId
3060: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
3070: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 4c  char *zName = pL
3080: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
3090: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 6f 6c  .        if( col
30a0: 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 54 61  umnIndex(pLeftTa
30b0: 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 7c 7c 20 63  b, zName)<0 || c
30c0: 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 52 69 67 68  olumnIndex(pRigh
30d0: 74 54 61 62 2c 20 7a 4e 61 6d 65 29 3c 30 20 29  tTab, zName)<0 )
30e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
30f0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3100: 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e  se, "cannot join
3110: 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73   using column %s
3120: 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20   - column ".    
3130: 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65          "not pre
3140: 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62  sent in both tab
3150: 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  les", zName);.  
3160: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
3170: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3180: 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d      addWhereTerm
3190: 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 2c 20  (pParse, zName, 
31a0: 70 4c 65 66 74 54 61 62 2c 20 70 4c 65 66 74 2d  pLeftTab, pLeft-
31b0: 3e 7a 41 6c 69 61 73 2c 20 0a 20 20 20 20 20 20  >zAlias, .      
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 20 20 20 20 20 20 70 52 69 67 68 74 54 61 62 2c        pRightTab,
31e0: 20 70 52 69 67 68 74 2d 3e 7a 41 6c 69 61 73 2c   pRight->zAlias,
31f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 52 69               pRi
3210: 67 68 74 2d 3e 69 43 75 72 73 6f 72 2c 20 26 70  ght->iCursor, &p
3220: 2d 3e 70 57 68 65 72 65 2c 20 69 73 4f 75 74 65  ->pWhere, isOute
3230: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
3240: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
3250: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
3260: 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76 22 20  t code into "v" 
3270: 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68 20 74  that will push t
3280: 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74 68 65  he record on the
3290: 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a 20 73   top of the.** s
32a0: 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 73 6f  tack into the so
32b0: 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rter..*/.static 
32c0: 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72  void pushOntoSor
32d0: 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ter(.  Parse *pP
32e0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
32f0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
3300: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
3310: 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a 20 54  OrderBy,    /* T
3320: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
3330: 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  se */.  Select *
3340: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20 2f  pSelect,       /
3350: 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45 4c 45  * The whole SELE
3360: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
3370: 20 20 69 6e 74 20 72 65 67 44 61 74 61 20 20 20    int regData   
3380: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
3390: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74  ster holding dat
33a0: 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  a to be sorted *
33b0: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
33c0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
33d0: 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4f    int nExpr = pO
33e0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
33f0: 20 69 6e 74 20 72 65 67 42 61 73 65 20 3d 20 73   int regBase = s
3400: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
3410: 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78 70 72  ge(pParse, nExpr
3420: 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65 67 52 65  +2);.  int regRe
3430: 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
3440: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
3450: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
3460: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
3470: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 72 65  se, pOrderBy, re
3480: 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c  gBase, 0);.  sql
3490: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
34a0: 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70  , OP_Sequence, p
34b0: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
34c0: 72 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72  r, regBase+nExpr
34d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
34e0: 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
34f0: 20 72 65 67 44 61 74 61 2c 20 72 65 67 42 61 73   regData, regBas
3500: 65 2b 6e 45 78 70 72 2b 31 2c 20 31 29 3b 0a 20  e+nExpr+1, 1);. 
3510: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3520: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
3530: 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 45  ord, regBase, nE
3540: 78 70 72 20 2b 20 32 2c 20 72 65 67 52 65 63 6f  xpr + 2, regReco
3550: 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
3560: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
3570: 64 78 49 6e 73 65 72 74 2c 20 70 4f 72 64 65 72  dxInsert, pOrder
3580: 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65  By->iECursor, re
3590: 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
35a0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
35b0: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
35c0: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ord);.  sqlite3R
35d0: 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
35e0: 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
35f0: 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20 69 66 28   nExpr+2);.  if(
3600: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
3610: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
3620: 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 69 6e  1, addr2;.    in
3630: 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 66  t iLimit;.    if
3640: 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  ( pSelect->iOffs
3650: 65 74 20 29 7b 0a 20 20 20 20 20 20 69 4c 69 6d  et ){.      iLim
3660: 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f  it = pSelect->iO
3670: 66 66 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65 6c  ffset+1;.    }el
3680: 73 65 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74  se{.      iLimit
3690: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d   = pSelect->iLim
36a0: 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 64  it;.    }.    ad
36b0: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
36c0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
36d0: 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  Zero, iLimit);. 
36e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d  dOp2(v, OP_AddIm
3700: 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a  m, iLimit, -1);.
3710: 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
3720: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
3730: 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 73   OP_Goto);.    s
3740: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
3750: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
3760: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3770: 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c 20  Op1(v, OP_Last, 
3780: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
3790: 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  or);.    sqlite3
37a0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
37b0: 5f 44 65 6c 65 74 65 2c 20 70 4f 72 64 65 72 42  _Delete, pOrderB
37c0: 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20  y->iECursor);.  
37d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
37e0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 32 29 3b  pHere(v, addr2);
37f0: 0a 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 69 4c  .    pSelect->iL
3800: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  imit = 0;.  }.}.
3810: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20  ./*.** Add code 
3820: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
3830: 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69   OFFSET.*/.stati
3840: 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65  c void codeOffse
3850: 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  t(.  Vdbe *v,   
3860: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
3870: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
3880: 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65 63 74  s VM */.  Select
3890: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
38a0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
38b0: 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20  ent being coded 
38c0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
38d0: 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  ue     /* Jump h
38e0: 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20  ere to skip the 
38f0: 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a  current record *
3900: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 69 4f  /.){.  if( p->iO
3910: 66 66 73 65 74 20 26 26 20 69 43 6f 6e 74 69 6e  ffset && iContin
3920: 75 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ue!=0 ){.    int
3930: 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c 69 74   addr;.    sqlit
3940: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3950: 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4f  OP_AddImm, p->iO
3960: 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20 20  ffset, -1);.    
3970: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
3980: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
3990: 66 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73 65 74  fNeg, p->iOffset
39a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
39b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
39c0: 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75  oto, 0, iContinu
39d0: 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  e);.    VdbeComm
39e0: 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20 4f 46  ent((v, "skip OF
39f0: 46 53 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b  FSET records"));
3a00: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3a10: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
3a20: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3a30: 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69  Add code that wi
3a40: 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ll check to make
3a50: 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67 69   sure the N regi
3a60: 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
3a70: 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61  t iMem.** form a
3a80: 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e   distinct entry.
3a90: 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74    iTab is a sort
3aa0: 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68  ing index that h
3ab0: 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a  olds previously.
3ac0: 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74  ** seen combinat
3ad0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61  ions of the N va
3ae0: 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74  lues.  A new ent
3af0: 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54  ry is made in iT
3b00: 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72  ab.** if the cur
3b10: 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72  rent N values ar
3b20: 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  e new..**.** A j
3b30: 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61  ump to addrRepea
3b40: 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68  t is made and th
3b50: 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65  e N+1 values are
3b60: 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
3b70: 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65  .** stack if the
3b80: 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20   top N elements 
3b90: 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74  are not distinct
3ba0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3bb0: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20   codeDistinct(. 
3bc0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
3bd0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
3be0: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
3bf0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
3c00: 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20  int iTab,       
3c10: 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20     /* A sorting 
3c20: 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65  index used to te
3c30: 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e  st for distinctn
3c40: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ess */.  int add
3c50: 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a  rRepeat,    /* J
3c60: 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e  ump to here if n
3c70: 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  ot distinct */. 
3c80: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
3c90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3ca0: 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   elements */.  i
3cb0: 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20  nt iMem         
3cc0: 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65    /* First eleme
3cd0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  nt */.){.  Vdbe 
3ce0: 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20  *v;.  int r1;.. 
3cf0: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
3d00: 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74  be;.  r1 = sqlit
3d10: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
3d20: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
3d30: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
3d40: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d  MakeRecord, iMem
3d50: 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  , N, r1);.  sqli
3d60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
3d70: 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c   OP_Found, iTab,
3d80: 20 61 64 64 72 52 65 70 65 61 74 2c 20 72 31 29   addrRepeat, r1)
3d90: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3da0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
3db0: 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 29  nsert, iTab, r1)
3dc0: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
3dd0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
3de0: 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , r1);.}../*.** 
3df0: 47 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f  Generate an erro
3e00: 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20 61  r message when a
3e10: 20 53 45 4c 45 43 54 20 69 73 20 75 73 65 64 20   SELECT is used 
3e20: 77 69 74 68 69 6e 20 61 20 73 75 62 65 78 70 72  within a subexpr
3e30: 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70  ession.** (examp
3e40: 6c 65 3a 20 20 22 61 20 49 4e 20 28 53 45 4c 45  le:  "a IN (SELE
3e50: 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 6c 65 29  CT * FROM table)
3e60: 22 29 20 62 75 74 20 69 74 20 68 61 73 20 6d 6f  ") but it has mo
3e70: 72 65 20 74 68 61 6e 20 31 20 72 65 73 75 6c 74  re than 1 result
3e80: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 65 20  .** column.  We 
3e90: 64 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75 62  do this in a sub
3ea0: 72 6f 75 74 69 6e 65 20 62 65 63 61 75 73 65 20  routine because 
3eb0: 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73  the error occurs
3ec0: 20 69 6e 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20   in multiple.** 
3ed0: 70 6c 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  places..*/.stati
3ee0: 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 4d 75  c int checkForMu
3ef0: 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
3f00: 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rror(.  Parse *p
3f10: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
3f20: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e 20 2a  Parse context. *
3f30: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
3f40: 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65 73 74  pDest,   /* Dest
3f50: 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c 45 43  ination of SELEC
3f60: 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  T results */.  i
3f70: 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20 20 20  nt nExpr        
3f80: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3f90: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
3fa0: 72 65 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45  returned by SELE
3fb0: 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65  CT */.){.  int e
3fc0: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
3fd0: 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78 70 72  est;.  if( nExpr
3fe0: 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d 53 52  >1 && (eDest==SR
3ff0: 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d  T_Mem || eDest==
4000: 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20 20 20  SRT_Set) ){.    
4010: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4020: 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20 61 20  pParse, "only a 
4030: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 61 6c  single result al
4040: 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20 20 20  lowed for ".    
4050: 20 20 20 22 61 20 53 45 4c 45 43 54 20 74 68 61     "a SELECT tha
4060: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
4070: 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a 20 20  expression");.  
4080: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65    return 1;.  }e
4090: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
40a0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
40b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e  This routine gen
40c0: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
40d0: 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f  for the inside o
40e0: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
40f0: 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e  .** of a SELECT.
4100: 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62  .**.** If srcTab
4110: 20 61 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65   and nColumn are
4120: 20 62 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e   both zero, then
4130: 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72   the pEList expr
4140: 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65  essions.** are e
4150: 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65  valuated in orde
4160: 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74  r to get the dat
4170: 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20  a for this row. 
4180: 20 49 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a   If nColumn>0.**
4190: 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75   then data is pu
41a0: 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62  lled from srcTab
41b0: 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75   and pEList is u
41c0: 73 65 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20  sed only to get 
41d0: 74 68 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73  the.** datatypes
41e0: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
41f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4200: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
4210: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4220: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
4230: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
4240: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
4250: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4260: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
4270: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
4280: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
4290: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
42a0: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
42b0: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
42c0: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
42d0: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
42e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
42f0: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
4300: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
4310: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
4320: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
4330: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f  olumns in the so
4340: 75 72 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20  urce table */.  
4350: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
4360: 42 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  By,     /* If no
4370: 74 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73  t NULL, sort res
4380: 75 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20  ults using this 
4390: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 69 73  key */.  int dis
43a0: 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20 20  tinct,          
43b0: 20 2f 2a 20 49 66 20 3e 3d 30 2c 20 6d 61 6b 65   /* If >=0, make
43c0: 20 73 75 72 65 20 72 65 73 75 6c 74 73 20 61 72   sure results ar
43d0: 65 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  e distinct */.  
43e0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
43f0: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
4400: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
4410: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
4420: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
4430: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4440: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
4450: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
4460: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
4470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
4480: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
4490: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
44a0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
44b0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
44c0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
44d0: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
44e0: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
44f0: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
4500: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
4510: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sent */.  int re
4520: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
4530: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
4540: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
4550: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
4560: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
4570: 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20  st->eDest;   /* 
4580: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
4590: 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  f results */.  i
45a0: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
45b0: 2d 3e 69 50 61 72 6d 3b 20 20 20 2f 2a 20 46 69  ->iParm;   /* Fi
45c0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
45d0: 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
45e0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  */.  int nResult
45f0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
4600: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
4610: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
4620: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
4630: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
4640: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68  pEList!=0 );.  h
4650: 61 73 44 69 73 74 69 6e 63 74 20 3d 20 64 69 73  asDistinct = dis
4660: 74 69 6e 63 74 3e 3d 30 3b 0a 20 20 69 66 28 20  tinct>=0;.  if( 
4670: 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 21  pOrderBy==0 && !
4680: 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  hasDistinct ){. 
4690: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
46a0: 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a   p, iContinue);.
46b0: 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74    }..  /* Pull t
46c0: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
46d0: 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  umns..  */.  if(
46e0: 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20   nColumn>0 ){.  
46f0: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 6e    nResultCol = n
4700: 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65 6c 73 65 7b  Column;.  }else{
4710: 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20  .    nResultCol 
4720: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
4730: 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 65 73 74  .  }.  if( pDest
4740: 2d 3e 69 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20  ->iMem==0 ){.   
4750: 20 70 44 65 73 74 2d 3e 69 4d 65 6d 20 3d 20 70   pDest->iMem = p
4760: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
4770: 20 20 20 70 44 65 73 74 2d 3e 6e 4d 65 6d 20 3d     pDest->nMem =
4780: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20   nResultCol;.   
4790: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
47a0: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
47b0: 65 6c 73 65 20 69 66 28 20 70 44 65 73 74 2d 3e  else if( pDest->
47c0: 6e 4d 65 6d 21 3d 6e 52 65 73 75 6c 74 43 6f 6c  nMem!=nResultCol
47d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
47e0: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 77 6f  happens when two
47f0: 20 53 45 4c 45 43 54 73 20 6f 66 20 61 20 63 6f   SELECTs of a co
4800: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 68 61  mpound SELECT ha
4810: 76 65 20 64 69 66 66 65 72 69 6e 67 0a 20 20 20  ve differing.   
4820: 20 2a 2a 20 6e 75 6d 62 65 72 73 20 6f 66 20 72   ** numbers of r
4830: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 20  esult columns.  
4840: 54 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  The error messag
4850: 65 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61  e will be genera
4860: 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61 20  ted by.    ** a 
4870: 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75  higher-level rou
4880: 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 72 65 74  tine. */.    ret
4890: 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65  urn;.  }.  regRe
48a0: 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 4d  sult = pDest->iM
48b0: 65 6d 3b 0a 20 20 69 66 28 20 6e 43 6f 6c 75 6d  em;.  if( nColum
48c0: 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  n>0 ){.    for(i
48d0: 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69  =0; i<nColumn; i
48e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
48f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
4900: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61  OP_Column, srcTa
4910: 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b  b, i, regResult+
4920: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  i);.    }.  }els
4930: 65 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54  e if( eDest!=SRT
4940: 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f  _Exists ){.    /
4950: 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
4960: 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54  tion is an EXIST
4970: 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f  S(...) expressio
4980: 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20  n, the actual.  
4990: 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75    ** values retu
49a0: 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45  rned by the SELE
49b0: 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69  CT are not requi
49c0: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
49d0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
49e0: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
49f0: 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c  pEList, regResul
4a00: 74 2c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t, eDest==SRT_Ou
4a10: 74 70 75 74 29 3b 0a 20 20 7d 0a 20 20 6e 43 6f  tput);.  }.  nCo
4a20: 6c 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74 43 6f  lumn = nResultCo
4a30: 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  l;..  /* If the 
4a40: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
4a50: 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20   was present on 
4a60: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
4a70: 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ment.  ** and th
4a80: 69 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20  is row has been 
4a90: 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65  seen before, the
4aa0: 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68  n do not make th
4ab0: 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74  is row.  ** part
4ac0: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   of the result..
4ad0: 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69    */.  if( hasDi
4ae0: 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 61 73  stinct ){.    as
4af0: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
4b00: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
4b10: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 6e 43  EList->nExpr==nC
4b20: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 63 6f 64  olumn );.    cod
4b30: 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65  eDistinct(pParse
4b40: 2c 20 64 69 73 74 69 6e 63 74 2c 20 69 43 6f 6e  , distinct, iCon
4b50: 74 69 6e 75 65 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  tinue, nColumn, 
4b60: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
4b70: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
4b80: 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66 66  ){.      codeOff
4b90: 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69  set(v, p, iConti
4ba0: 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nue);.    }.  }.
4bb0: 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d  .  if( checkForM
4bc0: 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74  ultiColumnSelect
4bd0: 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44  Error(pParse, pD
4be0: 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  est, pEList->nEx
4bf0: 70 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  pr) ){.    retur
4c00: 6e 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  n;.  }..  switch
4c10: 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f  ( eDest ){.    /
4c20: 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20  * In this mode, 
4c30: 77 72 69 74 65 20 65 61 63 68 20 71 75 65 72 79  write each query
4c40: 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b   result to the k
4c50: 65 79 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  ey of the tempor
4c60: 61 72 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  ary.    ** table
4c70: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23   iParm..    */.#
4c80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4c90: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
4ca0: 43 54 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  CT.    case SRT_
4cb0: 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69  Union: {.      i
4cc0: 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20  nt r1;.      r1 
4cd0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
4ce0: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
4cf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
4d00: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
4d10: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
4d20: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a  , nColumn, r1);.
4d30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
4d40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
4d50: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
4d60: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
4d70: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
4d80: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
4d90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4da0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75  ..    /* Constru
4db0: 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d  ct a record from
4dc0: 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
4dd0: 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f  t, but instead o
4de0: 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20  f.    ** saving 
4df0: 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65  that record, use
4e00: 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20   it as a key to 
4e10: 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20  delete elements 
4e20: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
4e30: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
4e40: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  iParm..    */.  
4e50: 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70    case SRT_Excep
4e60: 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t: {.      sqlit
4e70: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
4e80: 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50  OP_IdxDelete, iP
4e90: 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  arm, regResult, 
4ea0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
4eb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
4ec0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72  dif..    /* Stor
4ed0: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
4ee0: 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
4ef0: 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
4f00: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
4f10: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
4f20: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
4f30: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
4f40: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
4f50: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
4f60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
4f70: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
4f80: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c   regResult, nCol
4f90: 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  umn, r1);.      
4fa0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
4fb0: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
4fc0: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
4fd0: 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b  OrderBy, p, r1);
4fe0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4ff0: 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
5000: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
5010: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
5020: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5030: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
5040: 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a  id, iParm, r2);.
5050: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5060: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
5070: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
5080: 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  1, r2);.        
5090: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
50a0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
50b0: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73  PEND);.        s
50c0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
50d0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
50e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
50f0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
5100: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
5110: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5120: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
5130: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
5140: 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  ERY.    /* If we
5150: 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20   are creating a 
5160: 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72  set for an "expr
5170: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
5180: 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20  " construct,.   
5190: 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73   ** then there s
51a0: 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c  hould be a singl
51b0: 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  e item on the st
51c0: 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73  ack.  Write this
51d0: 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74  .    ** item int
51e0: 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20  o the set table 
51f0: 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e  with bogus data.
5200: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5210: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
5220: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
5230: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  n==1 );.      p-
5240: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
5250: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
5260: 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  ty(pEList->a[0].
5270: 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66  pExpr, pDest->af
5280: 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20 69  finity);.      i
5290: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
52a0: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72         /* At fir
52b0: 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f  st glance you wo
52c0: 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75  uld think we cou
52d0: 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20  ld optimize out 
52e0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  the.        ** O
52f0: 52 44 45 52 20 42 59 20 69 6e 20 74 68 69 73 20  RDER BY in this 
5300: 63 61 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f  case since the o
5310: 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  rder of entries 
5320: 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20 20 20  in the set.     
5330: 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d     ** does not m
5340: 61 74 74 65 72 2e 20 20 42 75 74 20 74 68 65 72  atter.  But ther
5350: 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d  e might be a LIM
5360: 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68  IT clause, in wh
5370: 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  ich.        ** c
5380: 61 73 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f  ase the order do
5390: 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20  es matter */.   
53a0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
53b0: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
53c0: 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75  erBy, p, regResu
53d0: 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lt);.      }else
53e0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31  {.        int r1
53f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
5400: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
5410: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5420: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
5430: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
5440: 75 6c 74 2c 20 31 2c 20 72 31 2c 20 26 70 2d 3e  ult, 1, r1, &p->
5450: 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
5460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
5470: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
5480: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
5490: 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20  Result, 1);.    
54a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
54b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
54c0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
54d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
54e0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
54f0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
5500: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
5510: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
5520: 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73   If any row exis
5530: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
5540: 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74  set, record that
5550: 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e   fact and abort.
5560: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5570: 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20   SRT_Exists: {. 
5580: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5590: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
55a0: 65 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b  eger, 1, iParm);
55b0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
55c0: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
55d0: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
55e0: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
55f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5600: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
5610: 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65  is a scalar sele
5620: 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20  ct that is part 
5630: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
5640: 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74  , then.    ** st
5650: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
5660: 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  in the appropria
5670: 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  te memory cell a
5680: 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20  nd break out.   
5690: 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20   ** of the scan 
56a0: 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
56b0: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
56c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
56d0: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
56e0: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
56f0: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
5700: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
5710: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72  , pOrderBy, p, r
5720: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
5730: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5740: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
5750: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  ove(pParse, regR
5760: 65 73 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31 29  esult, iParm, 1)
5770: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
5780: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
5790: 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
57a0: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
57b0: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
57c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
57d0: 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
57e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
57f0: 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ERY */..    /* S
5800: 65 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f 20  end the data to 
5810: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  the callback fun
5820: 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75  ction or to a su
5830: 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68  broutine.  In th
5840: 65 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66  e.    ** case of
5850: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74   a subroutine, t
5860: 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74  he subroutine it
5870: 73 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69  self is responsi
5880: 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70  ble for.    ** p
5890: 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 20  opping the data 
58a0: 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a  from the stack..
58b0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
58c0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 0a 20  SRT_Coroutine:. 
58d0: 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70     case SRT_Outp
58e0: 75 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ut: {.      if( 
58f0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
5900: 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
5910: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
5920: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
5930: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5940: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
5950: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
5960: 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20  Column, r1);.   
5970: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
5980: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
5990: 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20  erBy, p, r1);.  
59a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
59b0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
59c0: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d  se, r1);.      }
59d0: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d  else if( eDest==
59e0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b  SRT_Coroutine ){
59f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5a00: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
5a10: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
5a20: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Parm);.      }el
5a30: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
5a40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5a50: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72   OP_ResultRow, r
5a60: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5a70: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
5a80: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
5a90: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
5aa0: 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  e, regResult, nC
5ab0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  olumn);.      }.
5ac0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5ad0: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
5ae0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
5af0: 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73  GGER).    /* Dis
5b00: 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73  card the results
5b10: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
5b20: 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
5b30: 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20  ments inside.   
5b40: 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20   ** the body of 
5b50: 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20  a TRIGGER.  The 
5b60: 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20  purpose of such 
5b70: 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61  selects is to ca
5b80: 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64  ll.    ** user-d
5b90: 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
5ba0: 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20   that have side 
5bb0: 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20  effects.  We do 
5bc0: 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20  not care.    ** 
5bd0: 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c  about the actual
5be0: 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
5bf0: 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20  select..    */. 
5c00: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5c10: 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73      assert( eDes
5c20: 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29  t==SRT_Discard )
5c30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5c40: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
5c50: 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68  .  /* Jump to th
5c60: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  e end of the loo
5c70: 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69  p if the LIMIT i
5c80: 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a  s reached..  */.
5c90: 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
5ca0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
5cb0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 20 20 2f  OrderBy==0 );  /
5cc0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
5cd0: 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 63   ORDER BY, the c
5ce0: 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20  all to.         
5cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d00: 20 20 20 2a 2a 20 70 75 73 68 4f 6e 74 6f 53 6f     ** pushOntoSo
5d10: 72 74 65 72 28 29 20 77 6f 75 6c 64 20 68 61 76  rter() would hav
5d20: 65 20 63 6c 65 61 72 65 64 20 70 2d 3e 69 4c 69  e cleared p->iLi
5d30: 6d 69 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  mit */.    sqlit
5d40: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5d50: 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e 69 4c  OP_AddImm, p->iL
5d60: 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 73  imit, -1);.    s
5d70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5d80: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70  (v, OP_IfZero, p
5d90: 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b  ->iLimit, iBreak
5da0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5db0: 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73  Given an express
5dc0: 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61  ion list, genera
5dd0: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  te a KeyInfo str
5de0: 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f  ucture that reco
5df0: 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61  rds.** the colla
5e00: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
5e10: 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  r each expressio
5e20: 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  n in that expres
5e30: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  sion list..**.**
5e40: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
5e50: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
5e60: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
5e70: 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  se then the resu
5e80: 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f  lting.** KeyInfo
5e90: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
5ea0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
5eb0: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
5ec0: 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a  tual index to.**
5ed0: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20   implement that 
5ee0: 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20  clause.  If the 
5ef0: 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20  ExprList is the 
5f00: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
5f10: 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74  SELECT.** then t
5f20: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
5f30: 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69  ture is appropri
5f40: 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69  ate for initiali
5f50: 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a  zing a virtual.*
5f60: 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65  * index to imple
5f70: 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20  ment a DISTINCT 
5f80: 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  test..**.** Spac
5f90: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65  e to hold the Ke
5fa0: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
5fb0: 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20 6d  is obtain from m
5fc0: 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c  alloc.  The call
5fd0: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ing.** function 
5fe0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
5ff0: 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20 74  or seeing that t
6000: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
6010: 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
6020: 72 65 65 64 2e 20 20 41 64 64 20 74 68 65 20 4b  reed.  Add the K
6030: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
6040: 20 74 6f 20 74 68 65 20 50 34 20 66 69 65 6c 64   to the P4 field
6050: 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75 73   of an opcode us
6060: 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49 4e 46  ing.** P4_KEYINF
6070: 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68 65  O_HANDOFF is the
6080: 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64 65   usual way of de
6090: 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73 2e  aling with this.
60a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e  .*/.static KeyIn
60b0: 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  fo *keyInfoFromE
60c0: 78 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a 70  xprList(Parse *p
60d0: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
60e0: 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69 74  *pList){.  sqlit
60f0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
6100: 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72  >db;.  int nExpr
6110: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e  ;.  KeyInfo *pIn
6120: 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  fo;.  struct Exp
6130: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
6140: 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e  m;.  int i;..  n
6150: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  Expr = pList->nE
6160: 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73  xpr;.  pInfo = s
6170: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
6180: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
6190: 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28 73  Info) + nExpr*(s
61a0: 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
61b0: 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 66  1) );.  if( pInf
61c0: 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  o ){.    pInfo->
61d0: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
61e0: 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  *)&pInfo->aColl[
61f0: 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e 66  nExpr];.    pInf
6200: 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78 70  o->nField = nExp
6210: 72 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 65 6e  r;.    pInfo->en
6220: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20  c = ENC(db);.   
6230: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
6240: 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70  pList->a; i<nExp
6250: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
6260: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
6270: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
6280: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
6290: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
62a0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
62b0: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
62c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
62d0: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
62e0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
62f0: 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d   pInfo->aColl[i]
6300: 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
6310: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
6320: 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f  r[i] = pItem->so
6330: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20  rtOrder;.    }. 
6340: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66   }.  return pInf
6350: 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  o;.}.../*.** If 
6360: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
6370: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
6380: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
6390: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
63a0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
63b0: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
63c0: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
63d0: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
63e0: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
63f0: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
6400: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
6410: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
6420: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
6430: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
6440: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
6450: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
6460: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6470: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
6480: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6490: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
64a0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
64b0: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
64c0: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
64d0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62  atement */.  Vdb
64e0: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
64f0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
6500: 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  into this VDBE *
6510: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
6520: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6530: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  of columns of da
6540: 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ta */.  SelectDe
6550: 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69  st *pDest /* Wri
6560: 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65  te the sorted re
6570: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
6580: 0a 20 20 69 6e 74 20 62 72 6b 20 3d 20 73 71 6c  .  int brk = sql
6590: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
65a0: 6c 28 76 29 3b 0a 20 20 69 6e 74 20 63 6f 6e 74  l(v);.  int cont
65b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
65c0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69 6e  keLabel(v);.  in
65d0: 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69 54  t addr;.  int iT
65e0: 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64 6f  ab;.  int pseudo
65f0: 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c  Tab = 0;.  ExprL
6600: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
6610: 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20  p->pOrderBy;..  
6620: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
6630: 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20  t->eDest;.  int 
6640: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
6650: 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20 72 65 67  Parm;..  int reg
6660: 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f  Row;.  int regRo
6670: 77 69 64 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70  wid;..  iTab = p
6680: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
6690: 72 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d  r;.  if( eDest==
66a0: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
66b0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
66c0: 6e 65 20 29 7b 0a 20 20 20 20 70 73 65 75 64 6f  ne ){.    pseudo
66d0: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
66e0: 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  ab++;.    sqlite
66f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6700: 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c  P_SetNumColumns,
6710: 20 30 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20   0, nColumn);.  
6720: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6730: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op2(v, OP_OpenPs
6740: 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61 62 2c  eudo, pseudoTab,
6750: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
6760: 75 74 29 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20  ut);.  }.  addr 
6770: 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
6780: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
6790: 72 74 2c 20 69 54 61 62 2c 20 62 72 6b 29 3b 0a  rt, iTab, brk);.
67a0: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
67b0: 70 2c 20 63 6f 6e 74 29 3b 0a 20 20 72 65 67 52  p, cont);.  regR
67c0: 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ow = sqlite3GetT
67d0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
67e0: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c    regRowid = sql
67f0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
6800: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
6810: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6820: 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  P_Column, iTab, 
6830: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
6840: 2b 20 31 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  + 1, regRow);.  
6850: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
6860: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
6870: 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
6880: 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
6890: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
68a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
68b0: 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67  owid, iParm, reg
68c0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
68d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
68e0: 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50  v, OP_Insert, iP
68f0: 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67  arm, regRow, reg
6900: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71  Rowid);.      sq
6910: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
6920: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
6930: 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ND);.      break
6940: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
6950: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
6960: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53 52  UERY.    case SR
6970: 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61  T_Set: {.      a
6980: 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d  ssert( nColumn==
6990: 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 );.      sqlit
69a0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
69b0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
69c0: 65 67 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77  egRow, 1, regRow
69d0: 69 64 2c 20 26 70 2d 3e 61 66 66 69 6e 69 74 79  id, &p->affinity
69e0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 1);.      sqli
69f0: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
6a00: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
6a10: 65 2c 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20  e, regRow, 1);. 
6a20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6a30: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
6a40: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
6a50: 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  egRowid);.      
6a60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6a70: 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b   case SRT_Mem: {
6a80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
6a90: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
6aa0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
6ab0: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
6ac0: 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29  egRow, iParm, 1)
6ad0: 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c  ;.      /* The L
6ae0: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
6af0: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
6b00: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
6b10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6b20: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
6b30: 20 53 52 54 5f 4f 75 74 70 75 74 3a 0a 20 20 20   SRT_Output:.   
6b40: 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
6b50: 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ine: {.      int
6b60: 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   i;.      sqlite
6b70: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6b80: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65  P_Integer, 1, re
6b90: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
6ba0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6bb0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
6bc0: 73 65 75 64 6f 54 61 62 2c 20 72 65 67 52 6f 77  seudoTab, regRow
6bd0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
6be0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
6bf0: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
6c00: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67       assert( reg
6c10: 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69 4d 65 6d  Row!=pDest->iMem
6c20: 2b 69 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  +i );.        sq
6c30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6c40: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73  v, OP_Column, ps
6c50: 65 75 64 6f 54 61 62 2c 20 69 2c 20 70 44 65 73  eudoTab, i, pDes
6c60: 74 2d 3e 69 4d 65 6d 2b 69 29 3b 0a 20 20 20 20  t->iMem+i);.    
6c70: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44    }.      if( eD
6c80: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
6c90: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6ca0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6cb0: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44  OP_ResultRow, pD
6cc0: 65 73 74 2d 3e 69 4d 65 6d 2c 20 6e 43 6f 6c 75  est->iMem, nColu
6cd0: 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mn);.        sql
6ce0: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
6cf0: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
6d00: 73 65 2c 20 70 44 65 73 74 2d 3e 69 4d 65 6d 2c  se, pDest->iMem,
6d10: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
6d20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6d30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6d40: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
6d50: 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b 0a 20 20  Dest->iParm);.  
6d60: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
6d70: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
6d80: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
6d90: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
6da0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6db0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
6dc0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
6dd0: 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20  arse, regRow);. 
6de0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
6df0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
6e00: 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20  egRowid);..  /* 
6e10: 4c 49 4d 49 54 20 68 61 73 20 62 65 65 6e 20 69  LIMIT has been i
6e20: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74 68  mplemented by th
6e30: 65 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72  e pushOntoSorter
6e40: 28 29 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f  () routine..  */
6e50: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 4c  .  assert( p->iL
6e60: 69 6d 69 74 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  imit==0 );..  /*
6e70: 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   The bottom of t
6e80: 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  he loop.  */.  s
6e90: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
6ea0: 65 4c 61 62 65 6c 28 76 2c 20 63 6f 6e 74 29 3b  eLabel(v, cont);
6eb0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
6ec0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
6ed0: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20   iTab, addr);.  
6ee0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
6ef0: 76 65 4c 61 62 65 6c 28 76 2c 20 62 72 6b 29 3b  veLabel(v, brk);
6f00: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
6f10: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
6f20: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
6f30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
6f40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6f50: 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54 61 62  Close, pseudoTab
6f60: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 7d 0a 0a 2f 2a  , 0);.  }..}../*
6f70: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
6f80: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
6f90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
6fa0: 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70  'declaration typ
6fb0: 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  e' of the.** exp
6fc0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54  ression pExpr. T
6fd0: 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65  he string may be
6fe0: 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74   treated as stat
6ff0: 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ic by the caller
7000: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c  ..**.** The decl
7010: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20  aration type is 
7020: 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79  the exact dataty
7030: 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78  pe definition ex
7040: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
7050: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45  .** original CRE
7060: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7070: 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ent if the expre
7080: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
7090: 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72  n. The.** declar
70a0: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
70b0: 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20   ROWID field is 
70c0: 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79  INTEGER. Exactly
70d0: 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73   when an express
70e0: 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  ion.** is consid
70f0: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61  ered a column ca
7100: 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20  n be complex in 
7110: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
7120: 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a  subqueries. The.
7130: 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  ** result-set ex
7140: 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20  pression in all 
7150: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
7160: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
7170: 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64  ts is .** consid
7180: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79  ered a column by
7190: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
71a0: 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
71b0: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
71c0: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
71d0: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
71e0: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
71f0: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29  CT col FROM tbl)
7200: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62  ;.**   SELECT ab
7210: 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63  c FROM (SELECT c
7220: 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74  ol AS abc FROM t
7230: 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  bl);.** .** The 
7240: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
7250: 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73   for any express
7260: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ion other than a
7270: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e   column is NULL.
7280: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
7290: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
72a0: 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  e(.  NameContext
72b0: 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a   *pNC, .  Expr *
72c0: 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63  pExpr,.  const c
72d0: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e 44 62  har **pzOriginDb
72e0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
72f0: 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a 20 20  *pzOriginTab,.  
7300: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
7310: 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20 63 68  riginCol.){.  ch
7320: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20  ar const *zType 
7330: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
7340: 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d 20 30  t *zOriginDb = 0
7350: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
7360: 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30 3b 0a  zOriginTab = 0;.
7370: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
7380: 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  riginCol = 0;.  
7390: 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 70 45 78  int j;.  if( pEx
73a0: 70 72 3d 3d 30 20 7c 7c 20 70 4e 43 2d 3e 70 53  pr==0 || pNC->pS
73b0: 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75  rcList==0 ) retu
73c0: 72 6e 20 30 3b 0a 0a 20 20 73 77 69 74 63 68 28  rn 0;..  switch(
73d0: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
73e0: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
73f0: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
7400: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
7410: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
7420: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
7430: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
7440: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  e the column is 
7450: 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65  being.      ** e
7460: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e  xtracted from in
7470: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72   NameContext.pSr
7480: 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c  cList. This tabl
7490: 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20  e may be real.  
74a0: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
74b0: 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75  table or a subqu
74c0: 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ery..      */.  
74d0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
74e0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
74f0: 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  /* Table structu
7500: 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  re column is ext
7510: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
7520: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
7530: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
7540: 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63   /* Select the c
7550: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
7560: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
7570: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
7580: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20  r->iColumn;  /* 
7590: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
75a0: 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20  in pTab */.     
75b0: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21   while( pNC && !
75c0: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
75d0: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
75e0: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
75f0: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  t;.        for(j
7600: 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  =0;j<pTabList->n
7610: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
7620: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
7630: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b  Expr->iTable;j++
7640: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
7650: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
7660: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
7670: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
7680: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  j].pTab;.       
7690: 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74     pS = pTabList
76a0: 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[j].pSelect;.
76b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
76c0: 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70           pNC = p
76d0: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  NC->pNext;.     
76e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
76f0: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
7700: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 49  ){.        /* FI
7710: 58 20 4d 45 3a 0a 20 20 20 20 20 20 20 20 2a 2a  X ME:.        **
7720: 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75 72 73   This can occurs
7730: 20 69 66 20 79 6f 75 20 68 61 76 65 20 73 6f 6d   if you have som
7740: 65 74 68 69 6e 67 20 6c 69 6b 65 20 22 53 45 4c  ething like "SEL
7750: 45 43 54 20 6e 65 77 2e 78 3b 22 20 69 6e 73 69  ECT new.x;" insi
7760: 64 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  de.        ** a 
7770: 74 72 69 67 67 65 72 2e 20 20 49 6e 20 6f 74 68  trigger.  In oth
7780: 65 72 20 77 6f 72 64 73 2c 20 69 66 20 79 6f 75  er words, if you
7790: 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
77a0: 70 65 63 69 61 6c 20 22 6e 65 77 22 0a 20 20 20  pecial "new".   
77b0: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 6e       ** table in
77c0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
77d0: 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 57 65  of a select.  We
77e0: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 67   do not have a g
77f0: 6f 6f 64 20 77 61 79 0a 20 20 20 20 20 20 20 20  ood way.        
7800: 2a 2a 20 74 6f 20 66 69 6e 64 20 74 68 65 20 61  ** to find the a
7810: 63 74 75 61 6c 20 74 61 62 6c 65 20 74 79 70 65  ctual table type
7820: 2c 20 73 6f 20 63 61 6c 6c 20 69 74 20 22 54 45  , so call it "TE
7830: 58 54 22 2e 20 20 54 68 69 73 20 69 73 20 72 65  XT".  This is re
7840: 61 6c 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  ally.        ** 
7850: 73 6f 6d 65 74 68 69 6e 67 20 6f 66 20 61 20 62  something of a b
7860: 75 67 2c 20 62 75 74 20 49 20 64 6f 20 6e 6f 74  ug, but I do not
7870: 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 66 69 78   know how to fix
7880: 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a   it..        **.
7890: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
78a0: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 70 72  code does not pr
78b0: 6f 64 75 63 65 20 74 68 65 20 63 6f 72 72 65 63  oduce the correc
78c0: 74 20 61 6e 73 77 65 72 20 2d 20 69 74 20 6a 75  t answer - it ju
78d0: 73 74 20 70 72 65 76 65 6e 74 73 0a 20 20 20 20  st prevents.    
78e0: 20 20 20 20 2a 2a 20 61 20 73 65 67 66 61 75 6c      ** a segfaul
78f0: 74 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23  t.  See ticket #
7900: 31 32 32 39 2e 0a 20 20 20 20 20 20 20 20 2a 2f  1229..        */
7910: 0a 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d  .        zType =
7920: 20 22 54 45 58 54 22 3b 0a 20 20 20 20 20 20 20   "TEXT";.       
7930: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
7940: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
7950: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Tab );.      if(
7960: 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   pS ){.        /
7970: 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73  * The "table" is
7980: 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d   actually a sub-
7990: 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77  select or a view
79a0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
79b0: 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  use.        ** o
79c0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
79d0: 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74  tement. Return t
79e0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
79f0: 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20  ype and origin. 
7a00: 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66         ** data f
7a10: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  or the result-se
7a20: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
7a30: 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20  sub-select..    
7a40: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
7a50: 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  f( iCol>=0 && iC
7a60: 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<pS->pEList->n
7a70: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
7a80: 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20    /* If iCol is 
7a90: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
7aa0: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
7ab0: 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65  ion requests the
7ac0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  .          ** ro
7ad0: 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73  wid of the sub-s
7ae0: 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54  elect or view. T
7af0: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
7b00: 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20  s legal (see .  
7b10: 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20          ** test 
7b20: 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20  case misc2.2.2) 
7b30: 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c  - it always eval
7b40: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20  uates to NULL.. 
7b50: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
7b60: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
7b70: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  t sNC;.         
7b80: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
7b90: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
7ba0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
7bb0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
7bc0: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20  S->pSrc;.       
7bd0: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30     sNC.pNext = 0
7be0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
7bf0: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
7c00: 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  arse;.          
7c10: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
7c20: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
7c30: 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e  iginDb, &zOrigin
7c40: 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c  Tab, &zOriginCol
7c50: 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ); .        }.  
7c60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
7c70: 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  ab->pSchema ){. 
7c80: 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c         /* A real
7c90: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
7ca0: 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b    assert( !pS );
7cb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
7cc0: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
7cd0: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
7ce0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
7cf0: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
7d00: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
7d10: 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  l) );.        if
7d20: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
7d30: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
7d40: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20  NTEGER";.       
7d50: 20 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20     zOriginCol = 
7d60: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20  "rowid";.       
7d70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7d80: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
7d90: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
7da0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
7db0: 67 69 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61  ginCol = pTab->a
7dc0: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b  Col[iCol].zName;
7dd0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7de0: 20 20 20 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20     zOriginTab = 
7df0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
7e00: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
7e10: 61 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  arse ){.        
7e20: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
7e30: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
7e40: 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62  (pNC->pParse->db
7e50: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
7e60: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
7e70: 67 69 6e 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61  ginDb = pNC->pPa
7e80: 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62  rse->db->aDb[iDb
7e90: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
7ea0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
7eb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
7ec0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7ed0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
7ee0: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
7ef0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
7f00: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75  pression is a su
7f10: 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e  b-select. Return
7f20: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
7f30: 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20   type and.      
7f40: 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66  ** origin info f
7f50: 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f  or the single co
7f60: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
7f70: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
7f80: 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74  LECT.      ** st
7f90: 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  atement..      *
7fa0: 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74  /.      NameCont
7fb0: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53  ext sNC;.      S
7fc0: 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70  elect *pS = pExp
7fd0: 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  r->pSelect;.    
7fe0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e    Expr *p = pS->
7ff0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
8000: 70 72 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53  pr;.      sNC.pS
8010: 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72  rcList = pS->pSr
8020: 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65  c;.      sNC.pNe
8030: 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  xt = pNC;.      
8040: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
8050: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
8060: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
8070: 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72  pe(&sNC, p, &zOr
8080: 69 67 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e  iginDb, &zOrigin
8090: 54 61 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c  Tab, &zOriginCol
80a0: 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
80b0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
80c0: 7d 0a 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69  }.  .  if( pzOri
80d0: 67 69 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73  ginDb ){.    ass
80e0: 65 72 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62  ert( pzOriginTab
80f0: 20 26 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20   && pzOriginCol 
8100: 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e  );.    *pzOrigin
8110: 44 62 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a  Db = zOriginDb;.
8120: 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62      *pzOriginTab
8130: 20 3d 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20   = zOriginTab;. 
8140: 20 20 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20     *pzOriginCol 
8150: 3d 20 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20  = zOriginCol;.  
8160: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65  }.  return zType
8170: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
8180: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
8190: 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45  ll tell the VDBE
81a0: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
81b0: 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   types of column
81c0: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
81d0: 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  lt set..*/.stati
81e0: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43  c void generateC
81f0: 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61  olumnTypes(.  Pa
8200: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
8210: 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74    /* Parser cont
8220: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
8230: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20   *pTabList,  /* 
8240: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a  List of tables *
8250: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
8260: 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65  List    /* Expre
8270: 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20  ssions defining 
8280: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
8290: 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
82a0: 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
82b0: 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  E.  Vdbe *v = pP
82c0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
82d0: 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  nt i;.  NameCont
82e0: 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70  ext sNC;.  sNC.p
82f0: 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
8300: 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65  st;.  sNC.pParse
8310: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72   = pParse;.  for
8320: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
8330: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
8340: 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73   Expr *p = pELis
8350: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
8360: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
8370: 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  Type;.#ifdef SQL
8380: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
8390: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63  N_METADATA.    c
83a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67  onst char *zOrig
83b0: 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  Db = 0;.    cons
83c0: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62  t char *zOrigTab
83d0: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
83e0: 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d  char *zOrigCol =
83f0: 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   0;.    zType = 
8400: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
8410: 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a   p, &zOrigDb, &z
8420: 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43  OrigTab, &zOrigC
8430: 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ol);..    /* The
8440: 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20   vdbe must make 
8450: 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20  its own copy of 
8460: 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20  the column-type 
8470: 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a  and other .    *
8480: 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69  * column specifi
8490: 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61  c strings, in ca
84a0: 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73  se the schema is
84b0: 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68   reset before th
84c0: 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  is.    ** virtua
84d0: 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c  l machine is del
84e0: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
84f0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8500: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
8510: 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a  NAME_DATABASE, z
8520: 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54  OrigDb, SQLITE_T
8530: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
8540: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8550: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8560: 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54  ME_TABLE, zOrigT
8570: 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ab, SQLITE_TRANS
8580: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
8590: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
85a0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43  (v, i, COLNAME_C
85b0: 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c  OLUMN, zOrigCol,
85c0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
85d0: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54  T);.#else.    zT
85e0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
85f0: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
8600: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  0);.#endif.    s
8610: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8620: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8630: 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79  ME_DECLTYPE, zTy
8640: 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  pe, SQLITE_TRANS
8650: 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  IENT);.  }.#endi
8660: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
8670: 5f 44 45 43 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a  _DECLTYPE */.}..
8680: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
8690: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
86a0: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
86b0: 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73  names of columns
86c0: 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c  .** in the resul
86d0: 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66  t set.  This inf
86e0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
86f0: 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a   to provide the.
8700: 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65  ** azCol[] value
8710: 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63  s in the callbac
8720: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
8730: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
8740: 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Names(.  Parse *
8750: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
8760: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
8770: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
8780: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
8790: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
87a0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
87b0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
87c0: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
87d0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
87e0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
87f0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
8800: 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33   i, j;.  sqlite3
8810: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
8820: 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d  b;.  int fullNam
8830: 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a  es, shortNames;.
8840: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8850: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f  OMIT_EXPLAIN.  /
8860: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
8870: 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68  EXPLAIN, skip th
8880: 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28  is step */.  if(
8890: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
88a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
88b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
88c0: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
88d0: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e  if( pParse->colN
88e0: 61 6d 65 73 53 65 74 20 7c 7c 20 76 3d 3d 30 20  amesSet || v==0 
88f0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
8900: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
8910: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
8920: 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e  Set = 1;.  fullN
8930: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
8940: 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
8950: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
8960: 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d  hortNames = (db-
8970: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
8980: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d  ShortColNames)!=
8990: 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  0;.  sqlite3Vdbe
89a0: 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45  SetNumCols(v, pE
89b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
89c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
89d0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
89e0: 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
89f0: 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69   p = pEList->a[i
8a00: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
8a10: 20 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65   p==0 ) continue
8a20: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
8a30: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
8a40: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
8a50: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
8a60: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
8a70: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
8a80: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
8a90: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
8aa0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
8ab0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8ac0: 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  (p->op==TK_COLUM
8ad0: 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  N || p->op==TK_A
8ae0: 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54  GG_COLUMN) && pT
8af0: 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  abList ){.      
8b00: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
8b10: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20     char *zCol;. 
8b20: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
8b30: 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  p->iColumn;.    
8b40: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
8b50: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70  bList->nSrc && p
8b60: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
8b70: 75 72 73 6f 72 21 3d 70 2d 3e 69 54 61 62 6c 65  ursor!=p->iTable
8b80: 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61  ; j++){}.      a
8b90: 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73  ssert( j<pTabLis
8ba0: 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20  t->nSrc );.     
8bb0: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
8bc0: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
8bd0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
8be0: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
8bf0: 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ey;.      assert
8c00: 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69  ( iCol==-1 || (i
8c10: 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Col>=0 && iCol<p
8c20: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20  Tab->nCol) );.  
8c30: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
8c40: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
8c50: 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20   "rowid";.      
8c60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
8c70: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
8c80: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  [iCol].zName;.  
8c90: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8ca0: 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21  !shortNames && !
8cb0: 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20  fullNames ){.   
8cc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8cd0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
8ce0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a   COLNAME_NAME, .
8cf0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
8d00: 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c  te3DbStrNDup(db,
8d10: 20 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e   (char*)p->span.
8d20: 7a 2c 20 70 2d 3e 73 70 61 6e 2e 6e 29 2c 20 53  z, p->span.n), S
8d30: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
8d40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8d50: 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20 28 21 73  fullNames || (!s
8d60: 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 70 54 61  hortNames && pTa
8d70: 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 29 20 29  bList->nSrc>1) )
8d80: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
8d90: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
8da0: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 3b 0a 20     char *zTab;. 
8db0: 0a 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20  .        zTab = 
8dc0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  pTabList->a[j].z
8dd0: 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 69  Alias;.        i
8de0: 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 7c 7c 20  f( fullNames || 
8df0: 7a 54 61 62 3d 3d 30 20 29 20 7a 54 61 62 20 3d  zTab==0 ) zTab =
8e00: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
8e10: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
8e20: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
8e30: 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 2c 20   "%s.%s", zTab, 
8e40: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  zCol);.        s
8e50: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8e60: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
8e70: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
8e80: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
8e90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8ea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8eb0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
8ec0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
8ed0: 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  zCol, SQLITE_TRA
8ee0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
8ef0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8f00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
8f10: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
8f20: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20  LNAME_NAME, .   
8f30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
8f40: 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
8f50: 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 2c 20 70 2d  r*)p->span.z, p-
8f60: 3e 73 70 61 6e 2e 6e 29 2c 20 53 51 4c 49 54 45  >span.n), SQLITE
8f70: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
8f80: 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43  .  }.  generateC
8f90: 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
8fa0: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
8fb0: 69 73 74 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  ist);.}..#ifndef
8fc0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
8fd0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
8fe0: 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  ** Name of the c
8ff0: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74  onnection operat
9000: 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72  or, used for err
9010: 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a  or messages..*/.
9020: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
9030: 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  r *selectOpName(
9040: 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20  int id){.  char 
9050: 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64  *z;.  switch( id
9060: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
9070: 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  ALL:       z = "
9080: 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72  UNION ALL";   br
9090: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
90a0: 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20  _INTERSECT: z = 
90b0: 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62  "INTERSECT";   b
90c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
90d0: 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d  K_EXCEPT:    z =
90e0: 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20   "EXCEPT";      
90f0: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
9100: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20  lt:           z 
9110: 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20  = "UNION";      
9120: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
9130: 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66  turn z;.}.#endif
9140: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
9150: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
9160: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  */../*.** Given 
9170: 61 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  a an expression 
9180: 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72  list (which is r
9190: 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f  eally the list o
91a0: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  f expressions.**
91b0: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72   that form the r
91c0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
91d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29  ELECT statement)
91e0: 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72   compute appropr
91f0: 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  iate.** column n
9200: 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ames for a table
9210: 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64   that would hold
9220: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9230: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  list..**.** All 
9240: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c  column names wil
9250: 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a  l be unique..**.
9260: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  ** Only the colu
9270: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d  mn names are com
9280: 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a  puted.  Column.z
9290: 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  Type, Column.zCo
92a0: 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  ll,.** and other
92b0: 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d   fields of Colum
92c0: 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  n are zeroed..**
92d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
92e0: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
92f0: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
9300: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
9310: 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20  ccurs,.** store 
9320: 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61  NULL in *paCol a
9330: 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61  nd 0 in *pnCol a
9340: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
9350: 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69  _NOMEM..*/.stati
9360: 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75  c int selectColu
9370: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
9380: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9390: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
93a0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
93b0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
93c0: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78  ist,       /* Ex
93d0: 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69  pr list from whi
93e0: 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c  ch to derive col
93f0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
9400: 6e 74 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20  nt *pnCol,      
9410: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
9420: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
9430: 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20  lumns here */.  
9440: 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20  Column **paCol  
9450: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
9460: 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   the new column 
9470: 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  list here */.){.
9480: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
9490: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
94a0: 74 20 69 2c 20 6a 2c 20 63 6e 74 3b 0a 20 20 43  t i, j, cnt;.  C
94b0: 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43  olumn *aCol, *pC
94c0: 6f 6c 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a  ol;.  int nCol;.
94d0: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 63 68 61    Expr *p;.  cha
94e0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  r *zName;.  int 
94f0: 6e 4e 61 6d 65 3b 0a 0a 20 20 2a 70 6e 43 6f 6c  nName;..  *pnCol
9500: 20 3d 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74   = nCol = pEList
9510: 2d 3e 6e 45 78 70 72 3b 0a 20 20 61 43 6f 6c 20  ->nExpr;.  aCol 
9520: 3d 20 2a 70 61 43 6f 6c 20 3d 20 73 71 6c 69 74  = *paCol = sqlit
9530: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
9540: 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30  b, sizeof(aCol[0
9550: 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20  ])*nCol);.  if( 
9560: 61 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  aCol==0 ) return
9570: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9580: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61   for(i=0, pCol=a
9590: 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  Col; i<nCol; i++
95a0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f  , pCol++){.    /
95b0: 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72  * Get an appropr
95c0: 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  iate name for th
95d0: 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a  e column.    */.
95e0: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
95f0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
9600: 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
9610: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68  t==0 || p->pRigh
9620: 74 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 7c 7c  t->token.z==0 ||
9630: 20 70 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65   p->pRight->toke
9640: 6e 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  n.z[0]!=0 );.   
9650: 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45   if( (zName = pE
9660: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
9670: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
9680: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   If the column c
9690: 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c  ontains an "AS <
96a0: 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75  name>" phrase, u
96b0: 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65  se <name> as the
96c0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a   name */.      z
96d0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
96e0: 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65  StrDup(db, zName
96f0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9700: 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 20 3d      Expr *pCol =
9710: 20 70 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   p;.      Table 
9720: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 77 68 69  *pTab;.      whi
9730: 6c 65 28 20 70 43 6f 6c 2d 3e 6f 70 3d 3d 54 4b  le( pCol->op==TK
9740: 5f 44 4f 54 20 29 20 70 43 6f 6c 20 3d 20 70 43  _DOT ) pCol = pC
9750: 6f 6c 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  ol->pRight;.    
9760: 20 20 69 66 28 20 70 43 6f 6c 2d 3e 6f 70 3d 3d    if( pCol->op==
9770: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 28 70 54  TK_COLUMN && (pT
9780: 61 62 20 3d 20 70 43 6f 6c 2d 3e 70 54 61 62 29  ab = pCol->pTab)
9790: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
97a0: 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73  * For columns us
97b0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
97c0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  e name */.      
97d0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f    int iCol = pCo
97e0: 6c 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  l->iColumn;.    
97f0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
9800: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
9810: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  Key;.        zNa
9820: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
9830: 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 0a 20 20  ntf(db, "%s",.  
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
9850: 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61  Col>=0 ? pTab->a
9860: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20  Col[iCol].zName 
9870: 3a 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20  : "rowid");.    
9880: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9890: 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67   /* Use the orig
98a0: 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65  inal text of the
98b0: 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69   column expressi
98c0: 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a  on as its name *
98d0: 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  /.        zName 
98e0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
98f0: 28 64 62 2c 20 22 25 54 22 2c 20 26 70 43 6f 6c  (db, "%T", &pCol
9900: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  ->span);.      }
9910: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
9920: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
9930: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9940: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
9950: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9960: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9970: 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  3Dequote(zName);
9980: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
9990: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  re the column na
99a0: 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49  me is unique.  I
99b0: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f  f the name is no
99c0: 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a  t unique,.    **
99d0: 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65   append a intege
99e0: 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f  r to the name so
99f0: 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73   that it becomes
9a00: 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a   unique..    */.
9a10: 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c      nName = strl
9a20: 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66  en(zName);.    f
9a30: 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b  or(j=cnt=0; j<i;
9a40: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
9a50: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
9a60: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a  aCol[j].zName, z
9a70: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
9a80: 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61      char *zNewNa
9a90: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  me;.        zNam
9aa0: 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20  e[nName] = 0;.  
9ab0: 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d        zNewName =
9ac0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
9ad0: 64 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61  db, "%s:%d", zNa
9ae0: 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20  me, ++cnt);.    
9af0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9b00: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
9b10: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e        zName = zN
9b20: 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  ewName;.        
9b30: 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  j = -1;.        
9b40: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62  if( zName==0 ) b
9b50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
9b60: 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
9b70: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d  ame = zName;.  }
9b80: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
9b90: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69  cFailed ){.    i
9ba0: 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  nt j;.    for(j=
9bb0: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
9bc0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9bd0: 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e  e(db, aCol[j].zN
9be0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
9bf0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9c00: 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61  , aCol);.    *pa
9c10: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e  Col = 0;.    *pn
9c20: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Col = 0;.    ret
9c30: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9c40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
9c50: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
9c60: 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
9c70: 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
9c80: 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
9c90: 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
9ca0: 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
9cb0: 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
9cc0: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
9cd0: 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
9ce0: 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
9cf0: 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
9d00: 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
9d10: 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
9d20: 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
9d30: 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
9d40: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
9d50: 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
9d60: 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
9d70: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
9d80: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9d90: 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
9da0: 74 20 61 6c 6c 20 69 6e 64 65 6e 74 69 66 69 65  t all indentifie
9db0: 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  rs in the SELECT
9dc0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65  .** statement be
9dd0: 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74   resolved..*/.st
9de0: 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
9df0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
9e00: 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72  Collation(.  Par
9e10: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9e20: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9e30: 6e 74 65 78 74 73 20 2a 2f 0a 20 20 69 6e 74 20  ntexts */.  int 
9e40: 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
9e50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
9e60: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 43 6f 6c 75  olumns */.  Colu
9e70: 6d 6e 20 2a 61 43 6f 6c 2c 20 20 20 20 20 20 20  mn *aCol,       
9e80: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
9e90: 75 6d 6e 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  umns */.  Select
9ea0: 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
9eb0: 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74  /* SELECT used t
9ec0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65  o determine type
9ed0: 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
9ee0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
9ef0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
9f00: 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  b;.  NameContext
9f10: 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   sNC;.  Column *
9f20: 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  pCol;.  CollSeq 
9f30: 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b  *pColl;.  int i;
9f40: 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74  .  Expr *p;.  st
9f50: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
9f60: 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65 72 74  em *a;..  assert
9f70: 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ( pSelect!=0 );.
9f80: 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65    assert( (pSele
9f90: 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
9fa0: 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29  F_Resolved)!=0 )
9fb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c  ;.  assert( nCol
9fc0: 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ==pSelect->pELis
9fd0: 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e  t->nExpr || db->
9fe0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
9ff0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
a000: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
a010: 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20  .  memset(&sNC, 
a020: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
a030: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
a040: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
a050: 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e  .  a = pSelect->
a060: 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72  pEList->a;.  for
a070: 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b  (i=0, pCol=aCol;
a080: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43   i<nCol; i++, pC
a090: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61  ol++){.    p = a
a0a0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [i].pExpr;.    p
a0b0: 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c  Col->zType = sql
a0c0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
a0d0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
a0e0: 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 29 3b 0a  , p, 0, 0, 0));.
a0f0: 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69      pCol->affini
a100: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
a110: 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20  Affinity(p);.   
a120: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
a130: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
a140: 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  se, p);.    if( 
a150: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
a160: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c  Col->zColl = sql
a170: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
a180: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
a190: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
a1a0: 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43  ** Given a SELEC
a1b0: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e  T statement, gen
a1c0: 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74  erate a Table st
a1d0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
a1e0: 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65  cribes.** the re
a1f0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74  sult set of that
a200: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c   SELECT..*/.Tabl
a210: 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74  e *sqlite3Result
a220: 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73  SetOfSelect(Pars
a230: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
a240: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
a250: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
a260: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a270: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61  se->db;.  int sa
a280: 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76  vedFlags;..  sav
a290: 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  edFlags = db->fl
a2a0: 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  ags;.  db->flags
a2b0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c   &= ~SQLITE_Full
a2c0: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e  ColNames;.  db->
a2d0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
a2e0: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20  ShortColNames;. 
a2f0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
a300: 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ep(pParse, pSele
a310: 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50  ct, 0);.  if( pP
a320: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
a330: 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  urn 0;.  while( 
a340: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
a350: 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ) pSelect = pSel
a360: 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64  ect->pPrior;.  d
a370: 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64  b->flags = saved
a380: 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20  Flags;.  pTab = 
a390: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
a3a0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
a3b0: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
a3c0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
a3d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
a3e0: 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 70  ab->db = db;.  p
a3f0: 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Tab->nRef = 1;. 
a400: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30   pTab->zName = 0
a410: 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  ;.  selectColumn
a420: 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
a430: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70  arse, pSelect->p
a440: 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
a450: 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
a460: 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c  ;.  selectAddCol
a470: 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
a480: 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
a490: 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43  ->nCol, pTab->aC
a4a0: 6f 6c 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  ol, pSelect);.  
a4b0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
a4c0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
a4d0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
a4e0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
a4f0: 6c 65 28 70 54 61 62 29 3b 0a 20 20 20 20 72 65  le(pTab);.    re
a500: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
a510: 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
a520: 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
a530: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
a540: 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
a550: 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
a560: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
a570: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
a580: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
a590: 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
a5a0: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
a5b0: 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47  /.Vdbe *sqlite3G
a5c0: 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
a5d0: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
a5e0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
a5f0: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a  ;.  if( v==0 ){.
a600: 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e      v = pParse->
a610: 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56  pVdbe = sqlite3V
a620: 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73 65  dbeCreate(pParse
a630: 2d 3e 64 62 29 3b 0a 23 69 66 6e 64 65 66 20 53  ->db);.#ifndef S
a640: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
a650: 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20  .    if( v ){.  
a660: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a670: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61 63  ddOp0(v, OP_Trac
a680: 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
a690: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
a6a0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
a6b0: 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
a6c0: 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
a6d0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
a6e0: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
a6f0: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
a700: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
a710: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
a720: 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  et hold the expr
a730: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
a740: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
a750: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
a760: 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
a770: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
a780: 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
a790: 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
a7a0: 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
a7b0: 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
a7c0: 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
a7d0: 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
a7e0: 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
a7f0: 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
a800: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
a810: 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
a820: 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
a830: 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
a840: 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
a850: 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
a860: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
a870: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
a880: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
a890: 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
a8a0: 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  of iLimit and iO
a8b0: 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
a8c0: 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
a8d0: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
a8e0: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
a8f0: 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64  set.  iLimit and
a900: 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75  .** iOffset shou
a910: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
a920: 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
a930: 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
a940: 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75  s.** (usually bu
a950: 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29  t not always -1)
a960: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
a970: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
a980: 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69  ** Only if pLimi
a990: 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21  t!=0 or pOffset!
a9a0: 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  =0 do the limit 
a9b0: 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
a9c0: 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
a9d0: 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
a9e0: 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
a9f0: 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
aa00: 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
aa10: 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
aa20: 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
aa30: 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
aa40: 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
aa50: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
aa60: 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
aa70: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
aa80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
aa90: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72  lect *p, int iBr
aaa0: 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  eak){.  Vdbe *v 
aab0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  = 0;.  int iLimi
aac0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  t = 0;.  int iOf
aad0: 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72  fset;.  int addr
aae0: 31 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  1;.  if( p->iLim
aaf0: 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  it ) return;..  
ab00: 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20  /* .  ** "LIMIT 
ab10: 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f 77 73  -1" always shows
ab20: 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68 65 72   all rows.  Ther
ab30: 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63  e is some.  ** c
ab40: 6f 6e 74 72 61 76 65 72 73 79 20 61 62 6f 75 74  ontraversy about
ab50: 20 77 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   what the correc
ab60: 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f 75 6c  t behavior shoul
ab70: 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63  d be..  ** The c
ab80: 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
ab90: 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65 74 73  ation interprets
aba0: 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20 6d 65   "LIMIT 0" to me
abb0: 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e  an.  ** no rows.
abc0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
abd0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e  Limit ){.    p->
abe0: 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20  iLimit = iLimit 
abf0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
ac00: 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ;.    v = sqlite
ac10: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
ac20: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
ac30: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
ac40: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
ac50: 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  rse, p->pLimit, 
ac60: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c  iLimit);.    sql
ac70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
ac80: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
ac90: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 56 64 62  iLimit);.    Vdb
aca0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
acb0: 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a  MIT counter"));.
acc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
acd0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp2(v, OP_IfZe
ace0: 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69 42 72 65  ro, iLimit, iBre
acf0: 61 6b 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ak);.  }.  if( p
ad00: 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
ad10: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f   p->iOffset = iO
ad20: 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  ffset = ++pParse
ad30: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20  ->nMem;.    if( 
ad40: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
ad50: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b     pParse->nMem+
ad60: 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  +;   /* Allocate
ad70: 20 61 6e 20 65 78 74 72 61 20 72 65 67 69 73 74   an extra regist
ad80: 65 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66  er for limit+off
ad90: 73 65 74 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  set */.    }.   
ada0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
adb0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
adc0: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
add0: 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  rn;.    sqlite3E
ade0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
adf0: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66  p->pOffset, iOff
ae00: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
ae10: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
ae20: 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66  P_MustBeInt, iOf
ae30: 66 73 65 74 29 3b 0a 20 20 20 20 56 64 62 65 43  fset);.    VdbeC
ae40: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
ae50: 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  ET counter"));. 
ae60: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
ae70: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
ae80: 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65  OP_IfPos, iOffse
ae90: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
aea0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
aeb0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f 66 66  Integer, 0, iOff
aec0: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
aed0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
aee0: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 69 66 28   addr1);.    if(
aef0: 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20   p->pLimit ){.  
af00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
af10: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c  ddOp3(v, OP_Add,
af20: 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74   iLimit, iOffset
af30: 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20  , iOffset+1);.  
af40: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
af50: 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45  (v, "LIMIT+OFFSE
af60: 54 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72  T"));.      addr
af70: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
af80: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
af90: 73 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  s, iLimit);.    
afa0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
afb0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
afc0: 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31  r, -1, iOffset+1
afd0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
afe0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
aff0: 61 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20  addr1);.    }.  
b000: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
b010: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
b020: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52  D_SELECT./*.** R
b030: 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70  eturn the approp
b040: 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20  riate collating 
b050: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
b060: 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
b070: 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  of.** the result
b080: 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d   set for the com
b090: 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61  pound-select sta
b0a0: 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74  tement "p".  Ret
b0b0: 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74  urn NULL if.** t
b0c0: 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f  he column has no
b0d0: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
b0e0: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a  ng sequence..**.
b0f0: 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** The collating
b100: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
b110: 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
b120: 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  t is taken from 
b130: 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  the.** left-most
b140: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c   term of the sel
b150: 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63  ect that has a c
b160: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
b170: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c  e..*/.static Col
b180: 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63  lSeq *multiSelec
b190: 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  tCollSeq(Parse *
b1a0: 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
b1b0: 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  p, int iCol){.  
b1c0: 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20  CollSeq *pRet;. 
b1d0: 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
b1e0: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c  {.    pRet = mul
b1f0: 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
b200: 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f  pParse, p->pPrio
b210: 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73  r, iCol);.  }els
b220: 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b  e{.    pRet = 0;
b230: 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 65 74 3d  .  }.  if( pRet=
b240: 3d 30 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  =0 ){.    pRet =
b250: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
b260: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
b270: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
b280: 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Expr);.  }.  ret
b290: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn pRet;.}.#end
b2a0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
b2b0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
b2c0: 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  T */../* Forward
b2d0: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
b2e0: 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
b2f0: 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50  lectOrderBy(.  P
b300: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
b310: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
b320: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
b330: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
b340: 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
b350: 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
b360: 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
b370: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
b380: 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
b390: 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
b3a0: 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a  results */.);...
b3b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b3c0: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
b3d0: 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ECT./*.** This r
b3e0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
b3f0: 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f   to process a co
b400: 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72  mpound query for
b410: 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72  m from.** two or
b420: 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71   more separate q
b430: 75 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49  ueries using UNI
b440: 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45  ON, UNION ALL, E
b450: 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54  XCEPT, or.** INT
b460: 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22  ERSECT.**.** "p"
b470: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72   points to the r
b480: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65  ight-most of the
b490: 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74   two queries.  t
b4a0: 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a  he query on the.
b4b0: 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50  ** left is p->pP
b4c0: 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20  rior.  The left 
b4d0: 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f  query could also
b4e0: 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71   be a compound q
b4f0: 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68  uery.** in which
b500: 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
b510: 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ne will be calle
b520: 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a  d recursively. .
b530: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
b540: 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71  s of the total q
b550: 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77  uery are to be w
b560: 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65  ritten into a de
b570: 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  stination.** of 
b580: 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20  type eDest with 
b590: 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e  parameter iParm.
b5a0: 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31  .**.** Example 1
b5b0: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68  :  Consider a th
b5c0: 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64  ree-way compound
b5d0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
b5e0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
b5f0: 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   a FROM t1 UNION
b600: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
b610: 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63  2 UNION SELECT c
b620: 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54   FROM t3.**.** T
b630: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73  his statement is
b640: 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f   parsed up as fo
b650: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
b660: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
b670: 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20  3.**      |.**  
b680: 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c      `----->  SEL
b690: 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a  ECT b FROM t2.**
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6b0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
b6c0: 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45      `------>  SE
b6d0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a  LECT a FROM t1.*
b6e0: 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20  *.** The arrows 
b6f0: 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61  in the diagram a
b700: 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74  bove represent t
b710: 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72  he Select.pPrior
b720: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20   pointer..** So 
b730: 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
b740: 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  is called with p
b750: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33   equal to the t3
b760: 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20   query, then.** 
b770: 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74  pPrior will be t
b780: 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d  he t2 query.  p-
b790: 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55  >op will be TK_U
b7a0: 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73  NION in this cas
b7b0: 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20  e..**.** Notice 
b7c0: 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20  that because of 
b7d0: 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70  the way SQLite p
b7e0: 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53  arses compound S
b7f0: 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69  ELECTs, the.** i
b800: 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74  ndividual select
b810: 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66  s always group f
b820: 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
b830: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
b840: 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20   multiSelect(.  
b850: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b860: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
b870: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
b880: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
b890: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
b8a0: 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
b8b0: 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
b8c0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
b8d0: 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
b8e0: 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
b8f0: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
b900: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
b910: 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73  _OK;   /* Succes
b920: 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75  s code from a su
b930: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65  broutine */.  Se
b940: 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20  lect *pPrior;   
b950: 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53      /* Another S
b960: 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c  ELECT immediatel
b970: 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f  y to our left */
b980: 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
b990: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
b9a0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69  rate code to thi
b9b0: 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65  s VDBE */.  Sele
b9c0: 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20  ctDest dest;    
b9d0: 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    /* Alternative
b9e0: 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f   data destinatio
b9f0: 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
ba00: 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20  Delete = 0;  /* 
ba10: 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20  Chain of simple 
ba20: 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74  selects to delet
ba30: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
ba40: 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
ba50: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
ba60: 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b  ion */..  /* Mak
ba70: 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
ba80: 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c  no ORDER BY or L
ba90: 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70  IMIT clause on p
baa0: 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f  rior SELECTs.  O
bab0: 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73  nly.  ** the las
bac0: 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53  t (right-most) S
bad0: 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72  ELECT in the ser
bae0: 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20  ies may have an 
baf0: 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49  ORDER BY or LIMI
bb00: 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  T..  */.  assert
bb10: 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  ( p && p->pPrior
bb20: 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20   );  /* Calling 
bb30: 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74  function guarant
bb40: 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f  ees this much */
bb50: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
bb60: 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  db;.  pPrior = p
bb70: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
bb80: 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67  rt( pPrior->pRig
bb90: 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20 29  htmost!=pPrior )
bba0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
bbb0: 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d  or->pRightmost==
bbc0: 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29 3b  p->pRightmost );
bbd0: 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74  .  dest = *pDest
bbe0: 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
bbf0: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
bc00: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
bc10: 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59  pParse,"ORDER BY
bc20: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
bc30: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
bc40: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
bc50: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
bc60: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
bc70: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
bc80: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
bc90: 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
bca0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
bcb0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
bcc0: 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73  rse,"LIMIT claus
bcd0: 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66  e should come af
bce0: 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72  ter %s not befor
bcf0: 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74  e",.      select
bd00: 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
bd10: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
bd20: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
bd30: 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20  t_end;.  }..  v 
bd40: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
bd50: 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
bd60: 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20  rt( v!=0 );  /* 
bd70: 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79  The VDBE already
bd80: 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c   created by call
bd90: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
bda0: 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
bdb0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d   destination tem
bdc0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20  porary table if 
bdd0: 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20  necessary.  */. 
bde0: 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
bdf0: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
be00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
be10: 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71  pEList );.    sq
be20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
be30: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
be40: 72 61 6c 2c 20 64 65 73 74 2e 69 50 61 72 6d 2c  ral, dest.iParm,
be50: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
be60: 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65  r);.    dest.eDe
be70: 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
be80: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
be90: 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
bea0: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
beb0: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
bec0: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
bed0: 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
bee0: 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
bef0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
bf00: 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
bf10: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28  >pEList );.  if(
bf20: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
bf30: 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r!=pPrior->pELis
bf40: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
bf50: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
bf60: 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
bf70: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
bf80: 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
bf90: 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76      " do not hav
bfa0: 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
bfb0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
bfc0: 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  mns", selectOpNa
bfd0: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
bfe0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
bff0: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
c000: 64 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  d;.  }..  /* Com
c010: 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68  pound SELECTs th
c020: 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  at have an ORDER
c030: 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68   BY clause are h
c040: 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
c050: 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  y..  */.  if( p-
c060: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
c070: 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
c080: 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73  ectOrderBy(pPars
c090: 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
c0a0: 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
c0b0: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c 65   code for the le
c0c0: 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45 4c  ft and right SEL
c0d0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
c0e0: 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28 20 70    */.  switch( p
c0f0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
c100: 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20   TK_ALL: {.     
c110: 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20   int addr = 0;. 
c120: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
c130: 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a  rior->pLimit );.
c140: 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c        pPrior->pL
c150: 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
c160: 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
c170: 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
c180: 66 73 65 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  fset;.      rc =
c190: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
c1a0: 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
c1b0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  dest);.      p->
c1c0: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
c1d0: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
c1e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
c1f0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
c200: 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
c210: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
c220: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
c230: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
c240: 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a  pPrior->iLimit;.
c250: 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74        p->iOffset
c260: 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73   = pPrior->iOffs
c270: 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  et;.      if( p-
c280: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
c290: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
c2a0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
c2b0: 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  P_IfZero, p->iLi
c2c0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 56 64  mit);.        Vd
c2d0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a  beComment((v, "J
c2e0: 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d  ump ahead if LIM
c2f0: 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20  IT reached"));. 
c300: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
c310: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
c320: 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
c330: 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
c340: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
c350: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
c360: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66  pPrior;.      if
c370: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
c380: 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
c390: 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  t_end;.      }. 
c3a0: 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29 7b       if( addr ){
c3b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c3c0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
c3d0: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
c3e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c3f0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  }.    case TK_EX
c400: 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20 54  CEPT:.    case T
c410: 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  K_UNION: {.     
c420: 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20   int unionTab;  
c430: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62    /* Cursor numb
c440: 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72  er of the tempor
c450: 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e  ary table holdin
c460: 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20  g result */.    
c470: 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 20 20 20    int op = 0;   
c480: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
c490: 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73   SRT_ operations
c4a0: 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65 6c   to apply to sel
c4b0: 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 70  f */.      int p
c4c0: 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54  riorOp;     /* T
c4d0: 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f  he SRT_ operatio
c4e0: 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 72  n to apply to pr
c4f0: 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20  ior selects */. 
c500: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69       Expr *pLimi
c510: 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20  t, *pOffset; /* 
c520: 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
c530: 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d  p->nLimit and p-
c540: 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  >nOffset */.    
c550: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
c560: 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e 69    SelectDest uni
c570: 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20 70  ondest;..      p
c580: 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69  riorOp = SRT_Uni
c590: 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65  on;.      if( de
c5a0: 73 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f  st.eDest==priorO
c5b0: 70 20 26 26 20 21 70 2d 3e 70 4c 69 6d 69 74 20  p && !p->pLimit 
c5c0: 26 26 20 21 70 2d 3e 70 4f 66 66 73 65 74 20 29  && !p->pOffset )
c5d0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
c5e0: 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70  can reuse a temp
c5f0: 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65  orary table gene
c600: 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43  rated by a SELEC
c610: 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20  T to our.       
c620: 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20   ** right..     
c630: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
c640: 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 50  ionTab = dest.iP
c650: 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  arm;.      }else
c660: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
c670: 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65  will need to cre
c680: 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70  ate our own temp
c690: 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68  orary table to h
c6a0: 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  old the.        
c6b0: 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ** intermediate 
c6c0: 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20  results..       
c6d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f   */.        unio
c6e0: 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nTab = pParse->n
c6f0: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Tab++;.        a
c700: 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
c710: 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  By==0 );.       
c720: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
c730: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
c740: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75  OpenEphemeral, u
c750: 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
c760: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
c770: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
c780: 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  == -1 );.       
c790: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
c7a0: 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
c7b0: 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73      p->pRightmos
c7c0: 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  t->selFlags |= S
c7d0: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
c7e0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c7f0: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
c800: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
c810: 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20  Code the SELECT 
c820: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75  statements to ou
c830: 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a  r left.      */.
c840: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
c850: 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20  Prior->pOrderBy 
c860: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c870: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
c880: 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72  uniondest, prior
c890: 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20  Op, unionTab);. 
c8a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c8b0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
c8c0: 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65  pPrior, &unionde
c8d0: 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  st);.      if( r
c8e0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
c8f0: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
c900: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  nd;.      }..   
c910: 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63     /* Code the c
c920: 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74  urrent SELECT st
c930: 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2f  atement.      */
c940: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  .      if( p->op
c950: 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a 20  ==TK_EXCEPT ){. 
c960: 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f         op = SRT_
c970: 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d 65  Except;.      }e
c980: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
c990: 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ert( p->op==TK_U
c9a0: 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20 20  NION );.        
c9b0: 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a  op = SRT_Union;.
c9c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
c9d0: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
c9e0: 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
c9f0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
ca00: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
ca10: 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
ca20: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
ca30: 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
ca40: 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65 44      uniondest.eD
ca50: 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20 20  est = op;.      
ca60: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
ca70: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75  ct(pParse, p, &u
ca80: 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
ca90: 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65   /* Query flatte
caa0: 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53  ning in sqlite3S
cab0: 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65  elect() might re
cac0: 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79  fill p->pOrderBy
cad0: 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75  ..      ** Be su
cae0: 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e  re to delete p->
caf0: 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66  pOrderBy, theref
cb00: 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20  ore, to avoid a 
cb10: 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a  memory leak. */.
cb20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
cb30: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
cb40: 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
cb50: 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
cb60: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
cb70: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
cb80: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  r;.      p->pOrd
cb90: 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
cba0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
cbb0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
cbc0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
cbd0: 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
cbe0: 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
cbf0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
cc00: 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >iLimit = 0;.   
cc10: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
cc20: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  0;.      if( rc 
cc30: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
cc40: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
cc50: 3b 0a 20 20 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ;.      }...    
cc60: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
cc70: 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 65 6d   data in the tem
cc80: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 6e 74  porary table int
cc90: 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 0a  o whatever form.
cca0: 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 74        ** it is t
ccb0: 68 61 74 20 77 65 20 63 75 72 72 65 6e 74 6c 79  hat we currently
ccc0: 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 20   need..      */ 
ccd0: 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20       .      if( 
cce0: 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
ccf0: 72 4f 70 20 7c 7c 20 75 6e 69 6f 6e 54 61 62 21  rOp || unionTab!
cd00: 3d 64 65 73 74 2e 69 50 61 72 6d 20 29 7b 0a 20  =dest.iParm ){. 
cd10: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74         int iCont
cd20: 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74  , iBreak, iStart
cd30: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
cd40: 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
cd50: 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e         if( dest.
cd60: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
cd70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53  t ){.          S
cd80: 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
cd90: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  p;.          whi
cda0: 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
cdb0: 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
cdc0: 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
cdd0: 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74 65          generate
cde0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
cdf0: 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
ce00: 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  EList);.        
ce10: 7d 0a 20 20 20 20 20 20 20 20 69 42 72 65 61 6b  }.        iBreak
ce20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
ce30: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
ce40: 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
ce50: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
ce60: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d  (v);.        com
ce70: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
ce80: 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
ce90: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
cea0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
ceb0: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75  (v, OP_Rewind, u
cec0: 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65 61 6b 29  nionTab, iBreak)
ced0: 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
cee0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
cef0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
cf00: 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
cf10: 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
cf20: 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f   p->pEList, unio
cf30: 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  nTab, p->pEList-
cf40: 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf60: 30 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20 69 43  0, -1, &dest, iC
cf70: 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
cf80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cf90: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
cfa0: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 20   iCont);.       
cfb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cfc0: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 75  p2(v, OP_Next, u
cfd0: 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74 29  nionTab, iStart)
cfe0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
cff0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
d000: 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
d010: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d020: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
d030: 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30  ose, unionTab, 0
d040: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d050: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
d060: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53    case TK_INTERS
d070: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ECT: {.      int
d080: 20 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20   tab1, tab2;.   
d090: 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
d0a0: 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
d0b0: 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74      Expr *pLimit
d0c0: 2c 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20  , *pOffset;.    
d0d0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
d0e0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74    SelectDest int
d0f0: 65 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20  ersectdest;.    
d100: 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20    int r1;..     
d110: 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73   /* INTERSECT is
d120: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
d130: 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65  the others since
d140: 20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20   it requires.   
d150: 20 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72     ** two tempor
d160: 61 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e  ary tables.  Hen
d170: 63 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77  ce it has its ow
d180: 6e 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20  n case.  Begin. 
d190: 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63       ** by alloc
d1a0: 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73  ating the tables
d1b0: 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20   we will need.. 
d1c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61       */.      ta
d1d0: 62 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  b1 = pParse->nTa
d1e0: 62 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20  b++;.      tab2 
d1f0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
d200: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d210: 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
d220: 3b 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  ;..      addr = 
d230: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d240: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
d250: 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b  meral, tab1, 0);
d260: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d270: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
d280: 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
d290: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
d2a0: 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20  [0] = addr;.    
d2b0: 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d    p->pRightmost-
d2c0: 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
d2d0: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
d2e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
d2f0: 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20  pEList );..     
d300: 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
d310: 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ECTs to our left
d320: 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
d330: 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20  table "tab1"..  
d340: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
d350: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
d360: 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73  it(&intersectdes
d370: 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  t, SRT_Union, ta
d380: 62 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  b1);.      rc = 
d390: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
d3a0: 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69  arse, pPrior, &i
d3b0: 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20  ntersectdest);. 
d3c0: 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
d3d0: 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74         goto mult
d3e0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
d3f0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
d400: 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74  Code the current
d410: 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d   SELECT into tem
d420: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
d430: 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  b2".      */.   
d440: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
d450: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d460: 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
d470: 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
d480: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
d490: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d  OpenEphm[1] == -
d4a0: 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
d4b0: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20  drOpenEphm[1] = 
d4c0: 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  addr;.      p->p
d4d0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
d4e0: 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69   pLimit = p->pLi
d4f0: 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c  mit;.      p->pL
d500: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
d510: 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
d520: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  fset;.      p->p
d530: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  Offset = 0;.    
d540: 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e    intersectdest.
d550: 69 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20  iParm = tab2;.  
d560: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d570: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
d580: 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
d590: 29 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65  );.      pDelete
d5a0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
d5b0: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
d5c0: 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 73 71  pPrior;.      sq
d5d0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
d5e0: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
d5f0: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
d600: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
d610: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
d620: 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20  fset;.      if( 
d630: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
d640: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
d650: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
d660: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
d670: 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65  code to take the
d680: 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
d690: 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61   the two tempora
d6a0: 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  ry.      ** tabl
d6b0: 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  es..      */.   
d6c0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
d6d0: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 69 66  List );.      if
d6e0: 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
d6f0: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
d700: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72      Select *pFir
d710: 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  st = p;.        
d720: 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
d730: 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
d740: 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
d750: 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72 61 74  .        generat
d760: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
d770: 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
d780: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  pEList);.      }
d790: 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20  .      iBreak = 
d7a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
d7b0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
d7c0: 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
d7d0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
d7e0: 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d        computeLim
d7f0: 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
d800: 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a  se, p, iBreak);.
d810: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d820: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
d830: 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42 72 65  wind, tab1, iBre
d840: 61 6b 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  ak);.      r1 = 
d850: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
d860: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
d870: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
d880: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d890: 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20  P_RowKey, tab1, 
d8a0: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
d8b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d8c0: 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62  OP_NotFound, tab
d8d0: 32 2c 20 69 43 6f 6e 74 2c 20 72 31 29 3b 0a 20  2, iCont, r1);. 
d8e0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
d8f0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
d900: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 65  e, r1);.      se
d910: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
d920: 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
d930: 73 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c  st, tab1, p->pEL
d940: 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20  ist->nExpr,.    
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d960: 20 20 30 2c 20 2d 31 2c 20 26 64 65 73 74 2c 20    0, -1, &dest, 
d970: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
d980: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d990: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
d9a0: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73   iCont);.      s
d9b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d9c0: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62  (v, OP_Next, tab
d9d0: 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20  1, iStart);.    
d9e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
d9f0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
da00: 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
da10: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
da20: 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c   OP_Close, tab2,
da30: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
da40: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
da50: 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20  OP_Close, tab1, 
da60: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
da70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
da80: 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69   Compute collati
da90: 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65  ng sequences use
daa0: 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f  d by .  ** tempo
dab0: 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64  rary tables need
dac0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
dad0: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  the compound sel
dae0: 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68  ect..  ** Attach
daf0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
db00: 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65  ucture to all te
db10: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a  mporary tables..
db20: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73    **.  ** This s
db30: 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79  ection is run by
db40: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
db50: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
db60: 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45   only..  ** SELE
db70: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  CT statements to
db80: 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73   the left always
db90: 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e   skip this part.
dba0: 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74    The right-most
dbb0: 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67  .  ** SELECT mig
dbc0: 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69  ht also skip thi
dbd0: 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73  s part if it has
dbe0: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61   no ORDER BY cla
dbf0: 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20  use and.  ** no 
dc00: 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20  temp tables are 
dc10: 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20  required..  */. 
dc20: 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
dc30: 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65   & SF_UsesEpheme
dc40: 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ral ){.    int i
dc50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dc60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
dc70: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
dc80: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
dc90: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  o;            /*
dca0: 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
dcb0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75  nce for the resu
dcc0: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65  lt set */.    Se
dcd0: 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20  lect *pLoop;    
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
dcf0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
dd00: 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  gh SELECT statem
dd10: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  ents */.    Coll
dd20: 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20  Seq **apColl;   
dd30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
dd40: 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
dd50: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
dd60: 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  [] */.    int nC
dd70: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
dd80: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
dd90: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
dda0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20  result set */.. 
ddb0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
ddc0: 69 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20  ightmost==p );. 
ddd0: 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c     nCol = p->pEL
dde0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
ddf0: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
de00: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
de10: 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
de20: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
de30: 28 2a 70 4b 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c  (*pKeyInfo)+nCol
de40: 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
de50: 2a 29 20 2b 20 31 29 29 3b 0a 20 20 20 20 69 66  *) + 1));.    if
de60: 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20  ( !pKeyInfo ){. 
de70: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
de80: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
de90: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
dea0: 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  end;.    }..    
deb0: 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20  pKeyInfo->enc = 
dec0: 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 4b 65  ENC(db);.    pKe
ded0: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20  yInfo->nField = 
dee0: 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  nCol;..    for(i
def0: 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49  =0, apColl=pKeyI
df00: 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43  nfo->aColl; i<nC
df10: 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b  ol; i++, apColl+
df20: 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c  +){.      *apCol
df30: 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  l = multiSelectC
df40: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
df50: 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
df60: 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20  0==*apColl ){.  
df70: 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
df80: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
df90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
dfa0: 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
dfb0: 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
dfc0: 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  p->pPrior){.    
dfd0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20    for(i=0; i<2; 
dfe0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  i++){.        in
dff0: 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e  t addr = pLoop->
e000: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b  addrOpenEphm[i];
e010: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
e020: 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  r<0 ){.         
e030: 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e   /* If [0] is un
e040: 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73  used then [1] is
e050: 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53   also unused.  S
e060: 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20  o we can.       
e070: 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66     ** always saf
e080: 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f  ely abort as soo
e090: 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75  n as the first u
e0a0: 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f  nused slot is fo
e0b0: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  und */.         
e0c0: 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e   assert( pLoop->
e0d0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c  addrOpenEphm[1]<
e0e0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  0 );.          b
e0f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
e100: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
e110: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
e120: 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ddr, nCol);.    
e130: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
e140: 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c  hangeP4(v, addr,
e150: 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
e160: 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
e170: 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64         pLoop->ad
e180: 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20  drOpenEphm[i] = 
e190: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
e1a0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
e1b0: 72 65 65 28 64 62 2c 20 70 4b 65 79 49 6e 66 6f  ree(db, pKeyInfo
e1c0: 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65  );.  }..multi_se
e1d0: 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73  lect_end:.  pDes
e1e0: 74 2d 3e 69 4d 65 6d 20 3d 20 64 65 73 74 2e 69  t->iMem = dest.i
e1f0: 4d 65 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 4d  Mem;.  pDest->nM
e200: 65 6d 20 3d 20 64 65 73 74 2e 6e 4d 65 6d 3b 0a  em = dest.nMem;.
e210: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
e220: 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74  elete(db, pDelet
e230: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
e240: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
e250: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
e260: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a  D_SELECT */../*.
e270: 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75  ** Code an outpu
e280: 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  t subroutine for
e290: 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70   a coroutine imp
e2a0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
e2b0: 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d  .** SELECT statm
e2c0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ent..**.** The d
e2d0: 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74  ata to be output
e2e0: 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
e2f0: 20 70 49 6e 2d 3e 69 4d 65 6d 2e 20 20 54 68 65   pIn->iMem.  The
e300: 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e  re are.** pIn->n
e310: 4d 65 6d 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62  Mem columns to b
e320: 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74  e output.  pDest
e330: 20 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75   is where the ou
e340: 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  tput should.** b
e350: 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65  e sent..**.** re
e360: 67 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e  gReturn is the n
e370: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67  umber of the reg
e380: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  ister holding th
e390: 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20  e subroutine.** 
e3a0: 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a  return address..
e3b0: 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76  **.** If regPrev
e3c0: 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  >0 then it is a 
e3d0: 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
e3e0: 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74  er in a vector t
e3f0: 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74  hat.** records t
e400: 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  he previous outp
e410: 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76  ut.  mem[regPrev
e420: 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74  ] is a flag that
e430: 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20   is false.** if 
e440: 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e  there has been n
e450: 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  o previous outpu
e460: 74 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30  t.  If regPrev>0
e470: 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a   then code is.**
e480: 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75   generated to su
e490: 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65  ppress duplicate
e4a0: 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20  s.  pKeyInfo is 
e4b0: 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  used for compari
e4c0: 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a  ng.** keys..**.*
e4d0: 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66  * If the LIMIT f
e4e0: 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69  ound in p->iLimi
e4f0: 74 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75  t is reached, ju
e500: 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
e510: 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a  o.** iBreak..*/.
e520: 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72  static int gener
e530: 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
e540: 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ine(.  Parse *pP
e550: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
e560: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
e570: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
e580: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
e590: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
e5a0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65  tement */.  Sele
e5b0: 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20  ctDest *pIn,    
e5c0: 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65      /* Coroutine
e5d0: 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20   supplying data 
e5e0: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
e5f0: 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20  *pDest,      /* 
e600: 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68  Where to send th
e610: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
e620: 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20  regReturn,      
e630: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
e640: 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
e650: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  er */.  int regP
e660: 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  rev,            
e670: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75  /* Previous resu
e680: 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f  lt register.  No
e690: 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30   uniqueness if 0
e6a0: 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
e6b0: 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a  KeyInfo,      /*
e6c0: 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77   For comparing w
e6d0: 69 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74  ith previous ent
e6e0: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79  ry */.  int p4ty
e6f0: 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
e700: 2f 2a 20 54 68 65 20 70 34 20 74 79 70 65 20 66  /* The p4 type f
e710: 6f 72 20 70 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20  or pKeyInfo */. 
e720: 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20   int iBreak     
e730: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
e740: 20 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20   here if we hit 
e750: 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a  the LIMIT */.){.
e760: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
e770: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
e780: 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e   iContinue;.  in
e790: 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20  t addr;..  addr 
e7a0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
e7b0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
e7c0: 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
e7d0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
e7e0: 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65  v);..  /* Suppre
e7f0: 73 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f  ss duplicates fo
e800: 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  r UNION, EXCEPT,
e810: 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a   and INTERSECT .
e820: 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72    */.  if( regPr
e830: 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31  ev ){.    int j1
e840: 2c 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73  , j2;.    j1 = s
e850: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
e860: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65  (v, OP_IfNot, re
e870: 67 50 72 65 76 29 3b 0a 20 20 20 20 6a 32 20 3d  gPrev);.    j2 =
e880: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e890: 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
e8a0: 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20 72 65 67  , pIn->iMem, reg
e8b0: 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 4d 65  Prev+1, pIn->nMe
e8c0: 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
e8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8e0: 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
e8f0: 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 20 20 73  , p4type);.    s
e900: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
e910: 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b  (v, OP_Jump, j2+
e920: 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32  2, iContinue, j2
e930: 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +2);.    sqlite3
e940: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
e950: 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  j1);.    sqlite3
e960: 45 78 70 72 43 6f 64 65 43 6f 70 79 28 70 50 61  ExprCodeCopy(pPa
e970: 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c 20  rse, pIn->iMem, 
e980: 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
e990: 6e 4d 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  nMem);.    sqlit
e9a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e9b0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72  OP_Integer, 1, r
e9c0: 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69  egPrev);.  }.  i
e9d0: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
e9e0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
e9f0: 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75  turn 0;..  /* Su
ea00: 70 70 72 65 73 73 20 74 68 65 20 74 68 65 20 66  ppress the the f
ea10: 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74 72  irst OFFSET entr
ea20: 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73 20  ies if there is 
ea30: 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  an OFFSET clause
ea40: 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73  .  */.  codeOffs
ea50: 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  et(v, p, iContin
ea60: 75 65 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  ue);..  switch( 
ea70: 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a  pDest->eDest ){.
ea80: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
ea90: 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
eaa0: 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
eab0: 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
eac0: 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
ead0: 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
eae0: 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
eaf0: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
eb00: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
eb10: 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d  ;.      int r2 =
eb20: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
eb30: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
eb40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
eb50: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
eb60: 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c  cord, pIn->iMem,
eb70: 20 70 49 6e 2d 3e 6e 4d 65 6d 2c 20 72 31 29 3b   pIn->nMem, r1);
eb80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
eb90: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
eba0: 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e  ewRowid, pDest->
ebb0: 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
ebc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ebd0: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
ebe0: 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20  , pDest->iParm, 
ebf0: 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  r1, r2);.      s
ec00: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
ec10: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
ec20: 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  END);.      sqli
ec30: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
ec40: 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
ec50: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
ec60: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
ec70: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
ec80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
ec90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
eca0: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
ecb0: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
ecc0: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
ecd0: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
ece0: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
ecf0: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
ed00: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
ed10: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
ed20: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
ed30: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
ed40: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
ed50: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
ed60: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
ed70: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
ed80: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
ed90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
eda0: 2d 3e 6e 4d 65 6d 3d 3d 31 20 29 3b 0a 20 20 20  ->nMem==1 );.   
edb0: 20 20 20 70 2d 3e 61 66 66 69 6e 69 74 79 20 3d     p->affinity =
edc0: 20 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74   .         sqlit
edd0: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
ede0: 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  y(p->pEList->a[0
edf0: 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e  ].pExpr, pDest->
ee00: 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20  affinity);.     
ee10: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
ee20: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
ee30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ee40: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
ee50: 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
ee60: 69 4d 65 6d 2c 20 31 2c 20 72 31 2c 20 26 70 2d  iMem, 1, r1, &p-
ee70: 3e 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20  >affinity, 1);. 
ee80: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ee90: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
eea0: 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  nge(pParse, pIn-
eeb0: 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20  >iMem, 1);.     
eec0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
eed0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
eee0: 72 74 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  rt, pDest->iParm
eef0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
ef00: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
ef10: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
ef20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ef30: 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65   }..#if 0  /* Ne
ef40: 76 65 72 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e  ver occurs on an
ef50: 20 4f 52 44 45 52 20 42 59 20 71 75 65 72 79 20   ORDER BY query 
ef60: 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79  */.    /* If any
ef70: 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68   row exist in th
ef80: 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65  e result set, re
ef90: 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61  cord that fact a
efa0: 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f  nd abort..    */
efb0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
efc0: 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71  ists: {.      sq
efd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
efe0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
eff0: 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 29 3b  , pDest->iParm);
f000: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
f010: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
f020: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
f030: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
f040: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f050: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
f060: 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
f070: 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
f080: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
f090: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
f0a0: 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
f0b0: 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
f0c0: 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
f0d0: 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
f0e0: 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
f0f0: 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
f100: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
f110: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
f120: 73 65 72 74 28 20 70 49 6e 2d 3e 6e 4d 65 6d 3d  sert( pIn->nMem=
f130: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
f140: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
f150: 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 4d 65  pParse, pIn->iMe
f160: 6d 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c  m, pDest->iParm,
f170: 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68   1);.      /* Th
f180: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
f190: 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
f1a0: 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
f1b0: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
f1c0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
f1d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f1e0: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
f1f0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  .    /* The resu
f200: 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  lts are stored i
f210: 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  n a sequence of 
f220: 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a  registers.    **
f230: 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44 65   starting at pDe
f240: 73 74 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 6e 20  st->iMem.  Then 
f250: 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79  the co-routine y
f260: 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ields..    */.  
f270: 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
f280: 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66  tine: {.      if
f290: 28 20 70 44 65 73 74 2d 3e 69 4d 65 6d 3d 3d 30  ( pDest->iMem==0
f2a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73   ){.        pDes
f2b0: 74 2d 3e 69 4d 65 6d 20 3d 20 73 71 6c 69 74 65  t->iMem = sqlite
f2c0: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
f2d0: 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29  arse, pIn->nMem)
f2e0: 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  ;.        pDest-
f2f0: 3e 6e 4d 65 6d 20 3d 20 70 49 6e 2d 3e 6e 4d 65  >nMem = pIn->nMe
f300: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
f310: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
f320: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Move(pParse, pIn
f330: 2d 3e 69 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 69  ->iMem, pDest->i
f340: 4d 65 6d 2c 20 70 44 65 73 74 2d 3e 6e 4d 65 6d  Mem, pDest->nMem
f350: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f360: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
f370: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
f380: 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65  Parm);.      bre
f390: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
f3a0: 2a 20 52 65 73 75 6c 74 73 20 61 72 65 20 73 74  * Results are st
f3b0: 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
f3c0: 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e  ce of registers.
f3d0: 20 20 54 68 65 6e 20 74 68 65 0a 20 20 20 20 2a    Then the.    *
f3e0: 2a 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f  * OP_ResultRow o
f3f0: 70 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f  pcode is used to
f400: 20 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73   cause sqlite3_s
f410: 74 65 70 28 29 20 74 6f 20 72 65 74 75 72 6e 0a  tep() to return.
f420: 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 78 74 20      ** the next 
f430: 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20  row of result.. 
f440: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
f450: 52 54 5f 4f 75 74 70 75 74 3a 20 7b 0a 20 20 20  RT_Output: {.   
f460: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f470: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
f480: 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 4d 65 6d 2c  tRow, pIn->iMem,
f490: 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 20   pIn->nMem);.   
f4a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
f4b0: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
f4c0: 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
f4d0: 4d 65 6d 2c 20 70 49 6e 2d 3e 6e 4d 65 6d 29 3b  Mem, pIn->nMem);
f4e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f4f0: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
f500: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
f510: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
f520: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
f530: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
f540: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
f550: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
f560: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
f570: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
f580: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
f590: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
f5a0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
f5b0: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
f5c0: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
f5d0: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
f5e0: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
f5f0: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
f600: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
f610: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
f620: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
f630: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f640: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
f650: 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
f660: 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
f670: 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
f680: 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  eached..  */.  i
f690: 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
f6a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f6b0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
f6c0: 6d 6d 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 2d  mm, p->iLimit, -
f6d0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
f6e0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f6f0: 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  IfZero, p->iLimi
f700: 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 7d 0a  t, iBreak);.  }.
f710: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
f720: 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
f730: 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  turn.  */.  sqli
f740: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
f750: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65  bel(v, iContinue
f760: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
f770: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
f780: 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b  urn, regReturn);
f790: 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ..  return addr;
f7a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e  .}../*.** Altern
f7b0: 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73  ative compound s
f7c0: 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72  elect code gener
f7d0: 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77  ator for cases w
f7e0: 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  hen there.** is 
f7f0: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
f800: 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73  se..**.** We ass
f810: 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74  ume a query of t
f820: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
f830: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73  m:.**.**      <s
f840: 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74  electA>  <operat
f850: 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20  or>  <selectB>  
f860: 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62  ORDER BY <orderb
f870: 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70  ylist>.**.** <op
f880: 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f  erator> is one o
f890: 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49  f UNION ALL, UNI
f8a0: 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
f8b0: 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69  NTERSECT.  The i
f8c0: 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64  dea.** is to cod
f8d0: 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e  e both <selectA>
f8e0: 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77   and <selectB> w
f8f0: 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ith the ORDER BY
f900: 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f   clause as.** co
f910: 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e  -routines.  Then
f920: 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74   run the co-rout
f930: 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c  ines in parallel
f940: 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72   and merge the r
f950: 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74  esults.** into t
f960: 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61  he output.  In a
f970: 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74  ddition to the t
f980: 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63  wo coroutines (c
f990: 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e  alled selectA an
f9a0: 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68  d.** selectB) th
f9b0: 65 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75  ere are 7 subrou
f9c0: 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tines:.**.**    
f9d0: 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68  outA:    Move th
f9e0: 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
f9f0: 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e  selectA coroutin
fa00: 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
fa10: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
fa20: 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
fa30: 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20   query..**.**   
fa40: 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74   outB:    Move t
fa50: 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
fa60: 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69   selectB corouti
fa70: 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ne into the outp
fa80: 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
fa90: 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e    of the compoun
faa0: 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20  d query.  (Only 
fab0: 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e  generated for UN
fac0: 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ION and.**      
fad0: 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
fae0: 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e  .  EXCEPT and IN
faf0: 53 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f  SERTSECT never o
fb00: 75 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74  utput a row that
fb10: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
fb20: 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20  appears only in 
fb30: 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74  B.).**.**    Alt
fb40: 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
fb50: 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
fb60: 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
fb70: 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a  ines and A<B..**
fb80: 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20  .**    AeqB:    
fb90: 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
fba0: 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
fbb0: 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
fbc0: 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20  nd A==B..**.**  
fbd0: 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65    AgtB:    Calle
fbe0: 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
fbf0: 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
fc00: 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e  oroutines and A>
fc10: 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41  B..**.**    EofA
fc20: 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
fc30: 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
fc40: 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e  ed from selectA.
fc50: 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20  .**.**    EofB: 
fc60: 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
fc70: 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
fc80: 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a   from selectB..*
fc90: 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
fca0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  ntation of the l
fcb0: 61 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f  atter five subro
fcc0: 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e  utines depend on
fcd0: 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72   which .** <oper
fce0: 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a  ator> is used:.*
fcf0: 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  *.**.**         
fd00: 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20      UNION ALL   
fd10: 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20        UNION     
fd20: 20 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20         EXCEPT   
fd30: 20 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54         INTERSECT
fd40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  .**          ---
fd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
fd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
fd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
fd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd90: 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75  .**   AltB:   ou
fda0: 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
fdb0: 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
fdc0: 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
fdd0: 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a       nextA.**.**
fde0: 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c     AeqB:   outA,
fdf0: 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
fe00: 65 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20  extA            
fe10: 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f   nextA         o
fe20: 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a  utA, nextA.**.**
fe30: 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c     AgtB:   outB,
fe40: 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
fe50: 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
fe60: 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
fe70: 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20    nextB.**.**   
fe80: 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65  EofA:   outB, ne
fe90: 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
fea0: 65 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61  extB          ha
feb0: 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68  lt             h
fec0: 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42  alt.**.**   EofB
fed0: 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
fee0: 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
fef0: 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
ff00: 74 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a  tA         halt.
ff10: 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74  **.** In the Alt
ff20: 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74  B, AeqB, and Agt
ff30: 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61  B subroutines, a
ff40: 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f  n EOF on A follo
ff50: 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61  wing nextA.** ca
ff60: 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  uses an immediat
ff70: 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61  e jump to EofA a
ff80: 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66  nd an EOF on B f
ff90: 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63  ollowing nextB c
ffa0: 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65  auses.** an imme
ffb0: 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
ffc0: 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41  fB.  Within EofA
ffd0: 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45   and EofB, and E
ffe0: 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a  OF on entry or.*
fff0: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  * following next
10000 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20  X causes a jump 
10010 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
10020 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73  e select process
10030 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69  ing..**.** Dupli
10040 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20  cate removal in 
10050 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  the UNION, EXCEP
10060 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
10070 20 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65   cases is handle
10080 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  d.** within the 
10090 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
100a0 65 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20  e.  The regPrev 
100b0 72 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c  register set hol
100c0 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  ds the previousl
100d0 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75  y.** output valu
100e0 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e  e.  A comparison
100f0 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74   is made against
10100 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20   this value and 
10110 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73  the output.** is
10120 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
10130 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75  next results wou
10140 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ld be the same a
10150 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a  s the previous..
10160 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  **.** The implem
10170 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73  entation plan is
10180 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
10190 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
101a0 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75   and seven.** su
101b0 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c  broutines first,
101c0 20 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f   then put the co
101d0 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74  ntrol logic at t
101e0 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65  he bottom.  Like
101f0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
10200 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a        goto Init.
10210 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f  **     coA: coro
10220 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71  utine for left q
10230 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20  uery (A).**     
10240 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66  coB: coroutine f
10250 6f 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28  or right query (
10260 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f  B).**    outA: o
10270 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
10280 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f   A.**    outB: o
10290 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
102a0 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e   B (UNION and UN
102b0 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a  ION ALL only).**
102c0 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a      EofA: ....**
102d0 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a      EofB: ....**
102e0 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a      AltB: ....**
102f0 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a      AeqB: ....**
10300 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a      AgtB: ....**
10310 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61      Init: initia
10320 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72  lize coroutine r
10330 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20  egisters.**     
10340 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a       yield coA.*
10350 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
10360 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a  f(A) goto EofA.*
10370 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64  *          yield
10380 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20   coB.**         
10390 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20   if eof(B) goto 
103a0 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a  EofB.**    Cmpr:
103b0 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a   Compare A, B.**
103c0 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41            Jump A
103d0 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a  ltB, AeqB, AgtB.
103e0 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a  **     End: ....
103f0 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c  **.** We call Al
10400 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20  tB, AeqB, AgtB, 
10410 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22  EofA, and EofB "
10420 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74  subroutines" but
10430 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a   they are not.**
10440 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64   actually called
10450 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64   using Gosub and
10460 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74   they do not Ret
10470 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45  urn.  EofA and E
10480 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69  ofB loop.** unti
10490 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78  l all data is ex
104a0 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d  hausted then jum
104b0 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c  p to the "end" l
104c0 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42  abe.  AltB, AeqB
104d0 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75  ,.** and AgtB ju
104e0 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20  mp to either L2 
104f0 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66  or to one of Eof
10500 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69  A or EofB..*/.#i
10510 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10520 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
10530 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  T.static int mul
10540 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
10550 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
10560 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
10570 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
10580 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
10590 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
105a0 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
105b0 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
105c0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
105d0 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
105e0 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
105f0 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
10600 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
10610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
10620 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
10630 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
10640 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
10650 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
10660 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
10670 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
10680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
10690 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
106a0 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65  his VDBE */.  Se
106b0 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20  lectDest destA; 
106c0 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
106d0 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
106e0 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65   A */.  SelectDe
106f0 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a  st destB;     /*
10700 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
10710 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a   coroutine B */.
10720 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20    int regAddrA; 
10730 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
10740 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
10750 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69  select-A corouti
10760 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45  ne */.  int regE
10770 6f 66 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ofA;          /*
10780 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74   Flag to indicat
10790 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 41 20  e when select-A 
107a0 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20  is complete */. 
107b0 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20   int regAddrB;  
107c0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
107d0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  s register for s
107e0 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e  elect-B coroutin
107f0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f  e */.  int regEo
10800 66 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fB;          /* 
10810 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65  Flag to indicate
10820 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 42 20 69   when select-B i
10830 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20  s complete */.  
10840 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b  int addrSelectA;
10850 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
10860 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
10870 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
10880 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b  int addrSelectB;
10890 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
108a0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
108b0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
108c0 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20  int regOutA;    
108d0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
108e0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
108f0 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
10900 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
10910 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20  egOutB;         
10920 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
10930 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
10940 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
10950 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
10960 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tA;         /* A
10970 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
10980 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
10990 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
109a0 75 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  utB;         /* 
109b0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
109c0 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
109d0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
109e0 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofA;         /*
109f0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
10a00 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74  select-A-exhaust
10a10 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
10a20 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b  .  int addrEofB;
10a30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
10a40 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
10a50 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-B-exhausted su
10a60 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
10a70 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20  t addrAltB;     
10a80 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
10a90 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75  f the A<B subrou
10aa0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
10ab0 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20  drAeqB;         
10ac0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
10ad0 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e  e A==B subroutin
10ae0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
10af0 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  gtB;         /* 
10b00 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
10b10 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  >B subroutine */
10b20 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41  .  int regLimitA
10b30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
10b40 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
10b50 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
10b60 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20   regLimitB;     
10b70 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
10b80 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
10b90 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  A */.  int regPr
10ba0 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev;          /* 
10bb0 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  A range of regis
10bc0 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65  ters to hold pre
10bd0 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a  vious output */.
10be0 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74    int savedLimit
10bf0 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
10c00 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69   value of p->iLi
10c10 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  mit */.  int sav
10c20 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  edOffset;      /
10c30 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
10c40 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20   p->iOffset */. 
10c50 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20   int labelCmpr; 
10c60 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
10c70 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
10c80 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72   the merge algor
10c90 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  ithm */.  int la
10ca0 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20  belEnd;         
10cb0 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
10cc0 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   end of the over
10cd0 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20  all SELECT stmt 
10ce0 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20 20  */.  int j1;    
10cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
10d00 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
10d10 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65  that get retarge
10d20 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tted */.  int op
10d30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10d40 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c  /* One of TK_ALL
10d50 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  , TK_UNION, TK_E
10d60 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53  XCEPT, TK_INTERS
10d70 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ECT */.  KeyInfo
10d80 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f   *pKeyDup = 0; /
10d90 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
10da0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  ormation for dup
10db0 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a  licate removal *
10dc0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
10dd0 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d  yMerge;   /* Com
10de0 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
10df0 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20  ion for merging 
10e00 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rows */.  sqlite
10e10 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
10e20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
10e30 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
10e40 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
10e50 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
10e60 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
10e70 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
10e80 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10e90 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
10ea0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
10eb0 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65  .  int *aPermute
10ec0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70  ;        /* Mapp
10ed0 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42  ing from ORDER B
10ee0 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c  Y terms to resul
10ef0 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  t set columns */
10f00 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
10f10 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
10f20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d  assert( pKeyDup=
10f30 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65  =0 ); /* "Manage
10f40 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68  d" code needs th
10f50 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38  is.  Ticket #338
10f60 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  2. */.  db = pPa
10f70 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70  rse->db;.  v = p
10f80 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
10f90 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
10fa0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
10fb0 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c    labelEnd = sql
10fc0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
10fd0 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70  l(v);.  labelCmp
10fe0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  r = sqlite3VdbeM
10ff0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20  akeLabel(v);... 
11000 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68 65   /* Patch up the
11010 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
11020 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e  .  */.  op = p->
11030 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d  op;  .  pPrior =
11040 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73   p->pPrior;.  as
11050 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f  sert( pPrior->pO
11060 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70  rderBy==0 );.  p
11070 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
11080 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28  derBy;.  assert(
11090 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e   pOrderBy );.  n
110a0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
110b0 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a  By->nExpr;..  /*
110c0 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f   For operators o
110d0 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
110e0 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d  ALL we have to m
110f0 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20 20  ake sure that.  
11100 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
11110 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65 76  clause covers ev
11120 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ery term of the 
11130 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64  result set.  Add
11140 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74  .  ** terms to t
11150 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
11160 73 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  se as necessary.
11170 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d  .  */.  if( op!=
11180 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f  TK_ALL ){.    fo
11190 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f  r(i=1; db->mallo
111a0 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c  cFailed==0 && i<
111b0 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
111c0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  r; i++){.      s
111d0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
111e0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
111f0 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d    for(j=0, pItem
11200 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c  =pOrderBy->a; j<
11210 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70  nOrderBy; j++, p
11220 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
11230 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
11240 69 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  iCol>0 );.      
11250 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 6f    if( pItem->iCo
11260 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==i ) break;.  
11270 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11280 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  j==nOrderBy ){. 
11290 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65         Expr *pNe
112a0 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  w = sqlite3PExpr
112b0 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45  (pParse, TK_INTE
112c0 47 45 52 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  GER, 0, 0, 0);. 
112d0 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d         if( pNew=
112e0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
112f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
11300 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
11310 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20   EP_IntValue;.  
11320 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62        pNew->iTab
11330 6c 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  le = i;.        
11340 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
11350 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
11360 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
11370 79 2c 20 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20  y, pNew, 0);.   
11380 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
11390 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 69 43 6f  [nOrderBy++].iCo
113a0 6c 20 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20  l = i;.      }. 
113b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
113c0 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 61  ompute the compa
113d0 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69 6f  rison permutatio
113e0 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74 68  n and keyinfo th
113f0 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68 0a  at is used with.
11400 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74 61    ** the permuta
11410 74 69 6f 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f  tion in order to
11420 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 74 6f 20   comparisons to 
11430 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
11440 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f   next.  ** row o
11450 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20  f results comes 
11460 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20  from selectA or 
11470 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61  selectB.  Also a
11480 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a  dd explicit.  **
11490 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74   collations to t
114a0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
114b0 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74  se terms so that
114c0 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65   when the subque
114d0 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  ries.  ** to the
114e0 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c   right and the l
114f0 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65  eft are evaluate
11500 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20  d, they use the 
11510 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c  correct.  ** col
11520 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61  lation..  */.  a
11530 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65  Permute = sqlite
11540 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
11550 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72   sizeof(int)*nOr
11560 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50  derBy);.  if( aP
11570 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74  ermute ){.    st
11580 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
11590 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66  em *pItem;.    f
115a0 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f  or(i=0, pItem=pO
115b0 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72  rderBy->a; i<nOr
115c0 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65  derBy; i++, pIte
115d0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  m++){.      asse
115e0 72 74 28 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 3e  rt( pItem->iCol>
115f0 30 20 20 26 26 20 70 49 74 65 6d 2d 3e 69 43 6f  0  && pItem->iCo
11600 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  l<=p->pEList->nE
11610 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65  xpr );.      aPe
11620 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d  rmute[i] = pItem
11630 2d 3e 69 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  ->iCol - 1;.    
11640 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  }.    pKeyMerge 
11650 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  =.      sqlite3D
11660 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
11670 69 7a 65 6f 66 28 2a 70 4b 65 79 4d 65 72 67 65  izeof(*pKeyMerge
11680 29 2b 6e 4f 72 64 65 72 42 79 2a 28 73 69 7a 65  )+nOrderBy*(size
11690 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29  of(CollSeq*)+1))
116a0 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 4d 65  ;.    if( pKeyMe
116b0 72 67 65 20 29 7b 0a 20 20 20 20 20 20 70 4b 65  rge ){.      pKe
116c0 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64  yMerge->aSortOrd
116d0 65 72 20 3d 20 28 75 38 2a 29 26 70 4b 65 79 4d  er = (u8*)&pKeyM
116e0 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 6e 4f 72 64  erge->aColl[nOrd
116f0 65 72 42 79 5d 3b 0a 20 20 20 20 20 20 70 4b 65  erBy];.      pKe
11700 79 4d 65 72 67 65 2d 3e 6e 46 69 65 6c 64 20 3d  yMerge->nField =
11710 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20   nOrderBy;.     
11720 20 70 4b 65 79 4d 65 72 67 65 2d 3e 65 6e 63 20   pKeyMerge->enc 
11730 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 20  = ENC(db);.     
11740 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
11750 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
11760 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
11770 6c 6c 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72  ll;.        Expr
11780 20 2a 70 54 65 72 6d 20 3d 20 70 4f 72 64 65 72   *pTerm = pOrder
11790 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
117a0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
117b0 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  m->flags & EP_Ex
117c0 70 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20  pCollate ){.    
117d0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 54        pColl = pT
117e0 65 72 6d 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20  erm->pColl;.    
117f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11800 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c       pColl = mul
11810 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28  tiSelectCollSeq(
11820 70 50 61 72 73 65 2c 20 70 2c 20 61 50 65 72 6d  pParse, p, aPerm
11830 75 74 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ute[i]);.       
11840 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20     pTerm->flags 
11850 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65  |= EP_ExpCollate
11860 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65 72  ;.          pTer
11870 6d 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c  m->pColl = pColl
11880 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11890 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61      pKeyMerge->a
118a0 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b  Coll[i] = pColl;
118b0 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72  .        pKeyMer
118c0 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ge->aSortOrder[i
118d0 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  ] = pOrderBy->a[
118e0 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
118f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
11900 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72  lse{.    pKeyMer
11910 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ge = 0;.  }..  /
11920 2a 20 52 65 61 74 74 61 63 68 20 74 68 65 20 4f  * Reattach the O
11930 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
11940 6f 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  o the query..  *
11950 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  /.  p->pOrderBy 
11960 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 50  = pOrderBy;.  pP
11970 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d  rior->pOrderBy =
11980 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
11990 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
119a0 70 4f 72 64 65 72 42 79 29 3b 0a 0a 20 20 2f 2a  pOrderBy);..  /*
119b0 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67   Allocate a rang
119c0 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72  e of temporary r
119d0 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
119e0 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a   KeyInfo needed.
119f0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67    ** for the log
11a00 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20  ic that removes 
11a10 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74  duplicate result
11a20 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20   rows when the. 
11a30 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20   ** operator is 
11a40 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
11a50 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74  r INTERSECT (but
11a60 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e   not UNION ALL).
11a70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
11a80 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
11a90 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c  gPrev = 0;.  }el
11aa0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70  se{.    int nExp
11ab0 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r = p->pEList->n
11ac0 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
11ad0 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70  ( nOrderBy>=nExp
11ae0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
11af0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67  ailed );.    reg
11b00 50 72 65 76 20 3d 20 73 71 6c 69 74 65 33 47 65  Prev = sqlite3Ge
11b10 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
11b20 65 2c 20 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20  e, nExpr+1);.   
11b30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11b40 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
11b50 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 0, regPrev);. 
11b60 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c     pKeyDup = sql
11b70 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
11b80 28 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  (db,.           
11b90 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70         sizeof(*p
11ba0 4b 65 79 44 75 70 29 20 2b 20 6e 45 78 70 72 2a  KeyDup) + nExpr*
11bb0 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
11bc0 29 2b 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20  )+1) );.    if( 
11bd0 70 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20  pKeyDup ){.     
11be0 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f   pKeyDup->aSortO
11bf0 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70 4b 65  rder = (u8*)&pKe
11c00 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70  yDup->aColl[nExp
11c10 72 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79 44 75  r];.      pKeyDu
11c20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 45 78 70  p->nField = nExp
11c30 72 3b 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70  r;.      pKeyDup
11c40 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
11c50 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
11c60 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  i<nExpr; i++){. 
11c70 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e         pKeyDup->
11c80 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69  aColl[i] = multi
11c90 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
11ca0 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20  arse, p, i);.   
11cb0 20 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 53       pKeyDup->aS
11cc0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b  ortOrder[i] = 0;
11cd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11ce0 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70 61 72 61   }. .  /* Separa
11cf0 74 65 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20  te the left and 
11d00 74 68 65 20 72 69 67 68 74 20 71 75 65 72 79 20  the right query 
11d10 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72  from one another
11d20 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f  .  */.  p->pPrio
11d30 72 20 3d 20 30 3b 0a 20 20 70 50 72 69 6f 72 2d  r = 0;.  pPrior-
11d40 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b  >pRightmost = 0;
11d50 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
11d60 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
11d70 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  arse, p, p->pOrd
11d80 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
11d90 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50    if( pPrior->pP
11da0 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rior==0 ){.    s
11db0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
11dc0 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
11dd0 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72  , pPrior, pPrior
11de0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
11df0 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ER");.  }..  /* 
11e00 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69  Compute the limi
11e10 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  t registers */. 
11e20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
11e30 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
11e40 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69  , labelEnd);.  i
11e50 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20  f( p->iLimit && 
11e60 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
11e70 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b    regLimitA = ++
11e80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
11e90 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b    regLimitB = ++
11ea0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
11eb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11ec0 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
11ed0 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e  p->iOffset ? p->
11ee0 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69  iOffset+1 : p->i
11ef0 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20  Limit,.         
11f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f10 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69           regLimi
11f20 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
11f30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11f40 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41  _Copy, regLimitA
11f50 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20  , regLimitB);.  
11f60 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69  }else{.    regLi
11f70 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42  mitA = regLimitB
11f80 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
11f90 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
11fa0 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
11fb0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
11fc0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
11fd0 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65  te(db, p->pOffse
11fe0 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74  t);.  p->pOffset
11ff0 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72   = 0;..  regAddr
12000 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
12010 65 6d 3b 0a 20 20 72 65 67 45 6f 66 41 20 3d 20  em;.  regEofA = 
12020 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
12030 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70    regAddrB = ++p
12040 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
12050 65 67 45 6f 66 42 20 3d 20 2b 2b 70 50 61 72 73  egEofB = ++pPars
12060 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75  e->nMem;.  regOu
12070 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
12080 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d  Mem;.  regOutB =
12090 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
120a0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
120b0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c  DestInit(&destA,
120c0 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
120d0 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c  regAddrA);.  sql
120e0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
120f0 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43  it(&destB, SRT_C
12100 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
12110 72 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  rB);..  /* Jump 
12120 70 61 73 74 20 74 68 65 20 76 61 72 69 6f 75 73  past the various
12130 20 73 75 62 72 6f 75 74 69 6e 65 73 20 61 6e 64   subroutines and
12140 20 63 6f 72 6f 75 74 69 6e 65 73 20 74 6f 20 74   coroutines to t
12150 68 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d 65 72  he main.  ** mer
12160 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 6a  ge loop.  */.  j
12170 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
12180 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp0(v, OP_Goto
12190 29 3b 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41  );.  addrSelectA
121a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
121b0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 0a  rrentAddr(v);...
121c0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
121d0 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
121e0 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
121f0 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68   statement to th
12200 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74  e.  ** left of t
12210 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72  he compound oper
12220 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73  ator - the "A" s
12230 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64  elect..  */.  Vd
12240 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
12250 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69  , "Begin corouti
12260 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45  ne for left SELE
12270 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d  CT"));.  pPrior-
12280 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
12290 69 74 41 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  itA;.  sqlite3Se
122a0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
122b0 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20  ior, &destA);.  
122c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
122d0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
122e0 20 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20   1, regEofA);.  
122f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12300 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
12310 65 67 41 64 64 72 41 29 3b 0a 20 20 56 64 62 65  egAddrA);.  Vdbe
12320 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
12330 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66  "End coroutine f
12340 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29  or left SELECT")
12350 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
12360 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f  e a coroutine to
12370 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45   evaluate the SE
12380 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f  LECT statement o
12390 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68  n .  ** the righ
123a0 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65  t - the "B" sele
123b0 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65  ct.  */.  addrSe
123c0 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56  lectB = sqlite3V
123d0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
123e0 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  );.  VdbeNoopCom
123f0 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20  ment((v, "Begin 
12400 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
12410 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  ght SELECT"));. 
12420 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d   savedLimit = p-
12430 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64  >iLimit;.  saved
12440 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
12450 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  set;.  p->iLimit
12460 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20   = regLimitB;.  
12470 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20  p->iOffset = 0; 
12480 20 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63   .  sqlite3Selec
12490 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65  t(pParse, p, &de
124a0 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69  stB);.  p->iLimi
124b0 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a  t = savedLimit;.
124c0 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73    p->iOffset = s
124d0 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71  avedOffset;.  sq
124e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
124f0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
12500 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71  , regEofB);.  sq
12510 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
12520 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
12530 41 64 64 72 42 29 3b 0a 20 20 56 64 62 65 4e 6f  AddrB);.  VdbeNo
12540 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  opComment((v, "E
12550 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  nd coroutine for
12560 20 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29   right SELECT"))
12570 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
12580 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
12590 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
125a0 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
125b0 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e A.  ** select 
125c0 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
125d0 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
125e0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
125f0 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
12600 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
12610 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22  t routine for A"
12620 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d  ));.  addrOutA =
12630 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
12640 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
12650 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12660 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44     p, &destA, pD
12670 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20  est, regOutA,.  
12680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
12690 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
126a0 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
126b0 4f 46 46 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  OFF, labelEnd);.
126c0 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65    .  /* Generate
126d0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
126e0 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
126f0 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
12700 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e B.  ** select 
12710 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
12720 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
12730 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
12740 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
12750 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
12760 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65  NION ){.    Vdbe
12770 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
12780 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
12790 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64  for B"));.    ad
127a0 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74  drOutB = generat
127b0 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
127c0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
127d0 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
127e0 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67  estB, pDest, reg
127f0 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20  OutB,.          
12800 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
12810 70 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49  pKeyDup, P4_KEYI
12820 4e 46 4f 5f 53 54 41 54 49 43 2c 20 6c 61 62 65  NFO_STATIC, labe
12830 6c 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lEnd);.  }..  /*
12840 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
12850 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
12860 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
12870 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a  rom select A.  *
12880 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
12890 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
128a0 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e   select B remain
128b0 73 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  s..  */.  VdbeNo
128c0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  opComment((v, "e
128d0 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22  of-A subroutine"
128e0 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  ));.  if( op==TK
128f0 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54  _EXCEPT || op==T
12900 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
12910 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71     addrEofA = sq
12920 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12930 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
12940 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73  abelEnd);.  }els
12950 65 7b 20 20 0a 20 20 20 20 61 64 64 72 45 6f 66  e{  .    addrEof
12960 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  A = sqlite3VdbeA
12970 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
12980 72 65 67 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e  regEofB, labelEn
12990 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
129a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
129b0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
129c0 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 73  addrOutB);.    s
129d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
129e0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
129f0 67 41 64 64 72 42 29 3b 0a 20 20 20 20 73 71 6c  gAddrB);.    sql
12a00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12a10 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
12a20 64 72 45 6f 66 41 29 3b 0a 20 20 7d 0a 0a 20 20  drEofA);.  }..  
12a30 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
12a40 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
12a50 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
12a60 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20   from select B. 
12a70 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
12a80 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
12a90 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61  in select A rema
12aa0 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
12ab0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
12ac0 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42   ){.    addrEofB
12ad0 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 7d   = addrEofA;.  }
12ae0 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
12af0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
12b00 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e  "eof-B subroutin
12b10 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
12b20 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fB = sqlite3Vdbe
12b30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
12b40 20 72 65 67 45 6f 66 41 2c 20 6c 61 62 65 6c 45   regEofA, labelE
12b50 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nd);.    sqlite3
12b60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12b70 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
12b80 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20   addrOutA);.    
12b90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12ba0 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
12bb0 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71  egAddrA);.    sq
12bc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12bd0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
12be0 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20  ddrEofB);.  }.. 
12bf0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
12c00 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
12c10 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f  case of A<B.  */
12c20 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
12c30 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73  nt((v, "A-lt-B s
12c40 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
12c50 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69 74  addrAltB = sqlit
12c60 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12c70 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
12c80 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
12c90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12ca0 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
12cb0 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
12cc0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12cd0 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c   OP_If, regEofA,
12ce0 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71   addrEofA);.  sq
12cf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12d00 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
12d10 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
12d20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
12d30 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
12d40 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20  e of A==B.  */. 
12d50 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
12d60 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20  ){.    addrAeqB 
12d70 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65  = addrAltB;.  }e
12d80 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  lse if( op==TK_I
12d90 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
12da0 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
12db0 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74  ltB;.    addrAlt
12dc0 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  B++;.  }else{.  
12dd0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
12de0 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75  t((v, "A-eq-B su
12df0 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
12e00 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20   addrAeqB =.    
12e10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12e20 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
12e30 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20 73 71  egAddrA);.    sq
12e40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12e50 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
12e60 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  A, addrEofA);.  
12e70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12e80 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
12e90 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  0, labelCmpr);. 
12ea0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
12eb0 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
12ec0 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42   the case of A>B
12ed0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
12ee0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67  Comment((v, "A-g
12ef0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
12f00 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20  );.  addrAgtB = 
12f10 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
12f20 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28  ntAddr(v);.  if(
12f30 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f   op==TK_ALL || o
12f40 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
12f50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12f60 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
12f70 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
12f80 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  utB);.  }.  sqli
12f90 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
12fa0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
12fb0 64 72 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  drB);.  sqlite3V
12fc0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12fd0 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64  If, regEofB, add
12fe0 72 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65  rEofB);.  sqlite
12ff0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
13000 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
13010 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  Cmpr);..  /* Thi
13020 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63 65  s code runs once
13030 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 65   to initialize e
13040 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a  verything..  */.
13050 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
13060 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
13070 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13080 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
13090 20 30 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20   0, regEofA);.  
130a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
130b0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
130c0 20 30 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20   0, regEofB);.  
130d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
130e0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
130f0 65 67 41 64 64 72 41 2c 20 61 64 64 72 53 65 6c  egAddrA, addrSel
13100 65 63 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ectA);.  sqlite3
13110 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13120 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 42  _Gosub, regAddrB
13130 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a  , addrSelectB);.
13140 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13150 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
13160 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29  gEofA, addrEofA)
13170 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13180 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
13190 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66  regEofB, addrEof
131a0 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d  B);..  /* Implem
131b0 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72  ent the main mer
131c0 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  ge loop.  */.  s
131d0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
131e0 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43  eLabel(v, labelC
131f0 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  mpr);.  sqlite3V
13200 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
13210 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20  Permutation, 0, 
13220 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65  0, 0, (char*)aPe
13230 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52  rmute, P4_INTARR
13240 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  AY);.  sqlite3Vd
13250 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
13260 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 4d  ompare, destA.iM
13270 65 6d 2c 20 64 65 73 74 42 2e 69 4d 65 6d 2c 20  em, destB.iMem, 
13280 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  nOrderBy,.      
13290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132a0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65     (char*)pKeyMe
132b0 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  rge, P4_KEYINFO_
132c0 48 41 4e 44 4f 46 46 29 3b 0a 20 20 73 71 6c 69  HANDOFF);.  sqli
132d0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
132e0 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c   OP_Jump, addrAl
132f0 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64  tB, addrAeqB, ad
13300 64 72 41 67 74 42 29 3b 0a 0a 20 20 2f 2a 20 52  drAgtB);..  /* R
13310 65 6c 65 61 73 65 20 74 65 6d 70 6f 72 61 72 79  elease temporary
13320 20 72 65 67 69 73 74 65 72 73 0a 20 20 2a 2f 0a   registers.  */.
13330 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b    if( regPrev ){
13340 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
13350 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
13360 72 73 65 2c 20 72 65 67 50 72 65 76 2c 20 6e 4f  rse, regPrev, nO
13370 72 64 65 72 42 79 2b 31 29 3b 0a 20 20 7d 0a 0a  rderBy+1);.  }..
13380 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
13390 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f   this point in o
133a0 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74  rder to terminat
133b0 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  e the query..  *
133c0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
133d0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
133e0 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  abelEnd);..  /* 
133f0 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
13400 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73  f output columns
13410 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
13420 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
13430 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65  tput ){.    Sele
13440 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72  ct *pFirst = pPr
13450 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ior;.    while( 
13460 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
13470 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
13480 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65  ->pPrior;.    ge
13490 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
134a0 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
134b0 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
134c0 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62  }..  /* Reassemb
134d0 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ly the compound 
134e0 71 75 65 72 79 20 73 6f 20 74 68 61 74 20 69 74  query so that it
134f0 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63   will be freed c
13500 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79  orrectly.  ** by
13510 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
13520 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70  ction */.  if( p
13530 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
13540 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
13550 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  ete(db, p->pPrio
13560 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72  r);.  }.  p->pPr
13570 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 0a 20  ior = pPrior;.. 
13580 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65   /*** TBD:  Inse
13590 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61  rt subroutine ca
135a0 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72  lls to close cur
135b0 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65  sors on incomple
135c0 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65  te.  **** subque
135d0 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 72 65 74  ries ****/.  ret
135e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
135f0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
13600 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
13610 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
13620 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
13630 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72  MIT_VIEW)./* For
13640 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e  ward Declaration
13650 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s */.static void
13660 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 73   substExprList(s
13670 71 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73  qlite3*, ExprLis
13680 74 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73  t*, int, ExprLis
13690 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  t*);.static void
136a0 20 73 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c   substSelect(sql
136b0 69 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c  ite3*, Select *,
136c0 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a   int, ExprList *
136d0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74  );../*.** Scan t
136e0 68 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65  hrough the expre
136f0 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65  ssion pExpr.  Re
13700 70 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65  place every refe
13710 72 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f  rence to.** a co
13720 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75  lumn in table nu
13730 6d 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68  mber iTable with
13740 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
13750 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74  Column-th.** ent
13760 72 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28  ry in pEList.  (
13770 42 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65  But leave refere
13780 6e 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49  nces to the ROWI
13790 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63  D column .** unc
137a0 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54  hanged.).**.** T
137b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70  his routine is p
137c0 61 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74  art of the flatt
137d0 65 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e  ening procedure.
137e0 20 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20    A subquery.** 
137f0 77 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74  whose result set
13800 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
13810 45 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73  EList appears as
13820 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a   entry in the.**
13830 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
13840 61 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68  a SELECT such th
13850 61 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73  at the VDBE curs
13860 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  or assigned to t
13870 68 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75  hat.** FORM clau
13880 73 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62  se entry is iTab
13890 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
138a0 65 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73  e make the neces
138b0 73 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73  sary .** changes
138c0 20 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61   to pExpr so tha
138d0 74 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65  t it refers dire
138e0 63 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72  ctly to the sour
138f0 63 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74  ce table.** of t
13900 68 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68  he subquery rath
13910 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  er the result se
13920 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  t of the subquer
13930 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
13940 64 20 73 75 62 73 74 45 78 70 72 28 0a 20 20 73  d substExpr(.  s
13950 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
13960 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c     /* Report mal
13970 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68  loc errors to th
13980 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  is connection */
13990 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
139a0 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69         /* Expr i
139b0 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75  n which substitu
139c0 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20  tion occurs */. 
139d0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
139e0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
139f0 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20   be substituted 
13a00 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
13a10 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73  EList    /* Subs
13a20 74 69 74 75 74 65 20 65 78 70 72 65 73 73 69 6f  titute expressio
13a30 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  ns */.){.  if( p
13a40 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
13a50 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
13a60 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
13a70 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
13a80 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  Table ){.    if(
13a90 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
13aa0 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
13ab0 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
13ac0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13ad0 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20   Expr *pNew;.   
13ae0 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
13af0 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69  t!=0 && pExpr->i
13b00 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e  Column<pEList->n
13b10 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73  Expr );.      as
13b20 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
13b30 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
13b40 70 52 69 67 68 74 3d 3d 30 20 26 26 20 70 45 78  pRight==0 && pEx
13b50 70 72 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a  pr->pList==0 );.
13b60 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 45 4c        pNew = pEL
13b70 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43  ist->a[pExpr->iC
13b80 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20  olumn].pExpr;.  
13b90 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
13ba0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  !=0 );.      pEx
13bb0 70 72 2d 3e 6f 70 20 3d 20 70 4e 65 77 2d 3e 6f  pr->op = pNew->o
13bc0 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
13bd0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
13be0 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
13bf0 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  >pLeft = sqlite3
13c00 45 78 70 72 44 75 70 28 64 62 2c 20 70 4e 65 77  ExprDup(db, pNew
13c10 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
13c20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
13c30 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
13c40 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
13c50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
13c60 28 64 62 2c 20 70 4e 65 77 2d 3e 70 52 69 67 68  (db, pNew->pRigh
13c70 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
13c80 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3d 3d  ( pExpr->pList==
13c90 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  0 );.      pExpr
13ca0 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  ->pList = sqlite
13cb0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
13cc0 20 70 4e 65 77 2d 3e 70 4c 69 73 74 29 3b 0a 20   pNew->pList);. 
13cd0 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
13ce0 6c 65 20 3d 20 70 4e 65 77 2d 3e 69 54 61 62 6c  le = pNew->iTabl
13cf0 65 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  e;.      pExpr->
13d00 70 54 61 62 20 3d 20 70 4e 65 77 2d 3e 70 54 61  pTab = pNew->pTa
13d10 62 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  b;.      pExpr->
13d20 69 43 6f 6c 75 6d 6e 20 3d 20 70 4e 65 77 2d 3e  iColumn = pNew->
13d30 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
13d40 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 70 4e 65  Expr->iAgg = pNe
13d50 77 2d 3e 69 41 67 67 3b 0a 20 20 20 20 20 20 73  w->iAgg;.      s
13d60 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
13d70 64 62 2c 20 26 70 45 78 70 72 2d 3e 74 6f 6b 65  db, &pExpr->toke
13d80 6e 2c 20 26 70 4e 65 77 2d 3e 74 6f 6b 65 6e 29  n, &pNew->token)
13d90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
13da0 6f 6b 65 6e 43 6f 70 79 28 64 62 2c 20 26 70 45  okenCopy(db, &pE
13db0 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4e 65 77  xpr->span, &pNew
13dc0 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 70  ->span);.      p
13dd0 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 3d 20  Expr->pSelect = 
13de0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
13df0 28 64 62 2c 20 70 4e 65 77 2d 3e 70 53 65 6c 65  (db, pNew->pSele
13e00 63 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ct);.      pExpr
13e10 2d 3e 66 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e  ->flags = pNew->
13e20 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  flags;.    }.  }
13e30 65 6c 73 65 7b 0a 20 20 20 20 73 75 62 73 74 45  else{.    substE
13e40 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  xpr(db, pExpr->p
13e50 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  Left, iTable, pE
13e60 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74  List);.    subst
13e70 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e  Expr(db, pExpr->
13e80 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20  pRight, iTable, 
13e90 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 75 62  pEList);.    sub
13ea0 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78  stSelect(db, pEx
13eb0 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61  pr->pSelect, iTa
13ec0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
13ed0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
13ee0 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  db, pExpr->pList
13ef0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
13f00 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
13f10 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
13f20 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st(.  sqlite3 *d
13f30 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  b,         /* Re
13f40 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
13f50 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45 78 70  rs here */.  Exp
13f60 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
13f70 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73 63 61    /* List to sca
13f80 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68 20 74  n and in which t
13f90 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
13fa0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  es */.  int iTab
13fb0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
13fc0 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73  Table to be subs
13fd0 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70  tituted */.  Exp
13fe0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
13ff0 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
14000 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  values */.){.  i
14010 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
14020 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
14030 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
14040 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
14050 20 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62      substExpr(db
14060 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
14070 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  xpr, iTable, pEL
14080 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  ist);.  }.}.stat
14090 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
140a0 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ect(.  sqlite3 *
140b0 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  db,         /* R
140c0 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
140d0 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65  ors here */.  Se
140e0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
140f0 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
14100 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20  tement in which 
14110 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
14120 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tions */.  int i
14130 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
14140 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72  /* Table to be r
14150 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70  eplaced */.  Exp
14160 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
14170 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
14180 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53  values */.){.  S
14190 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
141a0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
141b0 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
141c0 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20  t i;.  if( !p ) 
141d0 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45  return;.  substE
141e0 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
141f0 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  EList, iTable, p
14200 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
14210 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
14220 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c  GroupBy, iTable,
14230 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
14240 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
14250 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c  >pOrderBy, iTabl
14260 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75  e, pEList);.  su
14270 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
14280 48 61 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20  Having, iTable, 
14290 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
142a0 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65  Expr(db, p->pWhe
142b0 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  re, iTable, pELi
142c0 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65  st);.  substSele
142d0 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  ct(db, p->pPrior
142e0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
142f0 29 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70  );.  pSrc = p->p
14300 53 72 63 3b 0a 20 20 69 66 28 20 70 53 72 63 20  Src;.  if( pSrc 
14310 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72  ){.    for(i=pSr
14320 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70  c->nSrc, pItem=p
14330 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  Src->a; i>0; i--
14340 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
14350 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62    substSelect(db
14360 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
14370 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
14380 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
14390 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
143a0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
143b0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
143c0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
143d0 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64  VIEW) */..#if !d
143e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
143f0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
14400 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14410 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a  OMIT_VIEW)./*.**
14420 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
14430 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65  tempts to flatte
14440 6e 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  n subqueries in 
14450 6f 72 64 65 72 20 74 6f 20 73 70 65 65 64 0a 2a  order to speed.*
14460 2a 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 49 74  * execution.  It
14470 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69 74   returns 1 if it
14480 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20 61   makes changes a
14490 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74 74  nd 0 if no flatt
144a0 65 6e 69 6e 67 0a 2a 2a 20 6f 63 63 75 72 73 2e  ening.** occurs.
144b0 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73  .**.** To unders
144c0 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74  tand the concept
144d0 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20   of flattening, 
144e0 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c  consider the fol
144f0 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a  lowing.** query:
14500 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
14510 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T a FROM (SELECT
14520 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
14530 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57  1 WHERE z<100) W
14540 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54  HERE a>5.**.** T
14550 68 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f  he default way o
14560 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  f implementing t
14570 68 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20  his query is to 
14580 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73  execute the.** s
14590 75 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e  ubquery first an
145a0 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
145b0 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61  lts in a tempora
145c0 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a  ry table, then.*
145d0 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20  * run the outer 
145e0 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65  query on that te
145f0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20  mporary table.  
14600 54 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77  This requires tw
14610 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72  o.** passes over
14620 20 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74   the data.  Furt
14630 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65  hermore, because
14640 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74   the temporary t
14650 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69  able.** has no i
14660 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52  ndices, the WHER
14670 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  E clause on the 
14680 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e  outer query cann
14690 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a  ot be.** optimiz
146a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
146b0 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20  outine attempts 
146c0 74 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69  to rewrite queri
146d0 65 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61  es such as the a
146e0 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73  bove into.** a s
146f0 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63  ingle flat selec
14700 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  t, like this:.**
14710 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78  .**     SELECT x
14720 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
14730 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20  WHERE z<100 AND 
14740 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  a>5.**.** The co
14750 64 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  de generated for
14760 20 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74   this simpificat
14770 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61  ion gives the sa
14780 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74  me result.** but
14790 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61   only has to sca
147a0 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e  n the data once.
147b0 20 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e    And because in
147c0 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20  dices might .** 
147d0 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62  exist on the tab
147e0 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74  le t1, a complet
147f0 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61  e scan of the da
14800 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  ta might be.** a
14810 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c  voided..**.** Fl
14820 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79  attening is only
14830 20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c   attempted if al
14840 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
14850 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
14860 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75  **   (1)  The su
14870 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
14880 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
14890 74 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65  t both use aggre
148a0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  gates..**.**   (
148b0 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  2)  The subquery
148c0 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
148d0 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65  gate or the oute
148e0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
148f0 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
14900 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
14910 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68   is not the righ
14920 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c  t operand of a l
14930 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a  eft outer join.*
14940 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e  *        (Origin
14950 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36  ally ticket #306
14960 2e 20 20 53 74 72 65 6e 67 68 74 65 6e 65 64 20  .  Strenghtened 
14970 62 79 20 74 69 63 6b 65 74 20 23 33 33 30 30 29  by ticket #3300)
14980 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68  .**.**   (4)  Th
14990 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
149a0 74 20 44 49 53 54 49 4e 43 54 20 6f 72 20 74 68  t DISTINCT or th
149b0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
149c0 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
149d0 2a 2a 20 20 20 28 35 29 20 20 54 68 65 20 73 75  **   (5)  The su
149e0 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49  bquery is not DI
149f0 53 54 49 4e 43 54 20 6f 72 20 74 68 65 20 6f 75  STINCT or the ou
14a00 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e  ter query does n
14a10 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
14a20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
14a30 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75  **   (6)  The su
14a40 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
14a50 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
14a60 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
14a70 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  y is not.**     
14a80 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a     DISTINCT..**.
14a90 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75  **   (7)  The su
14aa0 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f  bquery has a FRO
14ab0 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
14ac0 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75    (8)  The subqu
14ad0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
14ae0 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
14af0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
14b00 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
14b10 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65   (9)  The subque
14b20 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
14b30 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
14b40 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
14b50 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
14b60 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
14b70 2a 20 20 28 31 30 29 20 20 54 68 65 20 73 75 62  *  (10)  The sub
14b80 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
14b90 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
14ba0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
14bb0 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20   does not.**    
14bc0 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a      use LIMIT..*
14bd0 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20  *.**  (11)  The 
14be0 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
14bf0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
14c00 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52  not both have OR
14c10 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a  DER BY clauses..
14c20 2a 2a 0a 2a 2a 20 20 28 31 32 29 20 20 4e 6f 74  **.**  (12)  Not
14c30 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53   implemented.  S
14c40 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73  ubsumed into res
14c50 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57  triction (3).  W
14c60 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  as previously.**
14c70 20 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61          a separa
14c80 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64  te restriction d
14c90 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63  eriving from tic
14ca0 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20  ket #350..**.** 
14cb0 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75   (13)  The subqu
14cc0 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75  ery and outer qu
14cd0 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
14ce0 75 73 65 20 4c 49 4d 49 54 0a 2a 2a 0a 2a 2a 20  use LIMIT.**.** 
14cf0 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75   (14)  The subqu
14d00 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
14d10 20 4f 46 46 53 45 54 0a 2a 2a 0a 2a 2a 20 20 28   OFFSET.**.**  (
14d20 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71  15)  The outer q
14d30 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74  uery is not part
14d40 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
14d50 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20  elect or the.** 
14d60 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20         subquery 
14d70 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 62 6f  does not have bo
14d80 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 61  th an ORDER BY a
14d90 6e 64 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  nd a LIMIT claus
14da0 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65  e..**        (Se
14db0 65 20 74 69 63 6b 65 74 20 23 32 33 33 39 29 0a  e ticket #2339).
14dc0 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65  **.**  (16)  The
14dd0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
14de0 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
14df0 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79   or the subquery
14e00 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20   does.**        
14e10 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  not contain ORDE
14e20 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23  R BY.  (Ticket #
14e30 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64  2942)  This used
14e40 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a   to not matter.*
14e50 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77  *        until w
14e60 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65  e introduced the
14e70 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20   group_concat() 
14e80 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  function.  .**.*
14e90 2a 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62  *  (17)  The sub
14ea0 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20  -query is not a 
14eb0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
14ec0 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f   or it is a UNIO
14ed0 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20  N ALL .**       
14ee0 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65   compound clause
14ef0 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c   made up entirel
14f00 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61  y of non-aggrega
14f10 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20  te queries, and 
14f20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70  .**        the p
14f30 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a  arent query:.**.
14f40 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
14f50 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74   not itself part
14f60 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
14f70 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20  elect,.**       
14f80 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61     * is not an a
14f90 67 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54  ggregate or DIST
14fa0 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a  INCT query, and.
14fb0 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 68 61  **          * ha
14fc0 73 20 6e 6f 20 6f 74 68 65 72 20 74 61 62 6c 65  s no other table
14fd0 73 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 73  s or sub-selects
14fe0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
14ff0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  use..**.**      
15000 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64    The parent and
15010 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63   sub-query may c
15020 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61  ontain WHERE cla
15030 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f  uses. Subject to
15040 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73  .**        rules
15050 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20   (11), (13) and 
15060 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61  (14), they may a
15070 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  lso contain ORDE
15080 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20  R BY,.**        
15090 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
150a0 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
150b0 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75   (18)  If the su
150c0 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
150d0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
150e0 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  en all terms of 
150f0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52  the.**        OR
15100 44 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66  DER by clause of
15110 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74   the parent must
15120 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72   be simple refer
15130 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20  ences to .**    
15140 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74      columns of t
15150 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a  he sub-query..**
15160 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20 73  .**  (19)  The s
15170 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
15180 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
15190 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
151a0 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
151b0 20 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c   have a WHERE cl
151c0 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ause..**.** In t
151d0 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
151e0 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
151f0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
15200 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
15210 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
15220 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
15230 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
15240 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
15250 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
15260 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73  aggregates and s
15270 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20  ubqueryIsAgg is 
15280 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  true if the subq
15290 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
152a0 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66  ates..**.** If f
152b0 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74  lattening is not
152c0 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
152d0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
152e0 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20  -op and returns 
152f0 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  0..** If flatten
15300 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64  ing is attempted
15310 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
15320 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41  turns 1..**.** A
15330 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ll of the expres
15340 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75  sion analysis mu
15350 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68  st occur on both
15360 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
15370 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71   and.** the subq
15380 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73  uery before this
15390 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a   routine runs..*
153a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61  /.static int fla
153b0 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20  ttenSubquery(.  
153c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
153d0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
153e0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
153f0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
15400 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
15410 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  or outer SELECT 
15420 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
15430 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
15440 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
15450 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  p->pSrc->a[] of 
15460 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65  the inner subque
15470 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  ry */.  int isAg
15480 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
15490 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45  True if outer SE
154a0 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67  LECT uses aggreg
154b0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
154c0 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49  .  int subqueryI
154d0 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20  sAgg    /* True 
154e0 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
154f0 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
15500 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
15510 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
15520 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
15530 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
15540 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20  ntext;.  Select 
15550 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65  *pParent;.  Sele
15560 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20  ct *pSub;       
15570 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  /* The inner que
15580 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22  ry or "subquery"
15590 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
155a0 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69  ub1;      /* Poi
155b0 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68  nter to the righ
155c0 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20  tmost select in 
155d0 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53  sub-query */.  S
155e0 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
155f0 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
15600 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
15610 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  er query */.  Sr
15620 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20  cList *pSubSrc; 
15630 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
15640 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
15650 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uery */.  ExprLi
15660 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a  st *pList;    /*
15670 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
15680 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
15690 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ry */.  int iPar
156a0 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  ent;        /* V
156b0 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
156c0 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65  r of the pSub re
156d0 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61  sult set temp ta
156e0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
156f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15700 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
15710 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
15720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15730 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
15740 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
15750 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
15760 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
15770 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
15780 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
15790 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
157a0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
157b0 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
157c0 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
157d0 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
157e0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
157f0 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
15800 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
15810 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
15820 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20  0 );  /* Unable 
15830 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f  to flatten compo
15840 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  und queries */. 
15850 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
15860 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20  .  assert( pSrc 
15870 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69  && iFrom>=0 && i
15880 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20  From<pSrc->nSrc 
15890 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20  );.  pSubitem = 
158a0 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b  &pSrc->a[iFrom];
158b0 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75  .  iParent = pSu
158c0 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bitem->iCursor;.
158d0 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65    pSub = pSubite
158e0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73  m->pSelect;.  as
158f0 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b  sert( pSub!=0 );
15900 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
15910 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20  subqueryIsAgg ) 
15920 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
15930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
15940 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f  triction (1)  */
15950 0a 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49  .  if( subqueryI
15960 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53  sAgg && pSrc->nS
15970 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b  rc>1 ) return 0;
15980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
15990 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f  triction (2)  */
159a0 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75  .  pSubSrc = pSu
159b0 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  b->pSrc;.  asser
159c0 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20  t( pSubSrc );.  
159d0 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73  /* Prior to vers
159e0 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20  ion 3.1.2, when 
159f0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
15a00 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c   had to be simpl
15a10 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a  e constants,.  *
15a20 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20  * not arbitrary 
15a30 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65  expresssions, we
15a40 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f   allowed some co
15a50 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54  mbining of LIMIT
15a60 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
15a70 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f   because they co
15a80 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
15a90 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
15aa0 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54    But when LIMIT
15ab0 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a   and OFFSET.  **
15ac0 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72   became arbitrar
15ad0 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
15ae0 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f  e were forced to
15af0 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e   add restriction
15b00 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20  s (13).  ** and 
15b10 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70  (14). */.  if( p
15b20 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70  Sub->pLimit && p
15b30 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->pLimit ) retur
15b40 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
15b50 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
15b60 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70   (13) */.  if( p
15b70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72  Sub->pOffset ) r
15b80 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
15b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ba0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
15bb0 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 70   (14) */.  if( p
15bc0 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26 20  ->pRightmost && 
15bd0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
15be0 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
15bf0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
15c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
15c30 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a  striction (15) *
15c40 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
15c50 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
15c60 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15c80 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37  * Restriction (7
15c90 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 28 70 53  )  */.  if( ((pS
15ca0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
15cb0 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c  F_Distinct)!=0 |
15cc0 7c 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 29 20  | pSub->pLimit) 
15cd0 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 53  .         && (pS
15ce0 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73  rc->nSrc>1 || is
15cf0 41 67 67 29 20 29 7b 20 20 20 20 20 20 20 20 20  Agg) ){         
15d00 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
15d10 20 28 34 29 28 35 29 28 38 29 28 39 29 20 2a 2f   (4)(5)(8)(9) */
15d20 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
15d30 20 20 20 20 20 20 0a 20 20 7d 0a 20 20 69 66 28        .  }.  if(
15d40 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
15d50 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
15d60 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67  && subqueryIsAgg
15d70 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
15d80 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
15d90 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a  striction (6)  *
15da0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  /.  }.  if( p->p
15db0 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d  OrderBy && pSub-
15dc0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
15dd0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e00 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
15e10 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d  tion (11) */.  }
15e20 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20  .  if( isAgg && 
15e30 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
15e40 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
15e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
15e60 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f  triction (16) */
15e70 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
15e80 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65  mit && p->pWhere
15e90 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
15ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
15eb0 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f  triction (19) */
15ec0 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20  ..  /* OBSOLETE 
15ed0 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20  COMMENT 1:.  ** 
15ee0 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a 20 20  Restriction 3:  
15ef0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
15f00 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20  is a join, make 
15f10 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65 72  sure the subquer
15f20 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75  y is .  ** not u
15f30 73 65 64 20 61 73 20 74 68 65 20 72 69 67 68 74  sed as the right
15f40 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f   operand of an o
15f50 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d  uter join.  Exam
15f60 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69 73  ples of why this
15f70 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c  .  ** is not all
15f80 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  owed:.  **.  ** 
15f90 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20          t1 LEFT 
15fa0 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a  OUTER JOIN (t2 J
15fb0 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a  OIN t3).  **.  *
15fc0 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20  * If we flatten 
15fd0 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f  the above, we wo
15fe0 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a  uld get.  **.  *
15ff0 2a 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45  *         (t1 LE
16000 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32  FT OUTER JOIN t2
16010 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20  ) JOIN t3.  **. 
16020 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e 6f 74   ** which is not
16030 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61 6d 65   at all the same
16040 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a   thing..  **.  *
16050 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45  * OBSOLETE COMME
16060 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72  NT 2:.  ** Restr
16070 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66 20 74  iction 12:  If t
16080 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74  he subquery is t
16090 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
160a0 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72   of a left outer
160b0 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65  .  ** join, make
160c0 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75 65   sure the subque
160d0 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52 45 20  ry has no WHERE 
160e0 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20  clause..  ** An 
160f0 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20  examples of why 
16100 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  this is not allo
16110 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  wed:.  **.  **  
16120 20 20 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f         t1 LEFT O
16130 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43  UTER JOIN (SELEC
16140 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T * FROM t2 WHER
16150 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20  E t2.x>0).  **. 
16160 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
16170 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
16180 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
16190 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
161a0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
161b0 74 32 29 20 57 48 45 52 45 20 74 32 2e 78 3e 30  t2) WHERE t2.x>0
161c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74  .  **.  ** But t
161d0 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74 20 77  he t2.x>0 test w
161e0 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20  ill always fail 
161f0 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66  on a NULL row of
16200 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20   t2, which.  ** 
16210 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f 6e 76  effectively conv
16220 65 72 74 73 20 74 68 65 20 4f 55 54 45 52 20 4a  erts the OUTER J
16230 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45  OIN into an INNE
16240 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a  R JOIN..  **.  *
16250 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44 45 53  * THIS OVERRIDES
16260 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e   OBSOLETE COMMEN
16270 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f 56 45  TS 1 AND 2 ABOVE
16280 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 33  :.  ** Ticket #3
16290 33 30 30 20 73 68 6f 77 73 20 74 68 61 74 20 66  300 shows that f
162a0 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20 72 69  lattening the ri
162b0 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45  ght term of a LE
162c0 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20  FT JOIN.  ** is 
162d0 66 72 61 75 67 68 74 20 77 69 74 68 20 64 61 6e  fraught with dan
162e0 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20 61 76  ger.  Best to av
162f0 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20 74 68  oid the whole th
16300 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20 20 2a  ing.  If the.  *
16310 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  * subquery is th
16320 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20  e right term of 
16330 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  a LEFT JOIN, the
16340 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e  n do not flatten
16350 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53  ..  */.  if( (pS
16360 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
16370 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20   & JT_OUTER)!=0 
16380 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
16390 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72  .  }..  /* Restr
163a0 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20 74 68  iction 17: If th
163b0 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
163c0 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
163d0 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20  , then it must. 
163e0 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65   ** use only the
163f0 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
16400 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66  tor. And none of
16410 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65   the simple sele
16420 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20  ct queries.  ** 
16430 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
16440 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
16450 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
16460 62 65 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  be aggregate or 
16470 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75  distinct.  ** qu
16480 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eries..  */.  if
16490 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29  ( pSub->pPrior )
164a0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50 72  {.    if( p->pPr
164b0 69 6f 72 20 7c 7c 20 69 73 41 67 67 20 7c 7c 20  ior || isAgg || 
164c0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
164d0 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c  F_Distinct)!=0 |
164e0 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  | pSrc->nSrc!=1 
164f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
16500 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  0;.    }.    for
16510 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75  (pSub1=pSub; pSu
16520 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d  b1; pSub1=pSub1-
16530 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
16540 69 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  if( (pSub1->selF
16550 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
16560 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
16570 29 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  ))!=0.       || 
16580 28 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26  (pSub1->pPrior &
16590 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f  & pSub1->op!=TK_
165a0 41 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  ALL) .       || 
165b0 21 70 53 75 62 31 2d 3e 70 53 72 63 20 7c 7c 20  !pSub1->pSrc || 
165c0 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
165d0 63 21 3d 31 0a 20 20 20 20 20 20 29 7b 0a 20 20  c!=1.      ){.  
165e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
165f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
16600 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
16610 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28  n 18. */.    if(
16620 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
16630 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
16640 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
16650 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  <p->pOrderBy->nE
16660 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  xpr; ii++){.    
16670 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
16680 72 42 79 2d 3e 61 5b 69 69 5d 2e 69 43 6f 6c 3d  rBy->a[ii].iCol=
16690 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
166a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
166b0 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65  ..  /***** If we
166c0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
166d0 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  t, flattening is
166e0 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a   permitted. ****
166f0 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69  */..  /* Authori
16700 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ze the subquery 
16710 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  */.  pParse->zAu
16720 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62  thContext = pSub
16730 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73  item->zName;.  s
16740 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
16750 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
16760 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b  ELECT, 0, 0, 0);
16770 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
16780 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64  Context = zSaved
16790 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  AuthContext;..  
167a0 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  /* If the sub-qu
167b0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
167c0 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
167d0 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73  nt, then (by res
167e0 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31  trictions.  ** 1
167f0 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20  7 and 18 above) 
16800 69 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49  it must be a UNI
16810 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70  ON ALL and the p
16820 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74  arent query must
16830 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65   .  ** be of the
16840 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   form:.  **.  **
16850 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70       SELECT <exp
16860 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73  r-list> FROM (<s
16870 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72  ub-query>) <wher
16880 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a  e-clause> .  **.
16890 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79    ** followed by
168a0 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c   any ORDER BY, L
168b0 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53  IMIT and/or OFFS
168c0 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73  ET clauses. This
168d0 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61   block.  ** crea
168e0 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f  tes N-1 copies o
168f0 66 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  f the parent que
16900 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f  ry without any O
16910 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f  RDER BY, LIMIT o
16920 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63  r .  ** OFFSET c
16930 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73  lauses and joins
16940 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66   them to the lef
16950 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74  t-hand-side of t
16960 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  he original.  **
16970 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c   using UNION ALL
16980 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74   operators. In t
16990 68 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68  his case N is th
169a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70  e number of simp
169b0 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73  le.  ** select s
169c0 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65  tatements in the
169d0 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75   compound sub-qu
169e0 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ery..  **.  ** E
169f0 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
16a00 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31  *     SELECT a+1
16a10 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20   FROM (.  **    
16a20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
16a30 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20  M tab.  **      
16a40 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
16a50 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79          SELECT y
16a60 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
16a70 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
16a80 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
16a90 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d  CT abs(z*2) FROM
16aa0 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29   tab2.  **     )
16ab0 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45   WHERE a!=5 ORDE
16ac0 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a  R BY 1.  **.  **
16ad0 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   Transformed int
16ae0 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
16af0 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d   SELECT x+1 FROM
16b00 20 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d   tab WHERE x+1!=
16b10 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e  5.  **     UNION
16b20 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45   ALL.  **     SE
16b30 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61  LECT y+1 FROM ta
16b40 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20  b WHERE y+1!=5. 
16b50 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
16b60 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
16b70 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f  T abs(z*2)+1 FRO
16b80 4d 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73  M tab2 WHERE abs
16b90 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20  (z*2)+1!=5.  ** 
16ba0 20 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20      ORDER BY 1. 
16bb0 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c   **.  ** We call
16bc0 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f   this the "compo
16bd0 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61  und-subquery fla
16be0 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20  ttening"..  */. 
16bf0 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e   for(pSub=pSub->
16c00 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53  pPrior; pSub; pS
16c10 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
16c20 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e  {.    Select *pN
16c30 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  ew;.    ExprList
16c40 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
16c50 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78  pOrderBy;.    Ex
16c60 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  pr *pLimit = p->
16c70 70 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65  pLimit;.    Sele
16c80 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ct *pPrior = p->
16c90 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70  pPrior;.    p->p
16ca0 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
16cb0 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20   p->pSrc = 0;.  
16cc0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
16cd0 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
16ce0 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73   0;.    pNew = s
16cf0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
16d00 64 62 2c 20 70 29 3b 0a 20 20 20 20 70 2d 3e 70  db, p);.    p->p
16d10 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
16d20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
16d30 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
16d40 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
16d50 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41      p->op = TK_A
16d60 4c 4c 3b 0a 20 20 20 20 70 2d 3e 70 52 69 67 68  LL;.    p->pRigh
16d70 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 69  tmost = 0;.    i
16d80 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
16d90 20 20 20 20 70 4e 65 77 20 3d 20 70 50 72 69 6f      pNew = pPrio
16da0 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
16db0 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72      pNew->pPrior
16dc0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
16dd0 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73   pNew->pRightmos
16de0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
16df0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65   p->pPrior = pNe
16e00 77 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  w;.    if( db->m
16e10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
16e20 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
16e30 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69  * Begin flatteni
16e40 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20  ng the iFrom-th 
16e50 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
16e60 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69  M clause .  ** i
16e70 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
16e80 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d  y..  */.  pSub =
16e90 20 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65   pSub1 = pSubite
16ea0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f  m->pSelect;..  /
16eb0 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61  * Delete the tra
16ec0 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
16ed0 75 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65  ucture associate
16ee0 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
16ef0 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  subquery.  */.  
16f00 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16f10 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74  , pSubitem->zDat
16f20 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  abase);.  sqlite
16f30 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
16f40 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  item->zName);.  
16f50 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16f60 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69  , pSubitem->zAli
16f70 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  as);.  pSubitem-
16f80 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a  >zDatabase = 0;.
16f90 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d    pSubitem->zNam
16fa0 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
16fb0 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20  m->zAlias = 0;. 
16fc0 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
16fd0 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65  ct = 0;..  /* De
16fe0 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65  fer deleting the
16ff0 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73   Table object as
17000 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
17010 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
17020 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72  until code gener
17030 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ation is.  ** co
17040 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68  mplete, since th
17050 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78  ere may still ex
17060 69 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e  ist Expr.pTab en
17070 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  tries that.  ** 
17080 72 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62  refer to the sub
17090 71 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72  query even after
170a0 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69   flattening.  Ti
170b0 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2f  cket #3346..  */
170c0 0a 20 20 69 66 28 20 70 53 75 62 69 74 65 6d 2d  .  if( pSubitem-
170d0 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20  >pTab!=0 ){.    
170e0 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c  Table *pTabToDel
170f0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61   = pSubitem->pTa
17100 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54  b;.    if( pTabT
17110 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b  oDel->nRef==1 ){
17120 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
17130 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20  ->pNextZombie = 
17140 70 50 61 72 73 65 2d 3e 70 5a 6f 6d 62 69 65 54  pParse->pZombieT
17150 61 62 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ab;.      pParse
17160 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70  ->pZombieTab = p
17170 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65  TabToDel;.    }e
17180 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54  lse{.      pTabT
17190 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  oDel->nRef--;.  
171a0 20 20 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d    }.    pSubitem
171b0 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a  ->pTab = 0;.  }.
171c0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
171d0 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e  ing loop runs on
171e0 63 65 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d  ce for each term
171f0 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73   in a compound-s
17200 75 62 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61  ubquery.  ** fla
17210 74 74 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63  ttening (as desc
17220 72 69 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49  ribed above).  I
17230 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
17240 20 64 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a   different kind.
17250 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69    ** of flatteni
17260 6e 67 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e  ng - a flattenin
17270 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63  g other than a c
17280 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79  ompound-subquery
17290 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20   flattening -.  
172a0 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f  ** then this loo
172b0 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65  p only runs once
172c0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
172d0 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20   loop moves all 
172e0 6f 66 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d  of the FROM elem
172f0 65 6e 74 73 20 6f 66 20 74 68 65 20 73 75 62 71  ents of the subq
17300 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20  uery into the.  
17310 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
17320 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
17330 71 75 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64  query.  Before d
17340 6f 69 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d  oing this, remem
17350 62 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ber.  ** the cur
17360 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
17370 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65  he original oute
17380 72 20 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65  r query FROM ele
17390 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61  ment in.  ** iPa
173a0 72 65 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65  rent.  The iPare
173b0 6e 74 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e  nt cursor will n
173c0 65 76 65 72 20 62 65 20 75 73 65 64 2e 20 20 53  ever be used.  S
173d0 75 62 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20  ubsequent code. 
173e0 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78   ** will scan ex
173f0 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e  pressions lookin
17400 67 20 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65  g for iParent re
17410 66 65 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70  ferences and rep
17420 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20  lace.  ** those 
17430 72 65 66 65 72 65 6e 63 65 73 20 77 69 74 68 20  references with 
17440 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
17450 20 72 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20   resolve to the 
17460 73 75 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20  subquery FROM.  
17470 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61  ** elements we a
17480 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69  re now copying i
17490 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50  n..  */.  for(pP
174a0 61 72 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74  arent=p; pParent
174b0 3b 20 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e  ; pParent=pParen
174c0 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d  t->pPrior, pSub=
174d0 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
174e0 20 20 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a     int nSubSrc;.
174f0 20 20 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65      int jointype
17500 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 53 72   = 0;.    pSubSr
17510 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 20  c = pSub->pSrc; 
17520 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
17530 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a  se of subquery *
17540 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20 3d 20  /.    nSubSrc = 
17550 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20  pSubSrc->nSrc;  
17560 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
17570 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79 20 46  ms in subquery F
17580 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
17590 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74    pSrc = pParent
175a0 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46  ->pSrc;     /* F
175b0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
175c0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
175d0 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 20 29  ..    if( pSrc )
175e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
175f0 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f  pParent==p );  /
17600 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74 68 72  * First time thr
17610 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  ough the loop */
17620 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20  .      jointype 
17630 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e  = pSubitem->join
17640 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  type;.    }else{
17650 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17660 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a  Parent!=p );  /*
17670 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
17680 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67  ent times throug
17690 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
176a0 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
176b0 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  nt->pSrc = sqlit
176c0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
176d0 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  db, 0, 0, 0);.  
176e0 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20      if( pSrc==0 
176f0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
17700 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
17710 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62  led );.        b
17720 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
17730 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
17740 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20  subquery uses a 
17750 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74  single slot of t
17760 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
17770 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20  f the outer.    
17780 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68  ** query.  If th
17790 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d  e subquery has m
177a0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65  ore than one ele
177b0 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d  ment in its FROM
177c0 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20   clause,.    ** 
177d0 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20  then expand the 
177e0 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d  outer query to m
177f0 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74  ake space for it
17800 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65   to hold all ele
17810 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20  ments.    ** of 
17820 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
17830 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
17840 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
17850 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
17860 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43  ROM tabA, (SELEC
17870 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73  T * FROM sub1, s
17880 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20  ub2), tabB;.    
17890 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75  **.    ** The ou
178a0 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20  ter query has 3 
178b0 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f  slots in its FRO
178c0 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73  M clause.  One s
178d0 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  lot of the.    *
178e0 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74  * outer query (t
178f0 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20  he middle slot) 
17900 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  is used by the s
17910 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65  ubquery.  The ne
17920 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  xt.    ** block 
17930 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70  of code will exp
17940 61 6e 64 20 74 68 65 20 6f 75 74 20 71 75 65 72  and the out quer
17950 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20 20 54  y to 4 slots.  T
17960 68 65 20 6d 69 64 64 6c 65 0a 20 20 20 20 2a 2a  he middle.    **
17970 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e 64 65   slot is expande
17980 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69  d to two slots i
17990 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b 65 20  n order to make 
179a0 73 70 61 63 65 20 66 6f 72 20 74 68 65 0a 20 20  space for the.  
179b0 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74    ** two element
179c0 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
179d0 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
179e0 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
179f0 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31 20 29   if( nSubSrc>1 )
17a00 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
17a10 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d 20 73  >pSrc = pSrc = s
17a20 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
17a30 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c 20 6e  arge(db, pSrc, n
17a40 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31  SubSrc-1,iFrom+1
17a50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
17a60 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
17a70 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
17a80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
17a90 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74     /* Transfer t
17aa0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
17ab0 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 73 75  erms from the su
17ac0 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65 0a  bquery into the.
17ad0 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
17ae0 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ry..    */.    f
17af0 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72  or(i=0; i<nSubSr
17b00 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  c; i++){.      p
17b10 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20  Src->a[i+iFrom] 
17b20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b  = pSubSrc->a[i];
17b30 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
17b40 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c  SubSrc->a[i], 0,
17b50 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d   sizeof(pSubSrc-
17b60 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20  >a[i]));.    }. 
17b70 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d     pSrc->a[iFrom
17b80 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  ].jointype = joi
17b90 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a  ntype;.  .    /*
17ba0 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
17bb0 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
17bc0 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
17bd0 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20  essions for .   
17be0 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
17bf0 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
17c00 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
17c10 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
17c20 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
17c30 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
17c40 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
17c50 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
17c60 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
17c70 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
17c80 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20      **   \      
17c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
17ca0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
17cb0 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
17cc0 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
17cd0 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
17ce0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
17cf0 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
17d00 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
17d10 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a  _________/.    *
17d20 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b  *.    ** We look
17d30 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
17d40 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
17d50 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
17d60 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
17d70 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62     ** "a" we sub
17d80 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
17d90 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
17da0 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
17db0 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
17dc0 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20     */.    pList 
17dd0 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73  = pParent->pELis
17de0 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  t;.    for(i=0; 
17df0 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
17e00 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
17e10 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69   *pExpr;.      i
17e20 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  f( pList->a[i].z
17e30 4e 61 6d 65 3d 3d 30 20 26 26 20 28 70 45 78 70  Name==0 && (pExp
17e40 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
17e50 70 45 78 70 72 29 2d 3e 73 70 61 6e 2e 7a 21 3d  pExpr)->span.z!=
17e60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69  0 ){.        pLi
17e70 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
17e80 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
17e90 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
17ea0 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 45 78  p(db, (char*)pEx
17eb0 70 72 2d 3e 73 70 61 6e 2e 7a 2c 20 70 45 78 70  pr->span.z, pExp
17ec0 72 2d 3e 73 70 61 6e 2e 6e 29 3b 0a 20 20 20 20  r->span.n);.    
17ed0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 75    }.    }.    su
17ee0 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
17ef0 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c  pParent->pEList,
17f00 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
17f10 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  pEList);.    if(
17f20 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20   isAgg ){.      
17f30 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
17f40 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75  , pParent->pGrou
17f50 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  pBy, iParent, pS
17f60 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
17f70 20 20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c     substExpr(db,
17f80 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
17f90 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  g, iParent, pSub
17fa0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  ->pEList);.    }
17fb0 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
17fc0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
17fd0 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
17fe0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
17ff0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
18000 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d  pOrderBy = pSub-
18010 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
18020 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
18030 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
18040 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  f( pParent->pOrd
18050 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73 75  erBy ){.      su
18060 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
18070 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
18080 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
18090 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  ->pEList);.    }
180a0 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
180b0 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70  Where ){.      p
180c0 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
180d0 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  xprDup(db, pSub-
180e0 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 65  >pWhere);.    }e
180f0 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72  lse{.      pWher
18100 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 0;.    }.   
18110 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
18120 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  gg ){.      asse
18130 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  rt( pParent->pHa
18140 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ving==0 );.     
18150 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
18160 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  g = pParent->pWh
18170 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65  ere;.      pPare
18180 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  nt->pWhere = pWh
18190 65 72 65 3b 0a 20 20 20 20 20 20 73 75 62 73 74  ere;.      subst
181a0 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
181b0 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65  ->pHaving, iPare
181c0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
181d0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
181e0 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
181f0 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
18200 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c  Parent->pHaving,
18210 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
18220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18230 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
18240 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61  up(db, pSub->pHa
18250 76 69 6e 67 29 29 3b 0a 20 20 20 20 20 20 61 73  ving));.      as
18260 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
18270 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20  GroupBy==0 );.  
18280 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 47 72      pParent->pGr
18290 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
182a0 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
182b0 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  Sub->pGroupBy);.
182c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
182d0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
182e0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20  Parent->pWhere, 
182f0 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
18300 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50  EList);.      pP
18310 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
18320 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
18330 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65  b, pParent->pWhe
18340 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20  re, pWhere);.   
18350 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65   }.  .    /* The
18360 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79   flattened query
18370 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20   is distinct if 
18380 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72  either the inner
18390 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f   or the.    ** o
183a0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69  uter query is di
183b0 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a  stinct. .    */.
183c0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c      pParent->sel
183d0 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73  Flags |= pSub->s
183e0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
183f0 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a  tinct;.  .    /*
18400 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e  .    ** SELECT .
18410 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20  .. FROM (SELECT 
18420 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53  ... LIMIT a OFFS
18430 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46  ET b) LIMIT x OF
18440 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20  FSET y;.    **. 
18450 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d     ** One is tem
18460 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61  pted to try to a
18470 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f  dd a and b to co
18480 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73  mbine the limits
18490 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20  .  But this.    
184a0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  ** does not work
184b0 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74   if either limit
184c0 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20   is negative..  
184d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75    */.    if( pSu
184e0 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
184f0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d     pParent->pLim
18500 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69  it = pSub->pLimi
18510 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  t;.      pSub->p
18520 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d  Limit = 0;.    }
18530 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61  .  }..  /* Finia
18540 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74  lly, delete what
18550 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20   is left of the 
18560 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74  subquery and ret
18570 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  urn.  ** success
18580 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
18590 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
185a0 20 70 53 75 62 31 29 3b 0a 0a 20 20 72 65 74 75   pSub1);..  retu
185b0 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
185c0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
185d0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
185e0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
185f0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
18600 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  /../*.** Analyze
18610 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
18620 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
18630 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73  an argument to s
18640 65 65 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 61  ee if it.** is a
18650 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 20   min() or max() 
18660 71 75 65 72 79 2e 20 52 65 74 75 72 6e 20 57 48  query. Return WH
18670 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
18680 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  or WHERE_ORDERBY
18690 5f 4d 41 58 20 69 66 20 0a 2a 2a 20 69 74 20 69  _MAX if .** it i
186a0 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73  s, or 0 otherwis
186b0 65 2e 20 41 74 20 70 72 65 73 65 6e 74 2c 20 61  e. At present, a
186c0 20 71 75 65 72 79 20 69 73 20 63 6f 6e 73 69 64   query is consid
186d0 65 72 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20  ered to be.** a 
186e0 6d 69 6e 28 29 2f 6d 61 78 28 29 20 71 75 65 72  min()/max() quer
186f0 79 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e  y if:.**.**   1.
18700 20 54 68 65 72 65 20 69 73 20 61 20 73 69 6e 67   There is a sing
18710 6c 65 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  le object in the
18720 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a   FROM clause..**
18730 0a 2a 2a 20 20 20 32 2e 20 54 68 65 72 65 20 69  .**   2. There i
18740 73 20 61 20 73 69 6e 67 6c 65 20 65 78 70 72 65  s a single expre
18750 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73  ssion in the res
18760 75 6c 74 20 73 65 74 2c 20 61 6e 64 20 69 74 20  ult set, and it 
18770 69 73 0a 2a 2a 20 20 20 20 20 20 65 69 74 68 65  is.**      eithe
18780 72 20 6d 69 6e 28 78 29 20 6f 72 20 6d 61 78 28  r min(x) or max(
18790 78 29 2c 20 77 68 65 72 65 20 78 20 69 73 20 61  x), where x is a
187a0 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63   column referenc
187b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
187c0 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 53 65 6c   minMaxQuery(Sel
187d0 65 63 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 20  ect *p){.  Expr 
187e0 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72 4c 69  *pExpr;.  ExprLi
187f0 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e  st *pEList = p->
18800 70 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70  pEList;..  if( p
18810 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
18820 29 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f  ) return WHERE_O
18830 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
18840 20 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d   pExpr = pEList-
18850 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 70  >a[0].pExpr;.  p
18860 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  EList = pExpr->p
18870 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 45 78 70  List;.  if( pExp
18880 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
18890 4e 43 54 49 4f 4e 20 7c 7c 20 70 45 4c 69 73 74  NCTION || pEList
188a0 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e  ==0 || pEList->n
188b0 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e  Expr!=1 ) return
188c0 20 30 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74   0;.  if( pEList
188d0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
188e0 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
188f0 29 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f  ) return WHERE_O
18900 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
18910 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65   if( pExpr->toke
18920 6e 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e 20  n.n!=3 ) return 
18930 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f  WHERE_ORDERBY_NO
18940 52 4d 41 4c 3b 0a 20 20 69 66 28 20 73 71 6c 69  RMAL;.  if( sqli
18950 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61  te3StrNICmp((cha
18960 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  r*)pExpr->token.
18970 7a 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b  z,"min",3)==0 ){
18980 0a 20 20 20 20 72 65 74 75 72 6e 20 57 48 45 52  .    return WHER
18990 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20  E_ORDERBY_MIN;. 
189a0 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
189b0 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
189c0 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
189d0 2c 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"max",3)==0 ){.
189e0 20 20 20 20 72 65 74 75 72 6e 20 57 48 45 52 45      return WHERE
189f0 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20  _ORDERBY_MAX;.  
18a00 7d 0a 20 20 72 65 74 75 72 6e 20 57 48 45 52 45  }.  return WHERE
18a10 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
18a20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
18a30 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65   source-list ite
18a40 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  m passed as an a
18a50 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d  rgument was augm
18a60 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a  ented with an.**
18a70 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
18a80 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20  se, then try to 
18a90 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69  locate the speci
18aa0 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74  fied index. If t
18ab0 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68  here.** was such
18ac0 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68   a clause and th
18ad0 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61  e named index ca
18ae0 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72  nnot be found, r
18af0 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
18b00 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65  _ERROR and leave
18b10 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61   an error in pPa
18b20 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rse. Otherwise, 
18b30 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72  populate .** pFr
18b40 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72  om->pIndex and r
18b50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
18b60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
18b70 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50  ndexedByLookup(P
18b80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74  arse *pParse, st
18b90 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
18ba0 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  m *pFrom){.  if(
18bb0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20   pFrom->pTab && 
18bc0 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b  pFrom->zIndex ){
18bd0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
18be0 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
18bf0 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78      char *zIndex
18c00 20 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78   = pFrom->zIndex
18c10 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
18c20 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
18c30 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20  pTab->pIndex; . 
18c40 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73         pIdx && s
18c50 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
18c60 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65  dx->zName, zInde
18c70 78 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64  x); .        pId
18c80 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20  x=pIdx->pNext.  
18c90 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49    );.    if( !pI
18ca0 64 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  dx ){.      sqli
18cb0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
18cc0 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64  se, "no such ind
18cd0 65 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c  ex: %s", zIndex,
18ce0 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
18cf0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
18d00 20 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d      }.    pFrom-
18d10 3e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  >pIndex = pIdx;.
18d20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
18d30 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
18d40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
18d50 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61   a Walker callba
18d60 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e  ck for "expandin
18d70 67 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  g" a SELECT stat
18d80 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e  ement..** "Expan
18d90 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64  ding" means to d
18da0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  o the following:
18db0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d  .**.**    (1)  M
18dc0 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75  ake sure VDBE cu
18dd0 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
18de0 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
18df0 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20  to every.**     
18e00 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74      element of t
18e10 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
18e20 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69  **.**    (2)  Fi
18e30 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  ll in the pTabLi
18e40 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  st->a[].pTab fie
18e50 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69  lds in the SrcLi
18e60 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20  st that .**     
18e70 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d      defines FROM
18e80 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76   clause.  When v
18e90 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74  iews appear in t
18ea0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a  he FROM clause,.
18eb0 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20  **         fill 
18ec0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53  pTabList->a[].pS
18ed0 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70  elect with a cop
18ee0 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
18ef0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
18f00 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d       that implem
18f10 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20  ents the view.  
18f20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f  A copy is made o
18f30 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c  f the view's SEL
18f40 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  ECT.**         s
18f50 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74  tatement so that
18f60 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d   we can freely m
18f70 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20  odify or delete 
18f80 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a  that statement.*
18f90 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75  *         withou
18fa0 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74  t worrying about
18fb0 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20   messing up the 
18fc0 70 72 65 73 69 73 74 65 6e 74 20 72 65 70 72 65  presistent repre
18fd0 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20  sentation.**    
18fe0 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77       of the view
18ff0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20  ..**.**    (3)  
19000 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65  Add terms to the
19010 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
19020 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20   accomodate the 
19030 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a  NATURAL keyword.
19040 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f  **         on jo
19050 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61  ins and the ON a
19060 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  nd USING clause 
19070 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20  of joins..**.** 
19080 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65     (4)  Scan the
19090 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
190a0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
190b0 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b  et (pEList) look
190c0 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ing.**         f
190d0 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  or instances of 
190e0 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  the "*" operator
190f0 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20   or the TABLE.* 
19100 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20  operator..**    
19110 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65       If found, e
19120 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74  xpand each "*" t
19130 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
19140 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65  n in every table
19150 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20  .**         and 
19160 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76  TABLE.* to be ev
19170 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41  ery column in TA
19180 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  BLE..**.*/.stati
19190 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61  c int selectExpa
191a0 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61  nder(Walker *pWa
191b0 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
191c0 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
191d0 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
191e0 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  rse;.  int i, j,
191f0 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   k;.  SrcList *p
19200 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
19210 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
19220 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
19230 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c  em *pFrom;.  sql
19240 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
19250 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 64 62  e->db;..  if( db
19260 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20  ->mallocFailed  
19270 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
19280 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69  C_Abort;.  }.  i
19290 66 28 20 70 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c  f( p->pSrc==0 ||
192a0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
192b0 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20  SF_Expanded)!=0 
192c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
192d0 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70  C_Prune;.  }.  p
192e0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
192f0 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 70 54 61  _Expanded;.  pTa
19300 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
19310 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
19320 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  EList;..  /* Mak
19330 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
19340 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
19350 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
19360 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
19370 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
19380 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
19390 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
193a0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
193b0 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
193c0 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a  se, pTabList);..
193d0 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
193e0 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69  ry table named i
193f0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
19400 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  e of the select.
19410 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74    If.  ** an ent
19420 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
19430 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75  lause is a subqu
19440 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ery instead of a
19450 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a   table or view,.
19460 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65    ** then create
19470 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
19480 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  le structure to 
19490 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62  describe the sub
194a0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
194b0 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
194c0 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
194d0 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
194e0 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
194f0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
19500 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21  if( pFrom->pTab!
19510 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
19520 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61  his statement ha
19530 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
19540 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20  repared.  There 
19550 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20  is no need.     
19560 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65   ** to go furthe
19570 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  r. */.      asse
19580 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( i==0 );.    
19590 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
195a0 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ne;.    }.    if
195b0 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d  ( pFrom->zName==
195c0 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
195d0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
195e0 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  Y.      Select *
195f0 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
19600 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20  elect;.      /* 
19610 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
19620 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
19630 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
19640 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c      assert( pSel
19650 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
19660 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
19670 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
19680 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
19690 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
196a0 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
196b0 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
196c0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
196d0 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29  , sizeof(Table))
196e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
196f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
19700 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54  _Abort;.      pT
19710 61 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  ab->db = db;.   
19720 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20     pTab->nRef = 
19730 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  1;.      pTab->z
19740 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
19750 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74  rintf(db, "sqlit
19760 65 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c  e_subquery_%p_",
19770 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20   (void*)pTab);. 
19780 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c       while( pSel
19790 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c  ->pPrior ){ pSel
197a0 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b   = pSel->pPrior;
197b0 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 43   }.      selectC
197c0 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
197d0 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  st(pParse, pSel-
197e0 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e  >pEList, &pTab->
197f0 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
19800 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  l);.      pTab->
19810 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
19820 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
19830 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c   |= TF_Ephemeral
19840 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
19850 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
19860 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f  ordinary table o
19870 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74  r view name in t
19880 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
19890 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
198a0 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
198b0 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
198c0 54 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20  Tab = pTab = .  
198d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
198e0 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
198f0 30 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70  0,pFrom->zName,p
19900 46 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  From->zDatabase)
19910 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
19920 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
19930 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54  _Abort;.      pT
19940 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20  ab->nRef++;.#if 
19950 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
19960 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
19970 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f  efined (SQLITE_O
19980 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
19990 29 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ).      if( pTab
199a0 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56  ->pSelect || IsV
199b0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
199c0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65          /* We re
199d0 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20  ach here if the 
199e0 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61  named table is a
199f0 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a   really a view *
19a00 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
19a10 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
19a20 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
19a30 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57  pTab) ) return W
19a40 52 43 5f 41 62 6f 72 74 3b 0a 0a 20 20 20 20 20  RC_Abort;..     
19a50 20 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e     /* If pFrom->
19a60 70 53 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65  pSelect!=0 it me
19a70 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69  ans we are deali
19a80 6e 67 20 77 69 74 68 20 61 0a 20 20 20 20 20 20  ng with a.      
19a90 20 20 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e    ** view within
19aa0 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 53 45   a view.  The SE
19ab0 4c 45 43 54 20 73 74 72 75 63 74 75 72 65 20 68  LECT structure h
19ac0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a  as already been.
19ad0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65          ** copie
19ae0 64 20 62 79 20 74 68 65 20 6f 75 74 65 72 20 76  d by the outer v
19af0 69 65 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b  iew so we can sk
19b00 69 70 20 74 68 65 20 63 6f 70 79 20 73 74 65 70  ip the copy step
19b10 20 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a   here.        **
19b20 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69   in the inner vi
19b30 65 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ew..        */. 
19b40 20 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d         if( pFrom
19b50 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a  ->pSelect==0 ){.
19b60 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d            pFrom-
19b70 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
19b80 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
19b90 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  pTab->pSelect);.
19ba0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19bb0 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
19bc0 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ker, pFrom->pSel
19bd0 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ect);.        }.
19be0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
19bf0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63     }..    /* Loc
19c00 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61  ate the index na
19c10 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58  med by the INDEX
19c20 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66  ED BY clause, if
19c30 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28   any. */.    if(
19c40 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
19c50 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  yLookup(pParse, 
19c60 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20  pFrom) ){.      
19c70 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
19c80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
19c90 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41  * Process NATURA
19ca0 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20  L keywords, and 
19cb0 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
19cc0 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20  uses of joins.. 
19cd0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
19ce0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71  llocFailed || sq
19cf0 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
19d00 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20  pParse, p) ){.  
19d10 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
19d20 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f  rt;.  }..  /* Fo
19d30 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74  r every "*" that
19d40 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63   occurs in the c
19d50 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65  olumn list, inse
19d60 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  rt the names of.
19d70 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73    ** all columns
19d80 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20   in all tables. 
19d90 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54   And for every T
19da0 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68  ABLE.* insert th
19db0 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20  e names.  ** of 
19dc0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54  all columns in T
19dd0 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65  ABLE.  The parse
19de0 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65  r inserted a spe
19df0 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a  cial expression.
19e00 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b    ** with the TK
19e10 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f  _ALL operator fo
19e20 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20  r each "*" that 
19e30 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  it found in the 
19e40 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a  column list..  *
19e50 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
19e60 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f  code just has to
19e70 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41   locate the TK_A
19e80 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  LL expressions a
19e90 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65  nd expand.  ** e
19ea0 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c  ach one to the l
19eb0 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d  ist of all colum
19ec0 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
19ed0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
19ee0 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20  first loop just 
19ef0 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
19f00 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22   there are any "
19f10 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a  *" operators.  *
19f20 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61  * that need expa
19f30 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nding..  */.  fo
19f40 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
19f50 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
19f60 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c    Expr *pE = pEL
19f70 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
19f80 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
19f90 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
19fa0 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
19fb0 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
19fc0 52 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69  Right && pE->pRi
19fd0 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a  ght->op==TK_ALL.
19fe0 20 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e           && pE->
19ff0 70 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65  pLeft && pE->pLe
1a000 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20  ft->op==TK_ID ) 
1a010 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
1a020 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
1a030 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
1a040 2a 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65  * If we get here
1a050 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65   it means the re
1a060 73 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e  sult set contain
1a070 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a  s one or more "*
1a080 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f  ".    ** operato
1a090 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  rs that need to 
1a0a0 62 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f  be expanded.  Lo
1a0b0 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
1a0c0 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
1a0d0 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
1a0e0 73 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74  set and expand t
1a0f0 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  hem one by one..
1a100 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63      */.    struc
1a110 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1a120 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a  *a = pEList->a;.
1a130 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e      ExprList *pN
1a140 65 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ew = 0;.    int 
1a150 66 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e  flags = pParse->
1a160 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69  db->flags;.    i
1a170 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28  nt longNames = (
1a180 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
1a190 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a  ullColNames)!=0.
1a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1b0 20 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20        && (flags 
1a1c0 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
1a1d0 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20  lNames)==0;..   
1a1e0 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69   for(k=0; k<pELi
1a1f0 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b  st->nExpr; k++){
1a200 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20  .      Expr *pE 
1a210 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[k].pExpr;.  
1a220 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
1a230 54 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20 20  TK_ALL &&.      
1a240 20 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b       (pE->op!=TK
1a250 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67  _DOT || pE->pRig
1a260 68 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69  ht==0 || pE->pRi
1a270 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ght->op!=TK_ALL)
1a280 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1a290 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65  his particular e
1a2a0 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e  xpression does n
1a2b0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  ot need to be ex
1a2c0 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20  panded..        
1a2d0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
1a2e0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1a2f0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
1a300 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
1a310 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
1a320 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
1a330 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
1a340 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65  ->nExpr-1].zName
1a350 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20   = a[k].zName;. 
1a360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a370 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
1a380 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e  .        a[k].zN
1a390 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ame = 0;.      }
1a3a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
1a3b0 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
1a3c0 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22   is a "*" or a "
1a3d0 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65  TABLE.*" and nee
1a3e0 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20  ds to be.       
1a3f0 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f   ** expanded. */
1a400 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62  .        int tab
1a410 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20  leSeen = 0;     
1a420 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65   /* Set to 1 whe
1a430 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20  n TABLE matches 
1a440 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  */.        char 
1a450 2a 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  *zTName;        
1a460 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e      /* text of n
1a470 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a  ame of TABLE */.
1a480 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e          if( pE->
1a490 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45  op==TK_DOT && pE
1a4a0 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
1a4b0 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71       zTName = sq
1a4c0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1a4d0 65 6e 28 64 62 2c 20 26 70 45 2d 3e 70 4c 65 66  en(db, &pE->pLef
1a4e0 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  t->token);.     
1a4f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a500 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a      zTName = 0;.
1a510 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a520 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
1a530 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
1a540 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
1a550 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
1a560 20 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a           Table *
1a570 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
1a580 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ab;.          ch
1a590 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
1a5a0 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  From->zAlias;.  
1a5b0 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
1a5c0 4e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e  Name==0 || zTabN
1a5d0 61 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20  ame[0]==0 ){ .  
1a5e0 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61            zTabNa
1a5f0 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
1a600 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1a610 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
1a620 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62  mallocFailed ) b
1a630 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1a640 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71  if( zTName && sq
1a650 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e  lite3StrICmp(zTN
1a660 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d  ame, zTabName)!=
1a670 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1a680 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1a690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1a6a0 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a   tableSeen = 1;.
1a6b0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
1a6c0 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
1a6d0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
1a6e0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20     Expr *pExpr, 
1a6f0 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  *pRight;.       
1a700 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
1a710 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
1a720 2e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20  .zName;..       
1a730 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c       /* If a col
1a740 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73  umn is marked as
1a750 20 27 68 69 64 64 65 6e 27 20 28 63 75 72 72 65   'hidden' (curre
1a760 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62  ntly only possib
1a770 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  le.            *
1a780 2a 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61  * for virtual ta
1a790 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e  bles), do not in
1a7a0 63 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65 20  clude it in the 
1a7b0 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20  expanded.       
1a7c0 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73       ** result-s
1a7d0 65 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20  et list..       
1a7e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1a7f0 20 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e      if( IsHidden
1a800 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43  Column(&pTab->aC
1a810 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20  ol[j]) ){.      
1a820 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 49          assert(I
1a830 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b  sVirtual(pTab));
1a840 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
1a850 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1a860 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1a870 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20      if( i>0 ){. 
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
1a890 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1a8a0 20 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62 4c   *pLeft = &pTabL
1a8b0 69 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20  ist->a[i-1];.   
1a8c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
1a8d0 70 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79 70  pLeft[1].jointyp
1a8e0 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
1a8f0 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
1a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
1a910 6c 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d  lumnIndex(pLeft-
1a920 3e 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30  >pTab, zName)>=0
1a930 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1a940 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55      /* In a NATU
1a950 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74  RAL join, omit t
1a960 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20  he join columns 
1a970 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20  from the .      
1a980 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62            ** tab
1a990 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  le on the right 
1a9a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1a9b0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1a9c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1a9d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
1a9e0 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
1a9f0 78 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73 69 6e  x(pLeft[1].pUsin
1aa00 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
1aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74  /* In a join wit
1aa30 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  h a USING clause
1aa40 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69  , omit columns i
1aa50 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
1aa60 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
1aa70 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
1aa80 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
1aa90 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
1aaa0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1aab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1aac0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1aad0 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
1aae0 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
1aaf0 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30  pParse, TK_ID, 0
1ab00 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
1ab10 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 3d       if( pRight=
1ab20 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1ab30 20 20 20 20 20 20 20 20 73 65 74 51 75 6f 74 65          setQuote
1ab40 64 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 26  dToken(pParse, &
1ab50 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a  pRight->token, z
1ab60 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
1ab70 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73     if( longNames
1ab80 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   || pTabList->nS
1ab90 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rc>1 ){.        
1aba0 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
1abb0 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
1abc0 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20  (pParse, TK_ID, 
1abd0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
1abe0 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
1abf0 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
1ac00 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65  rse, TK_DOT, pLe
1ac10 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a  ft, pRight, 0);.
1ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1ac30 28 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65  ( pExpr==0 ) bre
1ac40 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
1ac50 20 20 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e    setQuotedToken
1ac60 28 70 50 61 72 73 65 2c 20 26 70 4c 65 66 74 2d  (pParse, &pLeft-
1ac70 3e 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65  >token, zTabName
1ac80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1ac90 20 73 65 74 54 6f 6b 65 6e 28 26 70 45 78 70 72   setToken(&pExpr
1aca0 2d 3e 73 70 61 6e 2c 20 0a 20 20 20 20 20 20 20  ->span, .       
1acb0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1acc0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
1acd0 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c  s.%s", zTabName,
1ace0 20 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20   zName));.      
1acf0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73          pExpr->s
1ad00 70 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20  pan.dyn = 1;.   
1ad10 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1ad20 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20  ->token.z = 0;. 
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1ad40 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b  pr->token.n = 0;
1ad50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1ad60 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  Expr->token.dyn 
1ad70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
1ad80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ad90 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52        pExpr = pR
1ada0 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
1adb0 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20      pExpr->span 
1adc0 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a  = pExpr->token;.
1add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1ade0 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20  xpr->span.dyn = 
1adf0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
1ae00 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1ae10 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20   longNames ){.  
1ae20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
1ae30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1ae40 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
1ae50 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70   pNew, pExpr, &p
1ae60 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20  Expr->span);.   
1ae70 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1ae80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
1ae90 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
1aea0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
1aeb0 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20  e, pNew, pExpr, 
1aec0 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b  &pRight->token);
1aed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1aee0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1aef0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1af00 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20   !tableSeen ){. 
1af10 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
1af20 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
1af30 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1af40 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
1af50 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
1af60 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  zTName);.       
1af70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1af80 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1af90 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1afa0 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69  o tables specifi
1afb0 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed");.          
1afc0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1afd0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1afe0 65 28 64 62 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20  e(db, zTName);. 
1aff0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b000 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1b010 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73  Delete(db, pELis
1b020 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73  t);.    p->pELis
1b030 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69  t = pNew;.  }.#i
1b040 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  f SQLITE_MAX_COL
1b050 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c  UMN.  if( p->pEL
1b060 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74  ist && p->pEList
1b070 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d  ->nExpr>db->aLim
1b080 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
1b090 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73  COLUMN] ){.    s
1b0a0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1b0b0 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
1b0c0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
1b0d0 6c 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65  lt set");.  }.#e
1b0e0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52  ndif.  return WR
1b0f0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
1b100 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69  *.** No-op routi
1b110 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  ne for the parse
1b120 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a  -tree walker..**
1b130 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
1b140 75 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c  utine is the Wal
1b150 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
1b160 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f  k then expressio
1b170 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77  n trees.** are w
1b180 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e  alked without an
1b190 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20  y actions being 
1b1a0 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f  taken at each no
1b1b0 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c  de.  Presumably,
1b1c0 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f  .** when this ro
1b1d0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
1b1e0 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  r Walker.xExprCa
1b1f0 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20  llback then .** 
1b200 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
1b210 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f  llback is set to
1b220 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73   do something us
1b230 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a  eful for every .
1b240 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74  ** subquery in t
1b250 68 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a  he parser tree..
1b260 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
1b270 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65  prWalkNoop(Walke
1b280 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72  r *NotUsed, Expr
1b290 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55   *NotUsed2){.  U
1b2a0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
1b2b0 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
1b2c0 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  d2);.  return WR
1b2d0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
1b2e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b2f0 65 20 22 65 78 70 61 6e 64 73 22 20 61 20 53 45  e "expands" a SE
1b300 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61  LECT statement a
1b310 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75  nd all of its su
1b320 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72  bqueries..** For
1b330 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
1b340 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20  rmation on what 
1b350 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70  it means to "exp
1b360 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a  and" a SELECT.**
1b370 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20   statement, see 
1b380 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  the comment on t
1b390 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20  he selectExpand 
1b3a0 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20  worker callback 
1b3b0 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70  above..**.** Exp
1b3c0 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20  anding a SELECT 
1b3d0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65  statement is the
1b3e0 20 66 69 72 73 74 20 73 74 65 70 20 69 6e 20 70   first step in p
1b3f0 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53  rocessing a.** S
1b400 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1b410 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61    The SELECT sta
1b420 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65  tement must be e
1b430 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a  xpanded before.*
1b440 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  * name resolutio
1b450 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a  n is performed..
1b460 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e  **.** If anythin
1b470 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e  g goes wrong, an
1b480 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
1b490 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70  s written into p
1b4a0 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61  Parse..** The ca
1b4b0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  lling function c
1b4c0 61 6e 20 64 65 74 65 63 74 20 74 68 65 20 70 72  an detect the pr
1b4d0 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67  oblem by looking
1b4e0 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   at pParse->nErr
1b4f0 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73  .** and/or pPars
1b500 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
1b510 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  led..*/.static v
1b520 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
1b530 74 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70  tExpand(Parse *p
1b540 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
1b550 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65  Select){.  Walke
1b560 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  r w;.  w.xSelect
1b570 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
1b580 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78  tExpander;.  w.x
1b590 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
1b5a0 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
1b5b0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
1b5c0 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  ;.  sqlite3WalkS
1b5d0 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
1b5e0 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  t);.}...#ifndef 
1b5f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1b600 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  UERY./*.** This 
1b610 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c  is a Walker.xSel
1b620 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c  ectCallback call
1b630 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c  back for the sql
1b640 69 74 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e  ite3SelectTypeIn
1b650 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63  fo().** interfac
1b660 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63  e..**.** For eac
1b670 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  h FROM-clause su
1b680 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75  bquery, add Colu
1b690 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c  mn.zType and Col
1b6a0 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66  umn.zColl.** inf
1b6b0 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  ormation to the 
1b6c0 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
1b6d0 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20  that represents 
1b6e0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a  the result set.*
1b6f0 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71 75 65  * of that subque
1b700 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61  ry..**.** The Ta
1b710 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
1b720 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  at represents th
1b730 65 20 72 65 73 75 6c 74 20 73 65 74 20 77 61 73  e result set was
1b740 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20   constructed.** 
1b750 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65  by selectExpande
1b760 72 28 29 20 62 75 74 20 74 68 65 20 74 79 70 65  r() but the type
1b770 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69   and collation i
1b780 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f  nformation was o
1b790 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61  mitted.** at tha
1b7a0 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20  t point because 
1b7b0 69 64 65 6e 74 69 66 69 65 72 73 20 68 61 64 20  identifiers had 
1b7c0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65 73  not yet been res
1b7d0 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20  olved.  This.** 
1b7e0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1b7f0 64 20 61 66 74 65 72 20 69 64 65 6e 74 69 66 69  d after identifi
1b800 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  er resolution..*
1b810 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  /.static int sel
1b820 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
1b830 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70  peInfo(Walker *p
1b840 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
1b850 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
1b860 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rse;.  int i;.  
1b870 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
1b880 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
1b890 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
1b8a0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ..  assert( p->s
1b8b0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
1b8c0 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20 28  olved );.  if( (
1b8d0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1b8e0 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30  _HasTypeInfo)==0
1b8f0 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   ){.    p->selFl
1b900 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70  ags |= SF_HasTyp
1b910 65 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61 72 73  eInfo;.    pPars
1b920 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
1b930 72 73 65 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  rse;.    pTabLis
1b940 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
1b950 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
1b960 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
1b970 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
1b980 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
1b990 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
1b9a0 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
1b9b0 20 20 20 20 20 69 66 28 20 70 54 61 62 20 26 26       if( pTab &&
1b9c0 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
1b9d0 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
1b9e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
1b9f0 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
1ba00 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1ba10 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
1ba20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
1ba30 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
1ba40 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 61  elect;.        a
1ba50 73 73 65 72 74 28 20 70 53 65 6c 20 29 3b 0a 20  ssert( pSel );. 
1ba60 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
1ba70 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  el->pPrior ) pSe
1ba80 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
1ba90 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74  ;.        select
1baa0 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
1bab0 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
1bac0 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54  , pTab->nCol, pT
1bad0 61 62 2d 3e 61 43 6f 6c 2c 20 70 53 65 6c 29 3b  ab->aCol, pSel);
1bae0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1baf0 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
1bb00 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64  Continue;.}.#end
1bb10 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
1bb20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74  routine adds dat
1bb30 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74  atype and collat
1bb40 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66  ing sequence inf
1bb50 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74  ormation to.** t
1bb60 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
1bb70 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d  res of all FROM-
1bb80 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
1bb90 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54  s in a.** SELECT
1bba0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
1bbb0 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69  * Use this routi
1bbc0 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65  ne after name re
1bbd0 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
1bbe0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
1bbf0 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66  SelectAddTypeInf
1bc00 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
1bc10 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
1bc20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1bc30 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
1bc40 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e    Walker w;.  w.
1bc50 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1bc60 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  = selectAddSubqu
1bc70 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77  eryTypeInfo;.  w
1bc80 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
1bc90 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20   exprWalkNoop;. 
1bca0 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
1bcb0 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  se;.  sqlite3Wal
1bcc0 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
1bcd0 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ect);.#endif.}..
1bce0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1bcf0 69 6e 65 20 73 65 74 73 20 6f 66 20 61 20 53 45  ine sets of a SE
1bd00 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66  LECT statement f
1bd10 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  or processing.  
1bd20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  The.** following
1bd30 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64   is accomplished
1bd40 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56  :.**.**     *  V
1bd50 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65  DBE Cursor numbe
1bd60 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  rs are assigned 
1bd70 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  to all FROM-clau
1bd80 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20  se terms..**    
1bd90 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61   *  Ephemeral Ta
1bda0 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ble objects are 
1bdb0 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20  created for all 
1bdc0 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
1bdd0 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a  ueries..**     *
1bde0 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63    ON and USING c
1bdf0 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66 74  lauses are shift
1be00 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74  ed into WHERE st
1be10 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20  atements.**     
1be20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22  *  Wildcards "*"
1be30 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69   and "TABLE.*" i
1be40 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61 72  n result sets ar
1be50 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20  e expanded..**  
1be60 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72     *  Identifier
1be70 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s in expression 
1be80 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74  are matched to t
1be90 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ables..**.** Thi
1bea0 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72  s routine acts r
1beb0 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c  ecursively on al
1bec0 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74  l subqueries wit
1bed0 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a  hin the SELECT..
1bee0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1bef0 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61 72  electPrep(.  Par
1bf00 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1bf10 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
1bf20 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
1bf30 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1bf40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
1bf50 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
1bf60 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
1bf70 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75  NameContext *pOu
1bf80 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63  terNC  /* Name c
1bf90 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61  ontext for conta
1bfa0 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  iner */.){.  sql
1bfb0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
1bfc0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
1bfd0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1bfe0 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  ;.  if( p->selFl
1bff0 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
1c000 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20  Info ) return;. 
1c010 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
1c020 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
1c030 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
1c040 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45    sqlite3SelectE
1c050 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29  xpand(pParse, p)
1c060 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1c070 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
1c080 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1c090 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f  n;.  sqlite3Reso
1c0a0 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70  lveSelectNames(p
1c0b0 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72  Parse, p, pOuter
1c0c0 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  NC);.  if( pPars
1c0d0 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
1c0e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
1c0f0 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53  turn;.  sqlite3S
1c100 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f  electAddTypeInfo
1c110 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a  (pParse, p);.}..
1c120 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
1c130 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
1c140 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lator..**.** The
1c150 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
1c160 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20  ulator is a set 
1c170 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  of memory cells 
1c180 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74  that hold.** int
1c190 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
1c1a0 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74  s while calculat
1c1b0 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65  ing an aggregate
1c1c0 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
1c1d0 6e 65 20 73 69 6d 70 6c 79 20 73 74 6f 72 65 73  ne simply stores
1c1e0 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66   NULLs in all of
1c1f0 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 20 63 65   those memory ce
1c200 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lls..*/.static v
1c210 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c  oid resetAccumul
1c220 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
1c230 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
1c240 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
1c250 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1c260 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
1c270 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
1c280 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66 28 20  c *pFunc;.  if( 
1c290 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 2b  pAggInfo->nFunc+
1c2a0 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
1c2b0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  n==0 ){.    retu
1c2c0 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  rn;.  }.  for(i=
1c2d0 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
1c2e0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
1c2f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1c300 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op2(v, OP_Null, 
1c310 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  0, pAggInfo->aCo
1c320 6c 5b 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 7d 0a  l[i].iMem);.  }.
1c330 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67    for(pFunc=pAgg
1c340 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30  Info->aFunc, i=0
1c350 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
1c360 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b  unc; i++, pFunc+
1c370 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
1c380 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1c390 4e 75 6c 6c 2c 20 30 2c 20 70 46 75 6e 63 2d 3e  Null, 0, pFunc->
1c3a0 69 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  iMem);.    if( p
1c3b0 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e  Func->iDistinct>
1c3c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  =0 ){.      Expr
1c3d0 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45   *pE = pFunc->pE
1c3e0 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
1c3f0 45 2d 3e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  E->pList==0 || p
1c400 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  E->pList->nExpr!
1c410 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
1c420 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1c430 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20  arse, "DISTINCT 
1c440 69 6e 20 61 67 67 72 65 67 61 74 65 20 6d 75 73  in aggregate mus
1c450 74 20 62 65 20 66 6f 6c 6c 6f 77 65 64 20 22 0a  t be followed ".
1c460 20 20 20 20 20 20 20 20 20 20 20 22 62 79 20 61             "by a
1c470 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a  n expression");.
1c480 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69          pFunc->i
1c490 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20  Distinct = -1;. 
1c4a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c4b0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
1c4c0 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
1c4d0 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
1c4e0 73 65 2c 20 70 45 2d 3e 70 4c 69 73 74 29 3b 0a  se, pE->pList);.
1c4f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1c500 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1c510 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
1c520 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c  Func->iDistinct,
1c530 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c550 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
1c560 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
1c570 44 4f 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 20  DOFF);.      }. 
1c580 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1c590 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f  * Invoke the OP_
1c5a0 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f  AggFinalize opco
1c5b0 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67  de for every agg
1c5c0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a  regate function.
1c5d0 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66  ** in the AggInf
1c5e0 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  o structure..*/.
1c5f0 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61  static void fina
1c600 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
1c610 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c620 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1c630 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
1c640 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
1c650 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1c660 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
1c670 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  F;.  for(i=0, pF
1c680 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
1c690 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
1c6a0 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
1c6b0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
1c6c0 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
1c6d0 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c  ->pList;.    sql
1c6e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1c6f0 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70  , OP_AggFinal, p
1c700 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f  F->iMem, pList ?
1c710 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
1c720 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
1c730 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
1c740 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  d*)pF->pFunc, P4
1c750 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d  _FUNCDEF);.  }.}
1c760 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74  ../*.** Update t
1c770 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d  he accumulator m
1c780 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
1c790 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73  an aggregate bas
1c7a0 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72  ed on.** the cur
1c7b0 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
1c7c0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1c7d0 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d  void updateAccum
1c7e0 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
1c7f0 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
1c800 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
1c810 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1c820 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
1c830 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
1c840 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63  unc *pF;.  struc
1c850 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
1c860 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e  C;..  pAggInfo->
1c870 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
1c880 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
1c890 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
1c8a0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
1c8b0 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
1c8c0 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20    int nArg;.    
1c8d0 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30  int addrNext = 0
1c8e0 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67  ;.    int regAgg
1c8f0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
1c900 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
1c910 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69 66  r->pList;.    if
1c920 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
1c930 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e   nArg = pList->n
1c940 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41  Expr;.      regA
1c950 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  gg = sqlite3GetT
1c960 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
1c970 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71   nArg);.      sq
1c980 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
1c990 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
1c9a0 69 73 74 2c 20 72 65 67 41 67 67 2c 20 30 29 3b  ist, regAgg, 0);
1c9b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c9c0 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20    nArg = 0;.    
1c9d0 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20    regAgg = 0;.  
1c9e0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
1c9f0 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
1ca00 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d        addrNext =
1ca10 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1ca20 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
1ca30 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20  assert( nArg==1 
1ca40 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73  );.      codeDis
1ca50 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46  tinct(pParse, pF
1ca60 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64  ->iDistinct, add
1ca70 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67  rNext, 1, regAgg
1ca80 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1ca90 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 6c 61 67   pF->pFunc->flag
1caa0 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
1cab0 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20  NEEDCOLL ){.    
1cac0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1cad0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75   = 0;.      stru
1cae0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
1caf0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69   *pItem;.      i
1cb00 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65  nt j;.      asse
1cb10 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20  rt( pList!=0 ); 
1cb20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20   /* pList!=0 if 
1cb30 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45  pF->pFunc has NE
1cb40 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  EDCOLL */.      
1cb50 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
1cb60 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20  List->a; !pColl 
1cb70 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20  && j<nArg; j++, 
1cb80 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1cb90 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1cba0 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1cbb0 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
1cbc0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
1cbd0 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
1cbe0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
1cbf0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
1cc00 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
1cc10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1cc20 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
1cc30 6c 53 65 71 2c 20 30 2c 20 30 2c 20 30 2c 20 28  lSeq, 0, 0, 0, (
1cc40 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34  char *)pColl, P4
1cc50 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d  _COLLSEQ);.    }
1cc60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1cc70 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67  AddOp4(v, OP_Agg
1cc80 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c  Step, 0, regAgg,
1cc90 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20   pF->iMem,.     
1cca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccb0 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e   (void*)pF->pFun
1ccc0 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
1ccd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1cce0 68 61 6e 67 65 50 35 28 76 2c 20 6e 41 72 67 29  hangeP5(v, nArg)
1ccf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
1cd00 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
1cd10 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
1cd20 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
1cd30 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
1cd40 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
1cd50 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20  regAgg, nArg);. 
1cd60 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20     if( addrNext 
1cd70 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1cd80 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1cd90 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20  (v, addrNext);. 
1cda0 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
1cdb0 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d  =0, pC=pAggInfo-
1cdc0 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66  >aCol; i<pAggInf
1cdd0 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b  o->nAccumulator;
1cde0 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20   i++, pC++){.   
1cdf0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
1ce00 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78  (pParse, pC->pEx
1ce10 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20  pr, pC->iMem);. 
1ce20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64   }.  pAggInfo->d
1ce30 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 7d  irectMode = 0;.}
1ce40 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1ce50 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45   code for the SE
1ce60 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67  LECT statement g
1ce70 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72  iven in the p ar
1ce80 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  gument.  .**.** 
1ce90 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
1cea0 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 76  distributed in v
1ceb0 61 72 69 6f 75 73 20 77 61 79 73 20 64 65 70 65  arious ways depe
1cec0 6e 64 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20  nding on the.** 
1ced0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1cee0 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
1cef0 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  ture pointed to 
1cf00 62 79 20 61 72 67 75 6d 65 6e 74 20 70 44 65 73  by argument pDes
1cf10 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t.** as follows:
1cf20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73 74  .**.**     pDest
1cf30 2d 3e 65 44 65 73 74 20 20 20 20 52 65 73 75 6c  ->eDest    Resul
1cf40 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  t.**     -------
1cf50 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
1cf60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cf70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cf80 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ----.**     SRT_
1cf90 4f 75 74 70 75 74 20 20 20 20 20 20 47 65 6e 65  Output      Gene
1cfa0 72 61 74 65 20 61 20 72 6f 77 20 6f 66 20 6f 75  rate a row of ou
1cfb0 74 70 75 74 20 28 75 73 69 6e 67 20 74 68 65 20  tput (using the 
1cfc0 4f 50 5f 52 65 73 75 6c 74 52 6f 77 0a 2a 2a 20  OP_ResultRow.** 
1cfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfe0 20 20 20 20 6f 70 63 6f 64 65 29 20 66 6f 72 20      opcode) for 
1cff0 65 61 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20  each row in the 
1d000 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a  result set..**.*
1d010 2a 20 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20  *     SRT_Mem   
1d020 20 20 20 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64        Only valid
1d030 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 69   if the result i
1d040 73 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  s a single colum
1d050 6e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  n..**           
1d060 20 20 20 20 20 20 20 20 20 20 53 74 6f 72 65 20            Store 
1d070 74 68 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  the first column
1d080 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 65   of the first re
1d090 73 75 6c 74 20 72 6f 77 0a 2a 2a 20 20 20 20 20  sult row.**     
1d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0b0 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65 73  in register pDes
1d0c0 74 2d 3e 69 50 61 72 6d 20 74 68 65 6e 20 61 62  t->iParm then ab
1d0d0 61 6e 64 6f 6e 20 74 68 65 20 72 65 73 74 0a 2a  andon the rest.*
1d0e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1d0f0 20 20 20 20 20 20 6f 66 20 74 68 65 20 71 75 65        of the que
1d100 72 79 2e 20 20 54 68 69 73 20 64 65 73 74 69 6e  ry.  This destin
1d110 61 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22 4c  ation implies "L
1d120 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20 20  IMIT 1"..**.**  
1d130 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20     SRT_Set      
1d140 20 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 75     The result mu
1d150 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63  st be a single c
1d160 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65 61  olumn.  Store ea
1d170 63 68 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ch.**           
1d180 20 20 20 20 20 20 20 20 20 20 72 6f 77 20 6f 66            row of
1d190 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 6b   result as the k
1d1a0 65 79 20 69 6e 20 74 61 62 6c 65 20 70 44 65 73  ey in table pDes
1d1b0 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a 2a 20 20 20  t->iParm. .**   
1d1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1d0 20 20 41 70 70 6c 79 20 74 68 65 20 61 66 66 69    Apply the affi
1d1e0 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66 66 69  nity pDest->affi
1d1f0 6e 69 74 79 20 62 65 66 6f 72 65 20 73 74 6f 72  nity before stor
1d200 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1d210 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
1d220 74 73 2e 20 20 55 73 65 64 20 74 6f 20 69 6d 70  ts.  Used to imp
1d230 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53 45 4c 45  lement "IN (SELE
1d240 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a 20  CT ...)"..**.** 
1d250 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20 20      SRT_Union   
1d260 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74      Store result
1d270 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61 20  s as a key in a 
1d280 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1d290 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a  pDest->iParm..**
1d2a0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65  .**     SRT_Exce
1d2b0 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72  pt      Remove r
1d2c0 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20  esults from the 
1d2d0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1d2e0 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a  pDest->iParm..**
1d2f0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61 62 6c  .**     SRT_Tabl
1d300 65 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  e       Store re
1d310 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f 72 61  sults in tempora
1d320 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
1d330 69 50 61 72 6d 2e 0a 2a 2a 20 20 20 20 20 20 20  iParm..**       
1d340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68                Th
1d350 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f 45  is is like SRT_E
1d360 70 68 65 6d 54 61 62 20 65 78 63 65 70 74 20 74  phemTab except t
1d370 68 61 74 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a  hat the table.**
1d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d390 20 20 20 20 20 69 73 20 61 73 73 75 6d 65 64 20       is assumed 
1d3a0 74 6f 20 61 6c 72 65 61 64 79 20 62 65 20 6f 70  to already be op
1d3b0 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  en..**.**     SR
1d3c0 54 5f 45 70 68 65 6d 54 61 62 20 20 20 20 43 72  T_EphemTab    Cr
1d3d0 65 61 74 65 20 61 6e 20 74 65 6d 70 6f 72 61 72  eate an temporar
1d3e0 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e 69  y table pDest->i
1d3f0 50 61 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a  Parm and store.*
1d400 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1d410 20 20 20 20 20 20 74 68 65 20 72 65 73 75 6c 74        the result
1d420 20 74 68 65 72 65 2e 20 54 68 65 20 63 75 72 73   there. The curs
1d430 6f 72 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20  or is left open 
1d440 61 66 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  after.**        
1d450 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
1d460 75 72 6e 69 6e 67 2e 20 20 54 68 69 73 20 69 73  urning.  This is
1d470 20 6c 69 6b 65 20 53 52 54 5f 54 61 62 6c 65 20   like SRT_Table 
1d480 65 78 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 20  except that.**  
1d490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4a0 20 20 20 74 68 69 73 20 64 65 73 74 69 6e 61 74     this destinat
1d4b0 69 6f 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65 6e  ion uses OP_Open
1d4c0 45 70 68 65 6d 65 72 61 6c 20 74 6f 20 63 72 65  Ephemeral to cre
1d4d0 61 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ate.**          
1d4e0 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 74             the t
1d4f0 61 62 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a 2a  able first..**.*
1d500 2a 20 20 20 20 20 53 52 54 5f 43 6f 72 6f 75 74  *     SRT_Corout
1d510 69 6e 65 20 20 20 47 65 6e 65 72 61 74 65 20 61  ine   Generate a
1d520 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74   co-routine that
1d530 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20 72   returns a new r
1d540 6f 77 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  ow of.**        
1d550 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
1d560 75 6c 74 73 20 65 61 63 68 20 74 69 6d 65 20 69  ults each time i
1d570 74 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20 54  t is invoked.  T
1d580 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a 2a  he entry point.*
1d590 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1d5a0 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 2d        of the co-
1d5b0 72 6f 75 74 69 6e 65 20 69 73 20 73 74 6f 72 65  routine is store
1d5c0 64 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 44  d in register pD
1d5d0 65 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  est->iParm..**.*
1d5e0 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73 74 73  *     SRT_Exists
1d5f0 20 20 20 20 20 20 53 74 6f 72 65 20 61 20 31 20        Store a 1 
1d600 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 70  in memory cell p
1d610 44 65 73 74 2d 3e 69 50 61 72 6d 20 69 66 20 74  Dest->iParm if t
1d620 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20  he result.**    
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d640 20 73 65 74 20 69 73 20 6e 6f 74 20 65 6d 70 74   set is not empt
1d650 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  y..**.**     SRT
1d660 5f 44 69 73 63 61 72 64 20 20 20 20 20 54 68 72  _Discard     Thr
1d670 6f 77 20 74 68 65 20 72 65 73 75 6c 74 73 20 61  ow the results a
1d680 77 61 79 2e 20 20 54 68 69 73 20 69 73 20 75 73  way.  This is us
1d690 65 64 20 62 79 20 53 45 4c 45 43 54 0a 2a 2a 20  ed by SELECT.** 
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6b0 20 20 20 20 73 74 61 74 65 6d 65 6e 74 73 20 77      statements w
1d6c0 69 74 68 69 6e 20 74 72 69 67 67 65 72 73 20 77  ithin triggers w
1d6d0 68 6f 73 65 20 6f 6e 6c 79 20 70 75 72 70 6f 73  hose only purpos
1d6e0 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  e is.**         
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
1d700 73 69 64 65 2d 65 66 66 65 63 74 73 20 6f 66 20  side-effects of 
1d710 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  functions..**.**
1d720 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
1d730 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
1d740 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
1d750 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
1d760 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
1d770 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
1d780 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
1d790 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
1d7a0 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
1d7b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1d7c0 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
1d7d0 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
1d7e0 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
1d7f0 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
1d800 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
1d810 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69  to do that..*/.i
1d820 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
1d830 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1d840 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
1d850 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
1d860 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
1d870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d880 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
1d890 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
1d8a0 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
1d8b0 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a  t *pDest      /*
1d8c0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
1d8d0 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
1d8e0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
1d8f0 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
1d900 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1d910 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  rs */.  WhereInf
1d920 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f  o *pWInfo;     /
1d930 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71  * Return from sq
1d940 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1d950 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ) */.  Vdbe *v; 
1d960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d970 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
1d980 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  hine under const
1d990 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
1d9a0 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20   isAgg;         
1d9b0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
1d9c0 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b  select lists lik
1d9d0 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a  e "count(*)" */.
1d9e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1d9f0 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  st;      /* List
1da00 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65   of columns to e
1da10 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63  xtract. */.  Src
1da20 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
1da30 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
1da40 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20  ables to select 
1da50 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  from */.  Expr *
1da60 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
1da70 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
1da80 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
1da90 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
1daa0 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f   *pOrderBy;    /
1dab0 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
1dac0 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
1dad0 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ULL */.  ExprLis
1dae0 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
1daf0 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20  /* The GROUP BY 
1db00 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20  clause.  May be 
1db10 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
1db20 70 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20  pHaving;        
1db30 20 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63   /* The HAVING c
1db40 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
1db50 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 44  ULL */.  int isD
1db60 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20  istinct;        
1db70 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
1db80 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
1db90 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
1dba0 69 6e 74 20 64 69 73 74 69 6e 63 74 3b 20 20 20  int distinct;   
1dbb0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
1dbc0 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
1dbd0 69 73 74 69 6e 63 74 20 73 65 74 20 2a 2f 0a 20  istinct set */. 
1dbe0 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20   int rc = 1;    
1dbf0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1dc00 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20   to return from 
1dc10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
1dc20 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49  .  int addrSortI
1dc30 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41 64 64  ndex;     /* Add
1dc40 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70  ress of an OP_Op
1dc50 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
1dc60 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 41 67 67  ruction */.  Agg
1dc70 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20  Info sAggInfo;  
1dc80 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
1dc90 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65  on used by aggre
1dca0 67 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a  gate queries */.
1dcb0 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20    int iEnd;     
1dcc0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1dcd0 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f  ess of the end o
1dce0 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20  f the query */. 
1dcf0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
1dd00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
1dd10 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1dd20 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50  on */..  db = pP
1dd30 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
1dd40 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
1dd50 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
1dd60 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
1dd70 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
1dd80 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1dd90 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1dda0 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
1ddb0 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , 0) ) return 1;
1ddc0 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49  .  memset(&sAggI
1ddd0 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  nfo, 0, sizeof(s
1dde0 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 70 4f  AggInfo));..  pO
1ddf0 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
1de00 65 72 42 79 3b 0a 20 20 69 66 28 20 49 67 6e 6f  erBy;.  if( Igno
1de10 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
1de20 73 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4f  st) ){.    p->pO
1de30 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 20  rderBy = 0;..   
1de40 20 2f 2a 20 49 6e 20 74 68 65 73 65 20 63 61 73   /* In these cas
1de50 65 73 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  es the DISTINCT 
1de60 6f 70 65 72 61 74 6f 72 20 6d 61 6b 65 73 20 6e  operator makes n
1de70 6f 20 64 69 66 66 65 72 65 6e 63 65 20 74 6f 20  o difference to 
1de80 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  the.    ** resul
1de90 74 73 2c 20 73 6f 20 72 65 6d 6f 76 65 20 69 74  ts, so remove it
1dea0 20 69 66 20 69 74 20 77 65 72 65 20 73 70 65 63   if it were spec
1deb0 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ified..    */.  
1dec0 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e    assert(pDest->
1ded0 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74  eDest==SRT_Exist
1dee0 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  s || pDest->eDes
1def0 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20  t==SRT_Union || 
1df00 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
1df10 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
1df20 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65  cept || pDest->e
1df30 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
1df40 64 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c  d);.    p->selFl
1df50 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
1df60 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nct;.  }.  sqlit
1df70 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
1df80 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 69 66  rse, p, 0);.  if
1df90 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
1dfa0 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
1dfb0 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 2d 3e  t_end;.  }.  p->
1dfc0 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
1dfd0 72 42 79 3b 0a 0a 0a 20 20 2f 2a 20 4d 61 6b 65  rBy;...  /* Make
1dfe0 20 6c 6f 63 61 6c 20 63 6f 70 69 65 73 20 6f 66   local copies of
1dff0 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20   the parameters 
1e000 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e 0a  for this query..
1e010 20 20 2a 2f 0a 20 20 70 54 61 62 4c 69 73 74 20    */.  pTabList 
1e020 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 69 73 41  = p->pSrc;.  isA
1e030 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  gg = (p->selFlag
1e040 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
1e050 29 21 3d 30 3b 0a 20 20 70 45 4c 69 73 74 20 3d  )!=0;.  pEList =
1e060 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
1e070 28 20 70 45 4c 69 73 74 3d 3d 30 20 29 20 67 6f  ( pEList==0 ) go
1e080 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
1e090 20 20 2f 2a 20 0a 20 20 2a 2a 20 44 6f 20 6e 6f    /* .  ** Do no
1e0a0 74 20 65 76 65 6e 20 61 74 74 65 6d 70 74 20 74  t even attempt t
1e0b0 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 79 20 63  o generate any c
1e0c0 6f 64 65 20 69 66 20 77 65 20 68 61 76 65 20 61  ode if we have a
1e0d0 6c 72 65 61 64 79 20 73 65 65 6e 0a 20 20 2a 2a  lready seen.  **
1e0e0 20 65 72 72 6f 72 73 20 62 65 66 6f 72 65 20 74   errors before t
1e0f0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
1e100 74 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ts..  */.  if( p
1e110 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 20  Parse->nErr>0 ) 
1e120 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
1e130 0a 0a 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  ..  /* ORDER BY 
1e140 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 73  is ignored for s
1e150 6f 6d 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73  ome destinations
1e160 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 67 6e  ..  */.  if( Ign
1e170 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
1e180 65 73 74 29 20 29 7b 0a 20 20 20 20 70 4f 72 64  est) ){.    pOrd
1e190 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  erBy = 0;.  }.. 
1e1a0 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
1e1b0 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  ting code..  */.
1e1c0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1e1d0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1e1e0 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
1e1f0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
1e200 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1e210 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
1e220 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
1e230 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20  clause.  */.#if 
1e240 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1e250 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
1e260 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
1e270 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66  E_OMIT_VIEW).  f
1e280 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69  or(i=0; !p->pPri
1e290 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74  or && i<pTabList
1e2a0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
1e2b0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1e2c0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
1e2d0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a  pTabList->a[i];.
1e2e0 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
1e2f0 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  est;.    Select 
1e300 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pSub = pItem->p
1e310 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20  Select;.    int 
1e320 69 73 41 67 67 53 75 62 3b 0a 0a 20 20 20 20 69  isAggSub;..    i
1e330 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 70 49  f( pSub==0 || pI
1e340 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64  tem->isPopulated
1e350 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
1e360 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50    /* Increment P
1e370 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20  arse.nHeight by 
1e380 74 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68  the height of th
1e390 65 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73  e largest expres
1e3a0 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65  sion.    ** tree
1e3b0 20 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 74   refered to by t
1e3c0 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20  his, the parent 
1e3d0 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c  select. The chil
1e3e0 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20  d select.    ** 
1e3f0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72  may contain expr
1e400 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20  ession trees of 
1e410 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28  at most.    ** (
1e420 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
1e430 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69  DEPTH-Parse.nHei
1e440 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69  ght) height. Thi
1e450 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a  s is a bit.    *
1e460 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74  * more conservat
1e470 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ive than necessa
1e480 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73  ry, but much eas
1e490 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69  ier than enforci
1e4a0 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61  ng.    ** an exa
1e4b0 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f  ct limit..    */
1e4c0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
1e4d0 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  ight += sqlite3S
1e4e0 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
1e4f0 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  p);..    /* Chec
1e500 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
1e510 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20  subquery can be 
1e520 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 74 68  absorbed into th
1e530 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  e parent. */.   
1e540 20 69 73 41 67 67 53 75 62 20 3d 20 28 70 53 75   isAggSub = (pSu
1e550 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
1e560 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a  _Aggregate)!=0;.
1e570 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53      if( flattenS
1e580 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20  ubquery(pParse, 
1e590 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41  p, i, isAgg, isA
1e5a0 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20  ggSub) ){.      
1e5b0 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a  if( isAggSub ){.
1e5c0 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d 20          isAgg = 
1e5d0 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65  1;.        p->se
1e5e0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67  lFlags |= SF_Agg
1e5f0 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a  regate;.      }.
1e600 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20        i = -1;.  
1e610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1e620 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
1e630 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
1e640 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d  EphemTab, pItem-
1e650 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
1e660 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1e670 69 73 50 6f 70 75 6c 61 74 65 64 3d 3d 30 20 29  isPopulated==0 )
1e680 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
1e690 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
1e6a0 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ub, &dest);.    
1e6b0 20 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c    pItem->isPopul
1e6c0 61 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ated = 1;.    }.
1e6d0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
1e6e0 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
1e6f0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
1e700 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
1e710 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  d;.    }.    pPa
1e720 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20  rse->nHeight -= 
1e730 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
1e740 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20  rHeight(p);.    
1e750 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
1e760 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e  rc;.    if( !Ign
1e770 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
1e780 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70 4f  est) ){.      pO
1e790 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
1e7a0 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  erBy;.    }.  }.
1e7b0 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
1e7c0 4c 69 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20 70  List;.#endif.  p
1e7d0 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72  Where = p->pWher
1e7e0 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20  e;.  pGroupBy = 
1e7f0 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70  p->pGroupBy;.  p
1e800 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76  Having = p->pHav
1e810 69 6e 67 3b 0a 20 20 69 73 44 69 73 74 69 6e 63  ing;.  isDistinc
1e820 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  t = (p->selFlags
1e830 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
1e840 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  =0;..#ifndef SQL
1e850 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
1e860 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66  D_SELECT.  /* If
1e870 20 74 68 65 72 65 20 69 73 20 61 72 65 20 61 20   there is are a 
1e880 73 65 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72  sequence of quer
1e890 69 65 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c  ies, do the earl
1e8a0 69 65 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a  ier ones first..
1e8b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50    */.  if( p->pP
1e8c0 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
1e8d0 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30  p->pRightmost==0
1e8e0 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   ){.      Select
1e8f0 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69 67 68 74   *pLoop, *pRight
1e900 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
1e910 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  cnt = 0;.      i
1e920 6e 74 20 6d 78 53 65 6c 65 63 74 3b 0a 20 20 20  nt mxSelect;.   
1e930 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20     for(pLoop=p; 
1e940 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
1e950 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74 2b  op->pPrior, cnt+
1e960 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  +){.        pLoo
1e970 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  p->pRightmost = 
1e980 70 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  p;.        pLoop
1e990 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69 67 68 74  ->pNext = pRight
1e9a0 3b 0a 20 20 20 20 20 20 20 20 70 52 69 67 68 74  ;.        pRight
1e9b0 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 20 20   = pLoop;.      
1e9c0 7d 0a 20 20 20 20 20 20 6d 78 53 65 6c 65 63 74  }.      mxSelect
1e9d0 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51   = db->aLimit[SQ
1e9e0 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
1e9f0 55 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a 20 20 20  UND_SELECT];.   
1ea00 20 20 20 69 66 28 20 6d 78 53 65 6c 65 63 74 20     if( mxSelect 
1ea10 26 26 20 63 6e 74 3e 6d 78 53 65 6c 65 63 74 20  && cnt>mxSelect 
1ea20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1ea30 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1ea40 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72  e, "too many ter
1ea50 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e 64 20 53  ms in compound S
1ea60 45 4c 45 43 54 22 29 3b 0a 20 20 20 20 20 20 20  ELECT");.       
1ea70 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1ea80 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
1ea90 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  urn multiSelect(
1eaa0 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
1eab0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1eac0 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74   /* If writing t
1ead0 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65  o memory or gene
1eae0 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a  rating a set.  *
1eaf0 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
1eb00 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75  column may be ou
1eb10 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  tput..  */.#ifnd
1eb20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1eb30 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 63 68  UBQUERY.  if( ch
1eb40 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d  eckForMultiColum
1eb50 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61  nSelectError(pPa
1eb60 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69  rse, pDest, pELi
1eb70 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
1eb80 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
1eb90 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  d;.  }.#endif.. 
1eba0 20 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c   /* If possible,
1ebb0 20 72 65 77 72 69 74 65 20 74 68 65 20 71 75 65   rewrite the que
1ebc0 72 79 20 74 6f 20 75 73 65 20 47 52 4f 55 50 20  ry to use GROUP 
1ebd0 42 59 20 69 6e 73 74 65 61 64 20 6f 66 20 44 49  BY instead of DI
1ebe0 53 54 49 4e 43 54 2e 0a 20 20 2a 2a 20 47 52 4f  STINCT..  ** GRO
1ebf0 55 50 20 42 59 20 6d 69 67 68 74 20 75 73 65 20  UP BY might use 
1ec00 61 6e 20 69 6e 64 65 78 2c 20 44 49 53 54 49 4e  an index, DISTIN
1ec10 43 54 20 6e 65 76 65 72 20 64 6f 65 73 2e 0a 20  CT never does.. 
1ec20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   */.  if( (p->se
1ec30 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
1ec40 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
1ec50 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
1ec60 74 20 26 26 20 21 70 2d 3e 70 47 72 6f 75 70 42  t && !p->pGroupB
1ec70 79 20 29 7b 0a 20 20 20 20 70 2d 3e 70 47 72 6f  y ){.    p->pGro
1ec80 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
1ec90 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
1eca0 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 47  >pEList);.    pG
1ecb0 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
1ecc0 75 70 42 79 3b 0a 20 20 20 20 70 2d 3e 73 65 6c  upBy;.    p->sel
1ecd0 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73  Flags &= ~SF_Dis
1ece0 74 69 6e 63 74 3b 0a 20 20 20 20 69 73 44 69 73  tinct;.    isDis
1ecf0 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  tinct = 0;.  }..
1ed00 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
1ed10 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1ed20 75 73 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73  use, then this s
1ed30 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  orting.  ** inde
1ed40 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62  x might end up b
1ed50 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74  eing unused if t
1ed60 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a  he data can be .
1ed70 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69    ** extracted i
1ed80 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
1ed90 65 72 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  er.  If that is 
1eda0 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
1edb0 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45  he.  ** OP_OpenE
1edc0 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
1edd0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61  tion will be cha
1ede0 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f  nged to an OP_No
1edf0 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20  op once.  ** we 
1ee00 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20  figure out that 
1ee10 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
1ee20 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e  x is not needed.
1ee30 20 20 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e    The addrSortIn
1ee40 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  dex.  ** variabl
1ee50 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63  e is used to fac
1ee60 69 6c 69 74 61 74 65 20 74 68 61 74 20 63 68 61  ilitate that cha
1ee70 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
1ee80 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1ee90 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1eea0 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  o;.    pKeyInfo 
1eeb0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
1eec0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
1eed0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72  rderBy);.    pOr
1eee0 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20  derBy->iECursor 
1eef0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
1ef00 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  ;.    p->addrOpe
1ef10 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53  nEphm[2] = addrS
1ef20 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20  ortIndex =.     
1ef30 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ef40 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
1ef50 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20  emeral,.        
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef70 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43     pOrderBy->iEC
1ef80 75 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d  ursor, pOrderBy-
1ef90 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20  >nExpr+2, 0,.   
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efb0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1efc0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
1efd0 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
1efe0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 53  }else{.    addrS
1eff0 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20  ortIndex = -1;. 
1f000 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
1f010 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
1f020 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
1f030 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
1f040 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
1f050 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
1f060 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
1f070 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1f080 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1f090 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
1f0a0 44 65 73 74 2d 3e 69 50 61 72 6d 2c 20 70 45 4c  Dest->iParm, pEL
1f0b0 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d  ist->nExpr);.  }
1f0c0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c  ..  /* Set the l
1f0d0 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  imiter..  */.  i
1f0e0 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
1f0f0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
1f100 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
1f110 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
1f120 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 4f  , iEnd);..  /* O
1f130 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20 69 6e  pen a virtual in
1f140 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74  dex to use for t
1f150 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 2e  he distinct set.
1f160 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 69  .  */.  if( isDi
1f170 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 4b 65  stinct ){.    Ke
1f180 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
1f190 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 41  .    assert( isA
1f1a0 67 67 20 7c 7c 20 70 47 72 6f 75 70 42 79 20 29  gg || pGroupBy )
1f1b0 3b 0a 20 20 20 20 64 69 73 74 69 6e 63 74 20 3d  ;.    distinct =
1f1c0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
1f1d0 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
1f1e0 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
1f1f0 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ist(pParse, p->p
1f200 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
1f210 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1f220 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1f230 6c 2c 20 64 69 73 74 69 6e 63 74 2c 20 30 2c 20  l, distinct, 0, 
1f240 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1f250 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1f260 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
1f270 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
1f280 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 69  .  }else{.    di
1f290 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 7d  stinct = -1;.  }
1f2a0 0a 0a 20 20 2f 2a 20 41 67 67 72 65 67 61 74 65  ..  /* Aggregate
1f2b0 20 61 6e 64 20 6e 6f 6e 2d 61 67 67 72 65 67 61   and non-aggrega
1f2c0 74 65 20 71 75 65 72 69 65 73 20 61 72 65 20 68  te queries are h
1f2d0 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74  andled different
1f2e0 6c 79 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 41  ly */.  if( !isA
1f2f0 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d  gg && pGroupBy==
1f300 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
1f310 20 63 61 73 65 20 69 73 20 66 6f 72 20 6e 6f 6e   case is for non
1f320 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69  -aggregate queri
1f330 65 73 0a 20 20 20 20 2a 2a 20 42 65 67 69 6e 20  es.    ** Begin 
1f340 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
1f350 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 57 49  n.    */.    pWI
1f360 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
1f370 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
1f380 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
1f390 2c 20 26 70 4f 72 64 65 72 42 79 2c 20 30 29 3b  , &pOrderBy, 0);
1f3a0 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  .    if( pWInfo=
1f3b0 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
1f3c0 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  _end;..    /* If
1f3d0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
1f3e0 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20  hat was created 
1f3f0 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70  by a prior OP_Op
1f400 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
1f410 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
1f420 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69  ended up not bei
1f430 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  ng needed, then 
1f440 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  change the OP_Op
1f450 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20  enEphemeral.    
1f460 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f  ** into an OP_No
1f470 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  op..    */.    i
1f480 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  f( addrSortIndex
1f490 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d  >=0 && pOrderBy=
1f4a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
1f4b0 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
1f4c0 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49  oop(v, addrSortI
1f4d0 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20 20 20 20  ndex, 1);.      
1f4e0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
1f4f0 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  2] = -1;.    }..
1f500 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
1f510 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
1f520 6f 70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  op.    */.    as
1f530 73 65 72 74 28 21 69 73 44 69 73 74 69 6e 63 74  sert(!isDistinct
1f540 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  );.    selectInn
1f550 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
1f560 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20  , pEList, 0, 0, 
1f570 70 4f 72 64 65 72 42 79 2c 20 2d 31 2c 20 70 44  pOrderBy, -1, pD
1f580 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
1f590 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d           pWInfo-
1f5a0 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e  >iContinue, pWIn
1f5b0 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
1f5c0 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
1f5d0 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
1f5e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
1f5f0 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
1f600 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fo);.  }else{.  
1f610 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
1f620 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
1f630 61 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65  aggregate querie
1f640 73 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  s */.    NameCon
1f650 74 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20  text sNC;    /* 
1f660 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
1f670 20 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72   processing aggr
1f680 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  egate informatio
1f690 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d  n */.    int iAM
1f6a0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
1f6b0 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
1f6c0 73 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75  s for storing cu
1f6d0 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a  rrent GROUP BY *
1f6e0 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b  /.    int iBMem;
1f6f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1f700 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
1f710 6f 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55  or previous GROU
1f720 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
1f730 69 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20  iUseFlag;       
1f740 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68  /* Mem address h
1f750 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69  olding flag indi
1f760 63 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c  cating that at l
1f770 65 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  east.           
1f780 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1f790 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69  one row of the i
1f7a0 6e 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72  nput to the aggr
1f7b0 65 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a  egator has been.
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7d0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1f7e0 73 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ssed */.    int 
1f7f0 69 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20  iAbortFlag;     
1f800 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77  /* Mem address w
1f810 68 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72  hich causes quer
1f820 79 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74  y abort if posit
1f830 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67  ive */.    int g
1f840 72 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f  roupBySort;    /
1f850 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d  * Rows come from
1f860 20 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50   source in GROUP
1f870 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20   BY order */.   
1f880 20 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20   int addrEnd;   
1f890 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70       /* End of p
1f8a0 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68  rocessing for th
1f8b0 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20  is SELECT */..  
1f8c0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20    /* Remove any 
1f8d0 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20  and all aliases 
1f8e0 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73 75  between the resu
1f8f0 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20  lt set and the. 
1f900 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63     ** GROUP BY c
1f910 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  lause..    */.  
1f920 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
1f930 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20  {.      int i;  
1f940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f950 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1f960 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73  unter */.      s
1f970 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1f980 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20  tem *pItem;  /* 
1f990 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1f9a0 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
1f9b0 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20   list */..      
1f9c0 66 6f 72 28 69 3d 70 2d 3e 70 45 4c 69 73 74 2d  for(i=p->pEList-
1f9d0 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d  >nExpr, pItem=p-
1f9e0 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 69 3e 30 3b  >pEList->a; i>0;
1f9f0 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i--, pItem++){.
1fa00 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
1fa10 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
1fa20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70   }.      for(i=p
1fa30 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20  GroupBy->nExpr, 
1fa40 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e  pItem=pGroupBy->
1fa50 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
1fa60 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
1fa70 49 74 65 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30  Item->iAlias = 0
1fa80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1fa90 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  . .    /* Create
1faa0 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70   a label to jump
1fab0 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74   to when we want
1fac0 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75   to abort the qu
1fad0 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45  ery */.    addrE
1fae0 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
1faf0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
1fb00 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b     /* Convert TK
1fb10 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e  _COLUMN nodes in
1fb20 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
1fb30 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65   and make entrie
1fb40 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67  s in.    ** sAgg
1fb50 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f  Info for all TK_
1fb60 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64  AGG_FUNCTION nod
1fb70 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  es in expression
1fb80 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
1fb90 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1fba0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d  ..    */.    mem
1fbb0 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
1fbc0 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73  eof(sNC));.    s
1fbd0 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
1fbe0 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  se;.    sNC.pSrc
1fbf0 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
1fc00 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66  .    sNC.pAggInf
1fc10 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20  o = &sAggInfo;. 
1fc20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72     sAggInfo.nSor
1fc30 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72  tingColumn = pGr
1fc40 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79  oupBy ? pGroupBy
1fc50 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20  ->nExpr+1 : 0;. 
1fc60 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f     sAggInfo.pGro
1fc70 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b  upBy = pGroupBy;
1fc80 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1fc90 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
1fca0 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  sNC, pEList);.  
1fcb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
1fcc0 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
1fcd0 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
1fce0 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
1fcf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1fd00 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
1fd10 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67  es(&sNC, pHaving
1fd20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  );.    }.    sAg
1fd30 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74  gInfo.nAccumulat
1fd40 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43  or = sAggInfo.nC
1fd50 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69  olumn;.    for(i
1fd60 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
1fd70 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
1fd80 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
1fd90 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
1fda0 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
1fdb0 5b 69 5d 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74  [i].pExpr->pList
1fdc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1fdd0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1fde0 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
1fdf0 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  end;..    /* Pro
1fe00 63 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72  cessing for aggr
1fe10 65 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55  egates with GROU
1fe20 50 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66  P BY is very dif
1fe30 66 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a  ferent and.    *
1fe40 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70  * much more comp
1fe50 6c 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61  lex than aggrega
1fe60 74 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52  tes without a GR
1fe70 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20  OUP BY..    */. 
1fe80 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
1fe90 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  ){.      KeyInfo
1fea0 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20   *pKeyInfo;  /* 
1feb0 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  Keying informati
1fec0 6f 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70  on for the group
1fed0 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   by clause */.  
1fee0 20 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20      int j1;     
1fef0 20 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d          /* A-vs-
1ff00 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75  B comparision ju
1ff10 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  mp */.      int 
1ff20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20  addrOutputRow;  
1ff30 2f 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72  /* Start of subr
1ff40 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
1ff50 75 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77  uts a result row
1ff60 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
1ff70 67 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a  gOutputRow;   /*
1ff80 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
1ff90 72 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74  register for out
1ffa0 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  put subroutine *
1ffb0 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
1ffc0 53 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53  SetAbort;   /* S
1ffd0 65 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61  et the abort fla
1ffe0 67 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  g and return */.
1fff0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
20000 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70  pOfLoop;  /* Top
20010 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f   of the input lo
20020 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  op */.      int 
20030 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20  addrSortingIdx; 
20040 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  /* The OP_OpenEp
20050 68 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20  hemeral for the 
20060 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f  sorting index */
20070 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52  .      int addrR
20080 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75  eset;      /* Su
20090 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73  broutine for res
200a0 65 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  etting the accum
200b0 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  ulator */.      
200c0 69 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20  int regReset;   
200d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64      /* Return ad
200e0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
200f0 6f 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74  or reset subrout
20100 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ine */..      /*
20110 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47   If there is a G
20120 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77  ROUP BY clause w
20130 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73  e might need a s
20140 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a  orting index to.
20150 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65        ** impleme
20160 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65  nt it.  Allocate
20170 20 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e   that sorting in
20180 64 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20  dex now.  If it 
20190 74 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20  turns out.      
201a0 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
201b0 74 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20  t need it after 
201c0 61 6c 6c 2c 20 74 68 65 20 4f 70 65 6e 45 70 68  all, the OpenEph
201d0 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
201e0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  on.      ** will
201f0 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
20200 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20  to a Noop.  .   
20210 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67     */.      sAgg
20220 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20  Info.sortingIdx 
20230 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
20240 3b 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f  ;.      pKeyInfo
20250 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
20260 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
20270 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
20280 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d  addrSortingIdx =
20290 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
202a0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
202b0 65 6d 65 72 61 6c 2c 20 0a 20 20 20 20 20 20 20  emeral, .       
202c0 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
202d0 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f  ingIdx, sAggInfo
202e0 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c  .nSortingColumn,
202f0 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20 28   .          0, (
20300 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
20310 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
20320 46 46 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  FF);..      /* I
20330 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79  nitialize memory
20340 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20   locations used 
20350 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67 72  by GROUP BY aggr
20360 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67  egate processing
20370 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
20380 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61  iUseFlag = ++pPa
20390 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
203a0 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b   iAbortFlag = ++
203b0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
203c0 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77      regOutputRow
203d0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
203e0 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  m;.      addrOut
203f0 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
20400 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
20410 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65 74  ;.      regReset
20420 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
20430 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65 73  m;.      addrRes
20440 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  et = sqlite3Vdbe
20450 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
20460 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72      iAMem = pPar
20470 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20  se->nMem + 1;.  
20480 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
20490 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45   += pGroupBy->nE
204a0 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d  xpr;.      iBMem
204b0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
204c0 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
204d0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
204e0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
204f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20500 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
20510 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67  r, 0, iAbortFlag
20520 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
20530 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20  ment((v, "clear 
20540 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
20550 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20560 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
20570 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61  eger, 0, iUseFla
20580 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
20590 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63  mment((v, "indic
205a0 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
205b0 65 6d 70 74 79 22 29 29 3b 0a 0a 20 20 20 20 20  empty"));..     
205c0 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70   /* Begin a loop
205d0 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
205e0 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f  ct all source ro
205f0 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ws in GROUP BY o
20600 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rder..      ** T
20610 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76  his might involv
20620 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c  e two separate l
20630 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f  oops with an OP_
20640 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c  Sort in between,
20650 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   or.      ** it 
20660 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c  might be a singl
20670 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73  e loop that uses
20680 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74   an index to ext
20690 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ract information
206a0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  .      ** in the
206b0 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20   right order to 
206c0 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20  begin with..    
206d0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
206e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
206f0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
20700 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
20710 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
20720 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
20730 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
20740 74 2c 20 70 57 68 65 72 65 2c 20 26 70 47 72 6f  t, pWhere, &pGro
20750 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20  upBy, 0);.      
20760 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
20770 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
20780 0a 20 20 20 20 20 20 69 66 28 20 70 47 72 6f 75  .      if( pGrou
20790 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBy==0 ){.      
207a0 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a    /* The optimiz
207b0 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65  er is able to de
207c0 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72  liver rows in gr
207d0 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a  oup by order so.
207e0 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f          ** we do
207f0 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72   not have to sor
20800 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45  t.  The OP_OpenE
20810 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
20820 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
20830 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65  * cancelled late
20840 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69  r because we sti
20850 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74  ll need to use t
20860 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20  he pKeyInfo.    
20870 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
20880 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
20890 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 67  oupBy;.        g
208a0 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a  roupBySort = 0;.
208b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
208c0 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65       /* Rows are
208d0 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75   coming out in u
208e0 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65  ndetermined orde
208f0 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70  r.  We have to p
20900 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  ush.        ** e
20910 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73  ach row into a s
20920 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65  orting index, te
20930 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73  rminate the firs
20940 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  t loop,.        
20950 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65  ** then loop ove
20960 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
20970 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  dex in order to 
20980 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20  get the output. 
20990 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72         ** in sor
209a0 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ted order.      
209b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
209c0 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
209d0 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
209e0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
209f0 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  l;.        int n
20a00 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20  GroupBy;..      
20a10 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
20a20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75  1;.        nGrou
20a30 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  pBy = pGroupBy->
20a40 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e  nExpr;.        n
20a50 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b  Col = nGroupBy +
20a60 20 31 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20   1;.        j = 
20a70 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20  nGroupBy+1;.    
20a80 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
20a90 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
20aa0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
20ab0 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43   if( sAggInfo.aC
20ac0 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c  ol[i].iSorterCol
20ad0 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
20ae0 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20        nCol++;.  
20af0 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
20b00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20b10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
20b20 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
20b30 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
20b40 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
20b50 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
20b60 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
20b70 2c 20 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42  , pGroupBy, regB
20b80 61 73 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ase, 0);.       
20b90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20ba0 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
20bb0 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  e, sAggInfo.sort
20bc0 69 6e 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e  ingIdx,regBase+n
20bd0 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20  GroupBy);.      
20be0 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31    j = nGroupBy+1
20bf0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
20c00 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
20c10 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
20c20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 67         struct Ag
20c30 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20  gInfo_col *pCol 
20c40 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  = &sAggInfo.aCol
20c50 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [i];.          i
20c60 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72  f( pCol->iSorter
20c70 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20  Column>=j ){.   
20c80 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20           int r1 
20c90 3d 20 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20  = j + regBase;. 
20ca0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72             int r
20cb0 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  2;..            
20cc0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
20cd0 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
20ce0 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
20cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d00 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62        pCol->pTab
20d10 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c  , pCol->iColumn,
20d20 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72   pCol->iTable, r
20d30 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
20d40 20 20 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b     if( r1!=r2 ){
20d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
20d60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20d70 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32  (v, OP_SCopy, r2
20d80 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , r1);.         
20d90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
20da0 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
20db0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
20dc0 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20      regRecord = 
20dd0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
20de0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
20df0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20e00 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
20e10 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20  ecord, regBase, 
20e20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29  nCol, regRecord)
20e30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20e40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20e50 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 73 41 67  P_IdxInsert, sAg
20e60 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
20e70 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
20e80 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
20e90 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
20ea0 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
20eb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
20ec0 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
20ed0 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
20ee0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
20ef0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
20f00 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
20f10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20f20 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 73  p2(v, OP_Sort, s
20f30 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
20f40 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  dx, addrEnd);.  
20f50 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
20f60 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20  t((v, "GROUP BY 
20f70 73 6f 72 74 22 29 29 3b 0a 20 20 20 20 20 20 20  sort"));.       
20f80 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72   sAggInfo.useSor
20f90 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20  tingIdx = 1;.   
20fa0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45     }..      /* E
20fb0 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72  valuate the curr
20fc0 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
20fd0 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20  ms and store in 
20fe0 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20  b0, b1, b2....  
20ff0 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65      ** (b0 is me
21000 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42  mory location iB
21010 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d  Mem+0, b1 is iBM
21020 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72  em+1, and so for
21030 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  th).      ** The
21040 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75  n compare the cu
21050 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
21060 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65  erms against the
21070 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a   GROUP BY terms.
21080 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
21090 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63  e previous row c
210a0 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
210b0 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e  in a0, a1, a2...
210c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
210d0 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20  addrTopOfLoop = 
210e0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
210f0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
21100 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f   for(j=0; j<pGro
21110 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  upBy->nExpr; j++
21120 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  ){.        if( g
21130 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
21140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
21150 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
21160 43 6f 6c 75 6d 6e 2c 20 73 41 67 67 49 6e 66 6f  Column, sAggInfo
21170 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 6a 2c 20  .sortingIdx, j, 
21180 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20  iBMem+j);.      
21190 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
211a0 20 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65     sAggInfo.dire
211b0 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  ctMode = 1;.    
211c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
211d0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47  rCode(pParse, pG
211e0 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78  roupBy->a[j].pEx
211f0 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20  pr, iBMem+j);.  
21200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
21210 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21220 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
21230 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42  mpare, iAMem, iB
21240 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Mem, pGroupBy->n
21250 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21270 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
21280 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
21290 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
212a0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
212b0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
212c0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
212d0 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c  P_Jump, j1+1, 0,
212e0 20 6a 31 2b 31 29 3b 0a 0a 20 20 20 20 20 20 2f   j1+1);..      /
212f0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
21300 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76  that runs whenev
21310 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  er the GROUP BY 
21320 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a  changes..      *
21330 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65  * Changes in the
21340 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65   GROUP BY are de
21350 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72  tected by the pr
21360 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20  evious code.    
21370 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20    ** block.  If 
21380 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68  there were no ch
21390 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63  anges, this bloc
213a0 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20  k is skipped..  
213b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
213c0 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73  This code copies
213d0 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62   current group b
213e0 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31  y terms in b0,b1
213f0 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  ,b2,....      **
21400 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61   over to a0,a1,a
21410 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c  2.  It then call
21420 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62  s the output sub
21430 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
21440 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
21450 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
21460 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20  lator registers 
21470 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20  in preparation. 
21480 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
21490 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61  next GROUP BY ba
214a0 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tch..      */.  
214b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
214c0 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
214d0 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47  iBMem, iAMem, pG
214e0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a  roupBy->nExpr);.
214f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21500 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
21510 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
21520 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
21530 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
21540 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
21550 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20   one row"));.   
21560 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21570 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
21580 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64  , iAbortFlag, ad
21590 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 56 64  drEnd);.      Vd
215a0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63  beComment((v, "c
215b0 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22  heck abort flag"
215c0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
215d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
215e0 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
215f0 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
21600 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
21610 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63 75  ((v, "reset accu
21620 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
21630 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
21640 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
21650 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e  ulators based on
21660 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
21670 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72        ** the cur
21680 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a  rent row.      *
21690 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
216a0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
216b0 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65  1);.      update
216c0 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
216d0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
216e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
216f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
21700 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c  teger, 1, iUseFl
21710 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
21720 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69  omment((v, "indi
21730 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63  cate data in acc
21740 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
21750 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
21760 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a  e loop.      */.
21770 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
21780 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
21790 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
217a0 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 73  p2(v, OP_Next, s
217b0 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
217c0 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  dx, addrTopOfLoo
217d0 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  p);.      }else{
217e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
217f0 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
21800 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
21810 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
21820 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67  p(v, addrSorting
21830 49 64 78 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Idx, 1);.      }
21840 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75  ..      /* Outpu
21850 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20  t the final row 
21860 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  of result.      
21870 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
21880 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21890 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75  _Gosub, regOutpu
218a0 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74  tRow, addrOutput
218b0 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
218c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74  Comment((v, "out
218d0 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29  put final row"))
218e0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70  ;..      /* Jump
218f0 20 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f 75   over the subrou
21900 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20  tines.      */. 
21910 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21920 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
21930 6f 2c 20 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a  o, 0, addrEnd);.
21940 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
21950 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
21960 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73  that outputs a s
21970 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
21980 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
21990 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72   set.  This subr
219a0 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f  outine first loo
219b0 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c  ks at the iUseFl
219c0 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67  ag.  If iUseFlag
219d0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73  .      ** is les
219e0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
219f0 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62  to zero, the sub
21a00 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
21a10 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a  op.  If.      **
21a20 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
21a30 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75  calls for the qu
21a40 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68  ery to abort, th
21a50 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  is subroutine.  
21a60 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74      ** increment
21a70 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67  s the iAbortFlag
21a80 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
21a90 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
21aa0 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  g in.      ** or
21ab0 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68  der to signal th
21ac0 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72  e caller to abor
21ad0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
21ae0 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d    addrSetAbort =
21af0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
21b00 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
21b10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21b20 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
21b30 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67  r, 1, iAbortFlag
21b40 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
21b50 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62  ment((v, "set ab
21b60 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20  ort flag"));.   
21b70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
21b80 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
21b90 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
21ba0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21bb0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
21bc0 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  v, addrOutputRow
21bd0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74  );.      addrOut
21be0 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  putRow = sqlite3
21bf0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
21c00 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
21c10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
21c20 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61  P_IfPos, iUseFla
21c30 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
21c40 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  +2);.      VdbeC
21c50 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75  omment((v, "Grou
21c60 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
21c70 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74  ator entry point
21c80 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
21c90 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
21ca0 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
21cb0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
21cc0 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
21cd0 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
21ce0 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69  ggInfo);.      i
21cf0 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
21d00 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
21d10 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
21d20 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75   pHaving, addrOu
21d30 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54  tputRow+1, SQLIT
21d40 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
21d50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c       }.      sel
21d60 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
21d70 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
21d80 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42  t, 0, 0, pOrderB
21d90 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
21da0 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e 63           distinc
21db0 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  t, pDest,.      
21dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21dd0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
21de0 20 61 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a   addrSetAbort);.
21df0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21e00 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
21e10 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
21e20 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
21e30 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
21e40 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  groupby result g
21e50 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20  enerator"));..  
21e60 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
21e70 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
21e80 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65  t will reset the
21e90 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75   group-by accumu
21ea0 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20  lator.      */. 
21eb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21ec0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
21ed0 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
21ee0 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
21ef0 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
21f00 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
21f10 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
21f20 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
21f30 52 65 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20  Reset);.     .  
21f40 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72    } /* endif pGr
21f50 6f 75 70 42 79 20 2a 2f 0a 20 20 20 20 65 6c 73  oupBy */.    els
21f60 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  e {.      ExprLi
21f70 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b  st *pMinMax = 0;
21f80 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
21f90 2a 70 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20  *pDel = 0;.     
21fa0 20 75 38 20 66 6c 61 67 3b 0a 0a 20 20 20 20 20   u8 flag;..     
21fb0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
21fc0 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65   query is of one
21fd0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
21fe0 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 2a  g forms:.      *
21ff0 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c  *.      **   SEL
22000 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20  ECT min(x) FROM 
22010 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 53  ....      **   S
22020 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f  ELECT max(x) FRO
22030 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  M ....      **. 
22040 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69 73       ** If it is
22050 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20 63  , then ask the c
22060 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 74  ode in where.c t
22070 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f 72  o attempt to sor
22080 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  t results.      
22090 2a 2a 20 61 73 20 69 66 20 74 68 65 72 65 20 77  ** as if there w
220a0 61 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20  as an "ORDER ON 
220b0 78 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20  x" or "ORDER ON 
220c0 78 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20  x DESC" clause. 
220d0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65  .      ** If whe
220e0 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20  re.c is able to 
220f0 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20  produce results 
22100 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f  sorted in this o
22110 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20  rder, then.     
22120 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64   ** add vdbe cod
22130 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
22140 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  f the processing
22150 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20   loop after the 
22160 0a 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20  .      ** first 
22170 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63 65  iteration (since
22180 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
22190 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
221a0 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 67 75   is .      ** gu
221b0 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72  aranteed to oper
221c0 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77  ate on the row w
221d0 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20  ith the minimum 
221e0 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20  or maximum .    
221f0 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c    ** value of x,
22200 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65   the only row re
22210 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 2a  quired)..      *
22220 2a 0a 20 20 20 20 20 20 2a 2a 20 41 20 73 70 65  *.      ** A spe
22230 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20 62  cial flag must b
22240 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  e passed to sqli
22250 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
22260 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20  to slightly.    
22270 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61    ** modify beha
22280 76 69 6f 75 72 20 61 73 20 66 6f 6c 6c 6f 77 73  viour as follows
22290 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
222a0 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71   **   + If the q
222b0 75 65 72 79 20 69 73 20 61 20 22 53 45 4c 45 43  uery is a "SELEC
222c0 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20  T min(x)", then 
222d0 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62  the loop coded b
222e0 79 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77  y.      **     w
222f0 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f  here.c should no
22300 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  t iterate over a
22310 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20 61  ny values with a
22320 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20   NULL value.    
22330 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a    **     for x..
22340 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
22350 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69  *   + The optimi
22360 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72  zer code in wher
22370 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20 74  e.c (the thing t
22380 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69 63  hat decides whic
22390 68 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69  h.      **     i
223a0 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20  ndex or indices 
223b0 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70  to use) should p
223c0 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74  lace a different
223d0 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20   priority on .  
223e0 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73      **     satis
223f0 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52  fying the 'ORDER
22400 20 42 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e   BY' clause than
22410 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65   it does in othe
22420 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20 20 2a  r cases..      *
22430 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f 20 63  *     Refer to c
22440 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73  ode and comments
22450 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20   in where.c for 
22460 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 2a  details..      *
22470 2f 0a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 6d  /.      flag = m
22480 69 6e 4d 61 78 51 75 65 72 79 28 70 29 3b 0a 20  inMaxQuery(p);. 
22490 20 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b       if( flag ){
224a0 0a 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20  .        pDel = 
224b0 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65  pMinMax = sqlite
224c0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
224d0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
224e0 2e 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a  .pExpr->pList);.
224f0 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e          if( pMin
22500 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  Max && !db->mall
22510 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
22520 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
22530 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
22540 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45  flag!=WHERE_ORDE
22550 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20 20  RBY_MIN;.       
22560 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d     pMinMax->a[0]
22570 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f  .pExpr->op = TK_
22580 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20  COLUMN;.        
22590 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
225a0 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75   /* This case ru
225b0 6e 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67  ns if the aggreg
225c0 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50  ate has no GROUP
225d0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65   BY clause.  The
225e0 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  .      ** proces
225f0 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d  sing is much sim
22600 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65  pler since there
22610 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c   is only a singl
22620 65 20 72 6f 77 0a 20 20 20 20 20 20 2a 2a 20 6f  e row.      ** o
22630 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20  f output..      
22640 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 74 41 63  */.      resetAc
22650 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
22660 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
22670 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
22680 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
22690 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
226a0 20 70 57 68 65 72 65 2c 20 26 70 4d 69 6e 4d 61   pWhere, &pMinMa
226b0 78 2c 20 66 6c 61 67 29 3b 0a 20 20 20 20 20 20  x, flag);.      
226c0 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b  if( pWInfo==0 ){
226d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
226e0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
226f0 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20  b, pDel);.      
22700 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
22710 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
22720 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
22730 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
22740 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  Info);.      if(
22750 20 21 70 4d 69 6e 4d 61 78 20 26 26 20 66 6c 61   !pMinMax && fla
22760 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
22770 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
22780 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 57  , OP_Goto, 0, pW
22790 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 20  Info->iBreak);. 
227a0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
227b0 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20  nt((v, "%s() by 
227c0 69 6e 64 65 78 22 2c 28 66 6c 61 67 3d 3d 57 48  index",(flag==WH
227d0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f  ERE_ORDERBY_MIN?
227e0 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a  "min":"max")));.
227f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
22800 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
22810 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 66 69 6e  Info);.      fin
22820 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e  alizeAggFunction
22830 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  s(pParse, &sAggI
22840 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 4f 72 64  nfo);.      pOrd
22850 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
22860 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
22870 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
22880 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
22890 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45  , pHaving, addrE
228a0 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nd, SQLITE_JUMPI
228b0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 7d 0a  FNULL);.      }.
228c0 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
228d0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
228e0 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30   p->pEList, 0, 0
228f0 2c 20 30 2c 20 2d 31 2c 20 0a 20 20 20 20 20 20  , 0, -1, .      
22900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22910 70 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20  pDest, addrEnd, 
22920 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20  addrEnd);..     
22930 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
22940 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29  Delete(db, pDel)
22950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
22960 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
22970 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b  bel(v, addrEnd);
22980 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64  .    .  } /* end
22990 69 66 20 61 67 67 72 65 67 61 74 65 20 71 75 65  if aggregate que
229a0 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  ry */..  /* If t
229b0 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
229c0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
229d0 20 77 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74   we need to sort
229e0 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a   the results.  *
229f0 2a 20 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20  * and send them 
22a00 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
22a10 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f  one by one..  */
22a20 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
22a30 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53  ){.    generateS
22a40 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20  ortTail(pParse, 
22a50 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  p, v, pEList->nE
22a60 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d  xpr, pDest);.  }
22a70 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
22a80 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75   to skip this qu
22a90 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ery.  */.  sqlit
22aa0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
22ab0 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20  el(v, iEnd);..  
22ac0 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 77 61  /* The SELECT wa
22ad0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
22ae0 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68 65 20  oded.   Set the 
22af0 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30  return code to 0
22b00 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
22b10 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a  e no errors..  *
22b20 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f  /.  rc = 0;..  /
22b30 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20  * Control jumps 
22b40 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72  to here if an er
22b50 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
22b60 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f  ed above, or upo
22b70 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75  n.  ** successfu
22b80 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  l coding of the 
22b90 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c  SELECT..  */.sel
22ba0 65 63 74 5f 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49  ect_end:..  /* I
22bb0 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e  dentify column n
22bc0 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74 73 20  ames if results 
22bd0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 61 72  of the SELECT ar
22be0 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a  e to be output..
22bf0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
22c00 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73  QLITE_OK && pDes
22c10 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
22c20 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65  tput ){.    gene
22c30 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
22c40 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
22c50 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a  , pEList);.  }..
22c60 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
22c70 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f  db, sAggInfo.aCo
22c80 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  l);.  sqlite3DbF
22c90 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ree(db, sAggInfo
22ca0 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72  .aFunc);.  retur
22cb0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66  n rc;.}..#if def
22cc0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
22cd0 47 29 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  G)./*.**********
22ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d20 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  *****.** The fol
22d30 6c 6f 77 69 6e 67 20 63 6f 64 65 20 69 73 20 75  lowing code is u
22d40 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
22d50 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
22d60 6c 79 2e 20 20 54 68 65 20 63 6f 64 65 0a 2a 2a  ly.  The code.**
22d70 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 6f   that follows do
22d80 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 69 6e  es not appear in
22d90 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73 2e 0a   normal builds..
22da0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
22db0 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
22dc0 20 70 72 69 6e 74 20 6f 75 74 20 74 68 65 20 63   print out the c
22dd0 6f 6e 74 65 6e 74 20 6f 66 20 61 6c 6c 20 6f 72  ontent of all or
22de0 20 70 61 72 74 20 6f 66 20 61 20 0a 2a 2a 20 70   part of a .** p
22df0 61 72 73 65 20 73 74 72 75 63 74 75 72 65 73 20  arse structures 
22e00 73 75 63 68 20 61 73 20 53 65 6c 65 63 74 20 6f  such as Select o
22e10 72 20 45 78 70 72 2e 20 20 53 75 63 68 20 70 72  r Expr.  Such pr
22e20 69 6e 74 6f 75 74 73 20 61 72 65 20 75 73 65 66  intouts are usef
22e30 75 6c 0a 2a 2a 20 66 6f 72 20 68 65 6c 70 69 6e  ul.** for helpin
22e40 67 20 74 6f 20 75 6e 64 65 72 73 74 61 6e 64 20  g to understand 
22e50 77 68 61 74 20 69 73 20 68 61 70 70 65 6e 69 6e  what is happenin
22e60 67 20 69 6e 73 69 64 65 20 74 68 65 20 63 6f 64  g inside the cod
22e70 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 64  e generator.** d
22e80 75 72 69 6e 67 20 74 68 65 20 65 78 65 63 75 74  uring the execut
22e90 69 6f 6e 20 6f 66 20 63 6f 6d 70 6c 65 78 20 53  ion of complex S
22ea0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
22eb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
22ec0 75 74 69 6e 65 20 61 72 65 20 6e 6f 74 20 63 61  utine are not ca
22ed0 6c 6c 65 64 20 61 6e 79 77 68 65 72 65 20 66 72  lled anywhere fr
22ee0 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 6e 6f  om within the no
22ef0 72 6d 61 6c 0a 2a 2a 20 63 6f 64 65 20 62 61 73  rmal.** code bas
22f00 65 2e 20 20 54 68 65 6e 20 61 72 65 20 69 6e 74  e.  Then are int
22f10 65 6e 64 65 64 20 74 6f 20 62 65 20 63 61 6c 6c  ended to be call
22f20 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ed from within t
22f30 68 65 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 6f  he debugger.** o
22f40 72 20 66 72 6f 6d 20 74 65 6d 70 6f 72 61 72 79  r from temporary
22f50 20 22 70 72 69 6e 74 66 22 20 73 74 61 74 65 6d   "printf" statem
22f60 65 6e 74 73 20 69 6e 73 65 72 74 65 64 20 66 6f  ents inserted fo
22f70 72 20 64 65 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a  r debugging..*/.
22f80 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69 6e  void sqlite3Prin
22f90 74 45 78 70 72 28 45 78 70 72 20 2a 70 29 7b 0a  tExpr(Expr *p){.
22fa0 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a    if( p->token.z
22fb0 20 26 26 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30   && p->token.n>0
22fc0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
22fd0 65 62 75 67 50 72 69 6e 74 66 28 22 28 25 2e 2a  ebugPrintf("(%.*
22fe0 73 22 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20  s", p->token.n, 
22ff0 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d  p->token.z);.  }
23000 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
23010 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28 25  3DebugPrintf("(%
23020 64 22 2c 20 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a  d", p->op);.  }.
23030 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 29    if( p->pLeft )
23040 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
23050 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20  ugPrintf(" ");. 
23060 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
23070 78 70 72 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  xpr(p->pLeft);. 
23080 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67   }.  if( p->pRig
23090 68 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ht ){.    sqlite
230a0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 22  3DebugPrintf(" "
230b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
230c0 69 6e 74 45 78 70 72 28 70 2d 3e 70 52 69 67 68  intExpr(p->pRigh
230d0 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
230e0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 29 22  3DebugPrintf(")"
230f0 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
23100 33 50 72 69 6e 74 45 78 70 72 4c 69 73 74 28 45  3PrintExprList(E
23110 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
23120 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
23130 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
23140 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
23150 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
23160 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
23170 72 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 4c  r);.    if( i<pL
23180 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a  ist->nExpr-1 ){.
23190 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
231a0 75 67 50 72 69 6e 74 66 28 22 2c 20 22 29 3b 0a  ugPrintf(", ");.
231b0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64      }.  }.}.void
231c0 20 73 71 6c 69 74 65 33 50 72 69 6e 74 53 65 6c   sqlite3PrintSel
231d0 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 69  ect(Select *p, i
231e0 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 73 71  nt indent){.  sq
231f0 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23200 28 22 25 2a 73 53 45 4c 45 43 54 28 25 70 29 20  ("%*sSELECT(%p) 
23210 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 2c 20 70  ", indent, "", p
23220 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 72 69 6e  );.  sqlite3Prin
23230 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 45 4c  tExprList(p->pEL
23240 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ist);.  sqlite3D
23250 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
23260 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 20  ;.  if( p->pSrc 
23270 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72  ){.    char *zPr
23280 65 66 69 78 3b 0a 20 20 20 20 69 6e 74 20 69 3b  efix;.    int i;
23290 0a 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22  .    zPrefix = "
232a0 46 52 4f 4d 22 3b 0a 20 20 20 20 66 6f 72 28 69  FROM";.    for(i
232b0 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e  =0; i<p->pSrc->n
232c0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
232d0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
232e0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
232f0 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  ->pSrc->a[i];.  
23300 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23310 50 72 69 6e 74 66 28 22 25 2a 73 20 22 2c 20 69  Printf("%*s ", i
23320 6e 64 65 6e 74 2b 36 2c 20 7a 50 72 65 66 69 78  ndent+6, zPrefix
23330 29 3b 0a 20 20 20 20 20 20 7a 50 72 65 66 69 78  );.      zPrefix
23340 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66 28   = "";.      if(
23350 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
23360 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
23370 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 28  e3DebugPrintf("(
23380 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71  \n");.        sq
23390 6c 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74  lite3PrintSelect
233a0 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c  (pItem->pSelect,
233b0 20 69 6e 64 65 6e 74 2b 31 30 29 3b 0a 20 20 20   indent+10);.   
233c0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
233d0 67 50 72 69 6e 74 66 28 22 25 2a 73 29 22 2c 20  gPrintf("%*s)", 
233e0 69 6e 64 65 6e 74 2b 38 2c 20 22 22 29 3b 0a 20  indent+8, "");. 
233f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
23400 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  Item->zName ){. 
23410 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
23420 62 75 67 50 72 69 6e 74 66 28 22 25 73 22 2c 20  bugPrintf("%s", 
23430 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
23440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
23450 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b 0a   pItem->pTab ){.
23460 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
23470 65 62 75 67 50 72 69 6e 74 66 28 22 28 74 61 62  ebugPrintf("(tab
23480 6c 65 3a 20 25 73 29 22 2c 20 70 49 74 65 6d 2d  le: %s)", pItem-
23490 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pTab->zName);. 
234a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
234b0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29   pItem->zAlias )
234c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
234d0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 41  3DebugPrintf(" A
234e0 53 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 41  S %s", pItem->zA
234f0 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lias);.      }. 
23500 20 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 70 53       if( i<p->pS
23510 72 63 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20  rc->nSrc-1 ){.  
23520 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
23530 75 67 50 72 69 6e 74 66 28 22 2c 22 29 3b 0a 20  ugPrintf(",");. 
23540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
23550 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
23560 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  "\n");.    }.  }
23570 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65  .  if( p->pWhere
23580 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
23590 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a 73 20  ebugPrintf("%*s 
235a0 57 48 45 52 45 20 22 2c 20 69 6e 64 65 6e 74 2c  WHERE ", indent,
235b0 20 22 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   "");.    sqlite
235c0 33 50 72 69 6e 74 45 78 70 72 28 70 2d 3e 70 57  3PrintExpr(p->pW
235d0 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  here);.    sqlit
235e0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c  e3DebugPrintf("\
235f0 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n");.  }.  if( p
23600 2d 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ->pGroupBy ){.  
23610 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23620 69 6e 74 66 28 22 25 2a 73 20 47 52 4f 55 50 20  intf("%*s GROUP 
23630 42 59 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  BY ", indent, ""
23640 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
23650 69 6e 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70  intExprList(p->p
23660 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71  GroupBy);.    sq
23670 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23680 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66  ("\n");.  }.  if
23690 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a  ( p->pHaving ){.
236a0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
236b0 50 72 69 6e 74 66 28 22 25 2a 73 20 48 41 56 49  Printf("%*s HAVI
236c0 4e 47 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22  NG ", indent, ""
236d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72  );.    sqlite3Pr
236e0 69 6e 74 45 78 70 72 28 70 2d 3e 70 48 61 76 69  intExpr(p->pHavi
236f0 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ng);.    sqlite3
23700 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
23710 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
23720 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
23730 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23740 74 66 28 22 25 2a 73 20 4f 52 44 45 52 20 42 59  tf("%*s ORDER BY
23750 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b   ", indent, "");
23760 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e  .    sqlite3Prin
23770 74 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72  tExprList(p->pOr
23780 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c 69  derBy);.    sqli
23790 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
237a0 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45  \n");.  }.}./* E
237b0 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  nd of the struct
237c0 75 72 65 20 64 65 62 75 67 20 70 72 69 6e 74 69  ure debug printi
237d0 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a  ng code.********
237e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
237f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23820 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  *****/.#endif /*
23830 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
23840 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64  TEST) || defined
23850 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 2a  (SQLITE_DEBUG) *
23860 2f 0a                                            /.