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

Artifact 18c6d96f4f8c6e43cb35201a1245ff02be8c9378:


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 35  select.c,v 1.485
0200: 20 32 30 30 38 2f 31 31 2f 31 37 20 31 39 3a 31   2008/11/17 19:1
0210: 38 3a 35 35 20 64 61 6e 69 65 6c 6b 31 39 37 37  8:55 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 50 61 72   minMaxQuery(Par
187d0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
187e0 63 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a  ct *p){.  Expr *
187f0 70 45 78 70 72 3b 0a 20 20 45 78 70 72 4c 69 73  pExpr;.  ExprLis
18800 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  t *pEList = p->p
18810 45 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 45  EList;..  if( pE
18820 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
18830 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52   return WHERE_OR
18840 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
18850 70 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  pExpr = pEList->
18860 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 70 45  a[0].pExpr;.  pE
18870 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
18880 69 73 74 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ist;.  if( pExpr
18890 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
188a0 43 54 49 4f 4e 20 7c 7c 20 70 45 4c 69 73 74 3d  CTION || pEList=
188b0 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 6e 45  =0 || pEList->nE
188c0 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
188d0 30 3b 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d  0;.  if( pEList-
188e0 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 21  >a[0].pExpr->op!
188f0 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
18900 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52   return WHERE_OR
18910 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
18920 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  if( pExpr->token
18930 2e 6e 21 3d 33 20 29 20 72 65 74 75 72 6e 20 57  .n!=3 ) return W
18940 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
18950 4d 41 4c 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  MAL;.  if( sqlit
18960 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
18970 2a 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  *)pExpr->token.z
18980 2c 22 6d 69 6e 22 2c 33 29 3d 3d 30 20 29 7b 0a  ,"min",3)==0 ){.
18990 20 20 20 20 72 65 74 75 72 6e 20 57 48 45 52 45      return WHERE
189a0 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20  _ORDERBY_MIN;.  
189b0 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
189c0 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a  3StrNICmp((char*
189d0 29 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c  )pExpr->token.z,
189e0 22 6d 61 78 22 2c 33 29 3d 3d 30 20 29 7b 0a 20  "max",3)==0 ){. 
189f0 20 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f     return WHERE_
18a00 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 7d  ORDERBY_MAX;.  }
18a10 0a 20 20 72 65 74 75 72 6e 20 57 48 45 52 45 5f  .  return WHERE_
18a20 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
18a30 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
18a40 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d  source-list item
18a50 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
18a60 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65  gument was augme
18a70 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20  nted with an.** 
18a80 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
18a90 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c  e, then try to l
18aa0 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66  ocate the specif
18ab0 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ied index. If th
18ac0 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20  ere.** was such 
18ad0 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  a clause and the
18ae0 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e   named index can
18af0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  not be found, re
18b00 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
18b10 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20  ERROR and leave 
18b20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
18b30 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70  se. Otherwise, p
18b40 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f  opulate .** pFro
18b50 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65  m->pIndex and re
18b60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
18b70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
18b80 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61  dexedByLookup(Pa
18b90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
18ba0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
18bb0 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
18bc0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70  pFrom->pTab && p
18bd0 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a  From->zIndex ){.
18be0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
18bf0 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
18c00 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 20     char *zIndex 
18c10 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b  = pFrom->zIndex;
18c20 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
18c30 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
18c40 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20  Tab->pIndex; .  
18c50 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71        pIdx && sq
18c60 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64  lite3StrICmp(pId
18c70 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78  x->zName, zIndex
18c80 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  ); .        pIdx
18c90 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20  =pIdx->pNext.   
18ca0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64   );.    if( !pId
18cb0 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  x ){.      sqlit
18cc0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
18cd0 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
18ce0 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20  x: %s", zIndex, 
18cf0 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
18d00 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
18d10 20 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e     }.    pFrom->
18d20 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20  pIndex = pIdx;. 
18d30 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
18d40 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
18d50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
18d60 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  a Walker callbac
18d70 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67  k for "expanding
18d80 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
18d90 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64  ment..** "Expand
18da0 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f  ing" means to do
18db0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
18dc0 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61  **.**    (1)  Ma
18dd0 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72  ke sure VDBE cur
18de0 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
18df0 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
18e00 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20  o every.**      
18e10 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68     element of th
18e20 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
18e30 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c  *.**    (2)  Fil
18e40 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
18e50 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
18e60 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
18e70 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
18e80 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20     defines FROM 
18e90 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69  clause.  When vi
18ea0 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  ews appear in th
18eb0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a  e FROM clause,.*
18ec0 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
18ed0 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
18ee0 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
18ef0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
18f00 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
18f10 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
18f20 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
18f30 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
18f40 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
18f50 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
18f60 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
18f70 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
18f80 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
18f90 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
18fa0 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
18fb0 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
18fc0 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
18fd0 72 65 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  resistent repres
18fe0 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
18ff0 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
19000 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41  .**.**    (3)  A
19010 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
19020 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
19030 61 63 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e  accomodate the N
19040 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a  ATURAL keyword.*
19050 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69  *         on joi
19060 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e  ns and the ON an
19070 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  d USING clause o
19080 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20  f joins..**.**  
19090 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20    (4)  Scan the 
190a0 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
190b0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
190c0 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69  t (pEList) looki
190d0 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f  ng.**         fo
190e0 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
190f0 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20  he "*" operator 
19100 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f  or the TABLE.* o
19110 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20  perator..**     
19120 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78      If found, ex
19130 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f  pand each "*" to
19140 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
19150 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a   in every table.
19160 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54  **         and T
19170 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65  ABLE.* to be eve
19180 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42  ry column in TAB
19190 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  LE..**.*/.static
191a0 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e   int selectExpan
191b0 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  der(Walker *pWal
191c0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
191d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
191e0 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
191f0 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  se;.  int i, j, 
19200 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  k;.  SrcList *pT
19210 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69  abList;.  ExprLi
19220 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74  st *pEList;.  st
19230 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
19240 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69  m *pFrom;.  sqli
19250 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
19260 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d  ->db;..  if( db-
19270 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29  >mallocFailed  )
19280 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
19290 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 69 66  _Abort;.  }.  if
192a0 28 20 70 2d 3e 70 53 72 63 3d 3d 30 20 7c 7c 20  ( p->pSrc==0 || 
192b0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
192c0 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29  F_Expanded)!=0 )
192d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
192e0 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 2d  _Prune;.  }.  p-
192f0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
19300 45 78 70 61 6e 64 65 64 3b 0a 20 20 70 54 61 62  Expanded;.  pTab
19310 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
19320 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
19330 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  List;..  /* Make
19340 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d   sure cursor num
19350 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
19360 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65  ssigned to all e
19370 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74  ntries in.  ** t
19380 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
19390 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
193a0 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73  tement..  */.  s
193b0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
193c0 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
193d0 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20  e, pTabList);.. 
193e0 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
193f0 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
19400 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19410 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
19420 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
19430 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
19440 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
19450 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
19460 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
19470 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
19480 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
19490 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
194a0 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
194b0 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
194c0 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
194d0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
194e0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
194f0 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
19500 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69  ble *pTab;.    i
19510 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  f( pFrom->pTab!=
19520 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
19530 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  is statement has
19540 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
19550 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69  epared.  There i
19560 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20  s no need.      
19570 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72  ** to go further
19580 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
19590 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20  t( i==0 );.     
195a0 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
195b0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
195c0 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30   pFrom->zName==0
195d0 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
195e0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
195f0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
19600 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
19610 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41  lect;.      /* A
19620 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68   sub-query in th
19630 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
19640 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20   a SELECT */.   
19650 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21     assert( pSel!
19660 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
19670 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
19680 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
19690 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
196a0 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20  alker, pSel);.  
196b0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
196c0 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
196d0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
196e0 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
196f0 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
19700 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
19710 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
19720 62 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  b->db = db;.    
19730 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31    pTab->nRef = 1
19740 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e  ;.      pTab->zN
19750 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
19760 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65  intf(db, "sqlite
19770 5f 73 75 62 71 75 65 72 79 5f 25 70 5f 22 2c 20  _subquery_%p_", 
19780 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20  (void*)pTab);.  
19790 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d      while( pSel-
197a0 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20  >pPrior ){ pSel 
197b0 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20  = pSel->pPrior; 
197c0 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74 43 6f  }.      selectCo
197d0 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
197e0 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e  t(pParse, pSel->
197f0 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
19800 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
19810 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 69  );.      pTab->i
19820 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20  PKey = -1;.     
19830 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
19840 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b  |= TF_Ephemeral;
19850 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
19860 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f  e{.      /* An o
19870 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f 72  rdinary table or
19880 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74 68   view name in th
19890 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
198a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
198b0 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b  From->pTab==0 );
198c0 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
198d0 61 62 20 3d 20 70 54 61 62 20 3d 20 0a 20 20 20  ab = pTab = .   
198e0 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
198f0 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 30  teTable(pParse,0
19900 2c 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 2c 70 46  ,pFrom->zName,pF
19910 72 6f 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  rom->zDatabase);
19920 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
19930 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
19940 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
19950 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21  b->nRef++;.#if !
19960 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
19970 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
19980 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d  fined (SQLITE_OM
19990 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
199a0 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
199b0 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56 69  >pSelect || IsVi
199c0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
199d0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65 61         /* We rea
199e0 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20 6e  ch here if the n
199f0 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61 20  amed table is a 
19a00 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f  really a view */
19a10 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
19a20 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
19a30 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
19a40 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52  Tab) ) return WR
19a50 43 5f 41 62 6f 72 74 3b 0a 0a 20 20 20 20 20 20  C_Abort;..      
19a60 20 20 2f 2a 20 49 66 20 70 46 72 6f 6d 2d 3e 70    /* If pFrom->p
19a70 53 65 6c 65 63 74 21 3d 30 20 69 74 20 6d 65 61  Select!=0 it mea
19a80 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
19a90 67 20 77 69 74 68 20 61 0a 20 20 20 20 20 20 20  g with a.       
19aa0 20 2a 2a 20 76 69 65 77 20 77 69 74 68 69 6e 20   ** view within 
19ab0 61 20 76 69 65 77 2e 20 20 54 68 65 20 53 45 4c  a view.  The SEL
19ac0 45 43 54 20 73 74 72 75 63 74 75 72 65 20 68 61  ECT structure ha
19ad0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20  s already been. 
19ae0 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64         ** copied
19af0 20 62 79 20 74 68 65 20 6f 75 74 65 72 20 76 69   by the outer vi
19b00 65 77 20 73 6f 20 77 65 20 63 61 6e 20 73 6b 69  ew so we can ski
19b10 70 20 74 68 65 20 63 6f 70 79 20 73 74 65 70 20  p the copy step 
19b20 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  here.        ** 
19b30 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 76 69 65  in the inner vie
19b40 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  w..        */.  
19b50 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d        if( pFrom-
19b60 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
19b70 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e           pFrom->
19b80 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
19b90 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
19ba0 54 61 62 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  Tab->pSelect);. 
19bb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19bc0 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
19bd0 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  er, pFrom->pSele
19be0 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ct);.        }. 
19bf0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
19c00 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61    }..    /* Loca
19c10 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  te the index nam
19c20 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45  ed by the INDEXE
19c30 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20  D BY clause, if 
19c40 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  any. */.    if( 
19c50 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
19c60 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
19c70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72  From) ){.      r
19c80 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
19c90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
19ca0 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c   Process NATURAL
19cb0 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f   keywords, and O
19cc0 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
19cd0 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20  ses of joins..  
19ce0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
19cf0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c  locFailed || sql
19d00 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
19d10 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
19d20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
19d30 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72  t;.  }..  /* For
19d40 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20   every "*" that 
19d50 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f  occurs in the co
19d60 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72  lumn list, inser
19d70 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20  t the names of. 
19d80 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   ** all columns 
19d90 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20  in all tables.  
19da0 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41  And for every TA
19db0 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65  BLE.* insert the
19dc0 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61   names.  ** of a
19dd0 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41  ll columns in TA
19de0 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72  BLE.  The parser
19df0 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63   inserted a spec
19e00 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ial expression. 
19e10 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f   ** with the TK_
19e20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  ALL operator for
19e30 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69   each "*" that i
19e40 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63  t found in the c
19e50 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a  olumn list..  **
19e60 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
19e70 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20  ode just has to 
19e80 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c  locate the TK_AL
19e90 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e  L expressions an
19ea0 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61  d expand.  ** ea
19eb0 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69  ch one to the li
19ec0 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  st of all column
19ed0 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
19ee0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
19ef0 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63  irst loop just c
19f00 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
19f10 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a  there are any "*
19f20 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a  " operators.  **
19f30 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e   that need expan
19f40 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ding..  */.  for
19f50 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
19f60 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
19f70 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c 69   Expr *pE = pELi
19f80 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  st->a[k].pExpr;.
19f90 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
19fa0 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a  TK_ALL ) break;.
19fb0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
19fc0 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52  TK_DOT && pE->pR
19fd0 69 67 68 74 20 26 26 20 70 45 2d 3e 70 52 69 67  ight && pE->pRig
19fe0 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 0a 20  ht->op==TK_ALL. 
19ff0 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 70          && pE->p
1a000 4c 65 66 74 20 26 26 20 70 45 2d 3e 70 4c 65 66  Left && pE->pLef
1a010 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 20 62  t->op==TK_ID ) b
1a020 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
1a030 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
1a040 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
1a050 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
1a060 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
1a070 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
1a080 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
1a090 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
1a0a0 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
1a0b0 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
1a0c0 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
1a0d0 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
1a0e0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
1a0f0 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
1a100 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
1a110 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
1a120 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
1a130 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
1a140 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
1a150 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  w = 0;.    int f
1a160 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64  lags = pParse->d
1a170 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e  b->flags;.    in
1a180 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66  t longNames = (f
1a190 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
1a1a0 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20  llColNames)!=0. 
1a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1c0 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26       && (flags &
1a1d0 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
1a1e0 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20  Names)==0;..    
1a1f0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73  for(k=0; k<pELis
1a200 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a  t->nExpr; k++){.
1a210 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d        Expr *pE =
1a220 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[k].pExpr;.   
1a230 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54     if( pE->op!=T
1a240 4b 5f 41 4c 4c 20 26 26 0a 20 20 20 20 20 20 20  K_ALL &&.       
1a250 20 20 20 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f      (pE->op!=TK_
1a260 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  DOT || pE->pRigh
1a270 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 70 52 69 67  t==0 || pE->pRig
1a280 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20  ht->op!=TK_ALL) 
1a290 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1a2a0 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65 78  is particular ex
1a2b0 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f  pression does no
1a2c0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70  t need to be exp
1a2d0 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  anded..        *
1a2e0 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
1a2f0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1a300 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
1a310 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 2c  New, a[k].pExpr,
1a320 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
1a330 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
1a340 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
1a350 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20  >nExpr-1].zName 
1a360 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  = a[k].zName;.  
1a370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a380 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[k].pExpr = 0;.
1a390 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61          a[k].zNa
1a3a0 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  me = 0;.      }e
1a3b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
1a3c0 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  This expression 
1a3d0 69 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54  is a "*" or a "T
1a3e0 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64  ABLE.*" and need
1a3f0 73 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20  s to be.        
1a400 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a  ** expanded. */.
1a410 20 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c          int tabl
1a420 65 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  eSeen = 0;      
1a430 2f 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e  /* Set to 1 when
1a440 20 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a   TABLE matches *
1a450 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  /.        char *
1a460 7a 54 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  zTName;         
1a470 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61     /* text of na
1a480 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20  me of TABLE */. 
1a490 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
1a4a0 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
1a4b0 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
1a4c0 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71 6c      zTName = sql
1a4d0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1a4e0 6e 28 64 62 2c 20 26 70 45 2d 3e 70 4c 65 66 74  n(db, &pE->pLeft
1a4f0 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20  ->token);.      
1a500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a510 20 20 20 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 20     zTName = 0;. 
1a520 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a530 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
1a540 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
1a550 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
1a560 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
1a570 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
1a580 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
1a590 62 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  b;.          cha
1a5a0 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46  r *zTabName = pF
1a5b0 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  rom->zAlias;.   
1a5c0 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
1a5d0 61 6d 65 3d 3d 30 20 7c 7c 20 7a 54 61 62 4e 61  ame==0 || zTabNa
1a5e0 6d 65 5b 30 5d 3d 3d 30 20 29 7b 20 0a 20 20 20  me[0]==0 ){ .   
1a5f0 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d           zTabNam
1a600 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
1a610 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1a620 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
1a630 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72  allocFailed ) br
1a640 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eak;.          i
1a650 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c  f( zTName && sql
1a660 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61  ite3StrICmp(zTNa
1a670 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30  me, zTabName)!=0
1a680 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1a690 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1a6a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1a6b0 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 20  tableSeen = 1;. 
1a6c0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
1a6d0 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
1a6e0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
1a6f0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 2a    Expr *pExpr, *
1a700 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
1a710 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
1a720 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
1a730 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 20 20 20 20  zName;..        
1a740 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75      /* If a colu
1a750 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  mn is marked as 
1a760 27 68 69 64 64 65 6e 27 20 28 63 75 72 72 65 6e  'hidden' (curren
1a770 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c  tly only possibl
1a780 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
1a790 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62   for virtual tab
1a7a0 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63  les), do not inc
1a7b0 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65 20 65  lude it in the e
1a7c0 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20  xpanded.        
1a7d0 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65      ** result-se
1a7e0 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20  t list..        
1a7f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1a800 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e 43     if( IsHiddenC
1a810 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
1a820 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  l[j]) ){.       
1a830 20 20 20 20 20 20 20 61 73 73 65 72 74 28 49 73         assert(Is
1a840 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b 0a  Virtual(pTab));.
1a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
1a860 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1a870 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
1a880 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20     if( i>0 ){.  
1a890 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
1a8a0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1a8b0 2a 70 4c 65 66 74 20 3d 20 26 70 54 61 62 4c 69  *pLeft = &pTabLi
1a8c0 73 74 2d 3e 61 5b 69 2d 31 5d 3b 0a 20 20 20 20  st->a[i-1];.    
1a8d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
1a8e0 4c 65 66 74 5b 31 5d 2e 6a 6f 69 6e 74 79 70 65  Left[1].jointype
1a8f0 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d   & JT_NATURAL)!=
1a900 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  0 &&.           
1a910 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c               col
1a920 75 6d 6e 49 6e 64 65 78 28 70 4c 65 66 74 2d 3e  umnIndex(pLeft->
1a930 70 54 61 62 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20  pTab, zName)>=0 
1a940 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1a950 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
1a960 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
1a970 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
1a980 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
1a990 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
1a9a0 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a  e on the right *
1a9b0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1a9c0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1a9d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a9e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
1a9f0 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
1aa00 28 70 4c 65 66 74 5b 31 5d 2e 70 55 73 69 6e 67  (pLeft[1].pUsing
1aa10 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20  , zName)>=0 ){. 
1aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1aa30 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68  * In a join with
1aa40 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c   a USING clause,
1aa50 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e   omit columns in
1aa60 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
1aa70 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c       ** using cl
1aa80 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74 61  ause from the ta
1aa90 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ble on the right
1aaa0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
1aab0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1aac0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1aad0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1aae0 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
1aaf0 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
1ab00 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c  Parse, TK_ID, 0,
1ab10 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
1ab20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 3d 3d      if( pRight==
1ab30 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
1ab40 20 20 20 20 20 20 20 73 65 74 51 75 6f 74 65 64         setQuoted
1ab50 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 26 70  Token(pParse, &p
1ab60 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2c 20 7a 4e  Right->token, zN
1ab70 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
1ab80 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
1ab90 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  || pTabList->nSr
1aba0 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  c>1 ){.         
1abb0 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
1abc0 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
1abd0 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30  pParse, TK_ID, 0
1abe0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
1abf0 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
1ac00 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
1ac10 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
1ac20 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  t, pRight, 0);. 
1ac30 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1ac40 20 70 45 78 70 72 3d 3d 30 20 29 20 62 72 65 61   pExpr==0 ) brea
1ac50 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
1ac60 20 73 65 74 51 75 6f 74 65 64 54 6f 6b 65 6e 28   setQuotedToken(
1ac70 70 50 61 72 73 65 2c 20 26 70 4c 65 66 74 2d 3e  pParse, &pLeft->
1ac80 74 6f 6b 65 6e 2c 20 7a 54 61 62 4e 61 6d 65 29  token, zTabName)
1ac90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1aca0 73 65 74 54 6f 6b 65 6e 28 26 70 45 78 70 72 2d  setToken(&pExpr-
1acb0 3e 73 70 61 6e 2c 20 0a 20 20 20 20 20 20 20 20  >span, .        
1acc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1acd0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
1ace0 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20  .%s", zTabName, 
1acf0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20  zName));.       
1ad00 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70         pExpr->sp
1ad10 61 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 20 20  an.dyn = 1;.    
1ad20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1ad30 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20  >token.z = 0;.  
1ad40 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1ad50 72 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 30 3b 0a  r->token.n = 0;.
1ad60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
1ad70 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d  xpr->token.dyn =
1ad80 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
1ad90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1ada0 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69       pExpr = pRi
1adb0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
1adc0 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 20 3d     pExpr->span =
1add0 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20   pExpr->token;. 
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
1adf0 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 3d 20 30  pr->span.dyn = 0
1ae00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1ae10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ae20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20  longNames ){.   
1ae30 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
1ae40 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1ae50 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
1ae60 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26 70 45  pNew, pExpr, &pE
1ae70 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  xpr->span);.    
1ae80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
1aea0 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
1aeb0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
1aec0 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 2c 20 26  , pNew, pExpr, &
1aed0 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a  pRight->token);.
1aee0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1aef0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1af00 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1af10 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20  !tableSeen ){.  
1af20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
1af30 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  me ){.          
1af40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1af50 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
1af60 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a  ch table: %s", z
1af70 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  TName);.        
1af80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1af90 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1afa0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
1afb0 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69 65   tables specifie
1afc0 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  d");.          }
1afd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1afe0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1aff0 28 64 62 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20  (db, zTName);.  
1b000 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1b010 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1b020 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74  elete(db, pEList
1b030 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74  );.    p->pEList
1b040 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66   = pNew;.  }.#if
1b050 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
1b060 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  MN.  if( p->pELi
1b070 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d  st && p->pEList-
1b080 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69  >nExpr>db->aLimi
1b090 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
1b0a0 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
1b0b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1b0c0 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
1b0d0 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
1b0e0 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e  t set");.  }.#en
1b0f0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43  dif.  return WRC
1b100 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
1b110 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e  .** No-op routin
1b120 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d  e for the parse-
1b130 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a  tree walker..**.
1b140 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
1b150 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b  tine is the Walk
1b160 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
1b170 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e   then expression
1b180 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61   trees.** are wa
1b190 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79  lked without any
1b1a0 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74   actions being t
1b1b0 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64  aken at each nod
1b1c0 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a  e.  Presumably,.
1b1d0 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ** when this rou
1b1e0 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
1b1f0 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
1b200 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57  lback then .** W
1b210 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
1b220 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20  lback is set to 
1b230 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65  do something use
1b240 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a  ful for every .*
1b250 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68  * subquery in th
1b260 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a  e parser tree..*
1b270 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
1b280 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72  rWalkNoop(Walker
1b290 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
1b2a0 2a 70 45 78 70 72 29 7b 0a 20 20 72 65 74 75 72  *pExpr){.  retur
1b2b0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1b2c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1b2d0 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20  utine "expands" 
1b2e0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
1b2f0 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  nt and all of it
1b300 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  s subqueries..**
1b310 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   For additional 
1b320 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77  information on w
1b330 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20  hat it means to 
1b340 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43  "expand" a SELEC
1b350 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20  T.** statement, 
1b360 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
1b370 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70  on the selectExp
1b380 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62  and worker callb
1b390 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  ack above..**.**
1b3a0 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c   Expanding a SEL
1b3b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
1b3c0 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20   the first step 
1b3d0 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a  in processing a.
1b3e0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
1b3f0 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54  ent.  The SELECT
1b400 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20   statement must 
1b410 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
1b420 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c  re.** name resol
1b430 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d  ution is perform
1b440 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ed..**.** If any
1b450 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
1b460 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
1b470 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
1b480 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68  to pParse..** Th
1b490 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1b4a0 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68  on can detect th
1b4b0 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f  e problem by loo
1b4c0 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e  king at pParse->
1b4d0 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70  nErr.** and/or p
1b4e0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
1b4f0 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74  cFailed..*/.stat
1b500 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
1b510 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73  electExpand(Pars
1b520 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
1b530 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57  t *pSelect){.  W
1b540 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65  alker w;.  w.xSe
1b550 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
1b560 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20  electExpander;. 
1b570 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
1b580 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b   = exprWalkNoop;
1b590 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
1b5a0 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57  arse;.  sqlite3W
1b5b0 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
1b5c0 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  elect);.}...#ifn
1b5d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b5e0 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
1b5f0 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e  his is a Walker.
1b600 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
1b610 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
1b620 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79   sqlite3SelectTy
1b630 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65  peInfo().** inte
1b640 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rface..**.** For
1b650 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73   each FROM-claus
1b660 65 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20  e subquery, add 
1b670 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64  Column.zType and
1b680 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a   Column.zColl.**
1b690 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
1b6a0 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
1b6b0 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
1b6c0 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
1b6d0 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75  et.** of that su
1b6e0 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  bquery..**.** Th
1b6f0 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
1b700 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
1b710 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
1b720 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64   was constructed
1b730 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70  .** by selectExp
1b740 61 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20  ander() but the 
1b750 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
1b760 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  on information w
1b770 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74  as omitted.** at
1b780 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61   that point beca
1b790 75 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20  use identifiers 
1b7a0 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  had not yet been
1b7b0 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73   resolved.  This
1b7c0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
1b7d0 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e  alled after iden
1b7e0 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f  tifier resolutio
1b7f0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1b800 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
1b810 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65  ryTypeInfo(Walke
1b820 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
1b830 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
1b840 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69  *pParse;.  int i
1b850 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
1b860 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
1b870 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
1b880 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rom;..  assert( 
1b890 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
1b8a0 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69  _Resolved );.  i
1b8b0 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
1b8c0 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
1b8d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73  )==0 ){.    p->s
1b8e0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61  elFlags |= SF_Ha
1b8f0 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70  sTypeInfo;.    p
1b900 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
1b910 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 70 54 61  >pParse;.    pTa
1b920 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
1b930 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  .    for(i=0, pF
1b940 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
1b950 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1b960 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
1b970 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
1b980 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
1b990 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  b;.      if( pTa
1b9a0 62 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46  b && (pTab->tabF
1b9b0 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
1b9c0 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ral)!=0 ){.     
1b9d0 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
1b9e0 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
1b9f0 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
1ba00 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c 65   */.        Sele
1ba10 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
1ba20 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
1ba30 20 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 20     assert( pSel 
1ba40 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
1ba50 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
1ba60 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50   pSel = pSel->pP
1ba70 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 73 65  rior;.        se
1ba80 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70  lectAddColumnTyp
1ba90 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50  eAndCollation(pP
1baa0 61 72 73 65 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c  arse, pTab->nCol
1bab0 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20 70 53  , pTab->aCol, pS
1bac0 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  el);.      }.   
1bad0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1bae0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
1baf0 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
1bb00 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73  his routine adds
1bb10 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f   datatype and co
1bb20 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1bb30 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a   information to.
1bb40 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  ** the Table str
1bb50 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46  uctures of all F
1bb60 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
1bb70 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45  eries in a.** SE
1bb80 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
1bb90 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72  **.** Use this r
1bba0 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d  outine after nam
1bbb0 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  e resolution..*/
1bbc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
1bbd0 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
1bbe0 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  eInfo(Parse *pPa
1bbf0 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
1bc00 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  lect){.#ifndef S
1bc10 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
1bc20 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  ERY.  Walker w;.
1bc30 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
1bc40 61 63 6b 20 3d 20 73 65 6c 65 63 74 41 64 64 53  ack = selectAddS
1bc50 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b  ubqueryTypeInfo;
1bc60 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
1bc70 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f  ck = exprWalkNoo
1bc80 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  p;.  w.pParse = 
1bc90 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
1bca0 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
1bcb0 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66  pSelect);.#endif
1bcc0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1bcd0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 6f 66 20  routine sets of 
1bce0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
1bcf0 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  nt for processin
1bd00 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  g.  The.** follo
1bd10 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69  wing is accompli
1bd20 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  shed:.**.**     
1bd30 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e  *  VDBE Cursor n
1bd40 75 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67  umbers are assig
1bd50 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d  ned to all FROM-
1bd60 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a  clause terms..**
1bd70 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61       *  Ephemera
1bd80 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20  l Table objects 
1bd90 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
1bda0 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
1bdb0 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20  subqueries..**  
1bdc0 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49     *  ON and USI
1bdd0 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73  NG clauses are s
1bde0 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52  hifted into WHER
1bdf0 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  E statements.** 
1be00 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73      *  Wildcards
1be10 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e   "*" and "TABLE.
1be20 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74  *" in result set
1be30 73 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a  s are expanded..
1be40 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69  **     *  Identi
1be50 66 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73  fiers in express
1be60 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20  ion are matched 
1be70 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  to tables..**.**
1be80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
1be90 74 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f  ts recursively o
1bea0 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73  n all subqueries
1beb0 20 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45   within the SELE
1bec0 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
1bed0 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20  te3SelectPrep(. 
1bee0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1bef0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1bf00 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
1bf10 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
1bf20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1bf30 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1bf40 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
1bf50 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
1bf60 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61  *pOuterNC  /* Na
1bf70 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63  me context for c
1bf80 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20  ontainer */.){. 
1bf90 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1bfa0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1bfb0 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  n;.  db = pParse
1bfc0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 73  ->db;.  if( p->s
1bfd0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73  elFlags & SF_Has
1bfe0 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72  TypeInfo ) retur
1bff0 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
1c000 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
1c010 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
1c020 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  rn;.  sqlite3Sel
1c030 65 63 74 45 78 70 61 6e 64 28 70 50 61 72 73 65  ectExpand(pParse
1c040 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , p);.  if( pPar
1c050 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
1c060 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
1c070 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
1c080 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d  ResolveSelectNam
1c090 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  es(pParse, p, pO
1c0a0 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70  uterNC);.  if( p
1c0b0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
1c0c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1c0d0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
1c0e0 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
1c0f0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b  Info(pParse, p);
1c100 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20  .}../*.** Reset 
1c110 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
1c120 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  cumulator..**.**
1c130 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61   The aggregate a
1c140 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20  ccumulator is a 
1c150 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  set of memory ce
1c160 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a  lls that hold.**
1c170 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
1c180 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63  sults while calc
1c190 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65  ulating an aggre
1c1a0 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72  gate.  This.** r
1c1b0 6f 75 74 69 6e 65 20 73 69 6d 70 6c 79 20 73 74  outine simply st
1c1c0 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c  ores NULLs in al
1c1d0 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72  l of those memor
1c1e0 79 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  y cells..*/.stat
1c1f0 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63  ic void resetAcc
1c200 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
1c210 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
1c220 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
1c230 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1c240 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
1c250 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
1c260 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20  _func *pFunc;.  
1c270 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  if( pAggInfo->nF
1c280 75 6e 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43  unc+pAggInfo->nC
1c290 6f 6c 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  olumn==0 ){.    
1c2a0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f  return;.  }.  fo
1c2b0 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66  r(i=0; i<pAggInf
1c2c0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  o->nColumn; i++)
1c2d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1c2e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1c2f0 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d  ll, 0, pAggInfo-
1c300 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b 0a  >aCol[i].iMem);.
1c310 20 20 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d    }.  for(pFunc=
1c320 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  pAggInfo->aFunc,
1c330 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f   i=0; i<pAggInfo
1c340 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
1c350 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  unc++){.    sqli
1c360 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c370 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46 75   OP_Null, 0, pFu
1c380 6e 63 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 69  nc->iMem);.    i
1c390 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  f( pFunc->iDisti
1c3a0 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
1c3b0 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63  Expr *pE = pFunc
1c3c0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->pExpr;.      i
1c3d0 66 28 20 70 45 2d 3e 70 4c 69 73 74 3d 3d 30 20  f( pE->pList==0 
1c3e0 7c 7c 20 70 45 2d 3e 70 4c 69 73 74 2d 3e 6e 45  || pE->pList->nE
1c3f0 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
1c400 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1c410 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  g(pParse, "DISTI
1c420 4e 43 54 20 69 6e 20 61 67 67 72 65 67 61 74 65  NCT in aggregate
1c430 20 6d 75 73 74 20 62 65 20 66 6f 6c 6c 6f 77 65   must be followe
1c440 64 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  d ".           "
1c450 62 79 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  by an expression
1c460 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
1c470 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
1c480 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1c490 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
1c4a0 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49  *pKeyInfo = keyI
1c4b0 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
1c4c0 70 50 61 72 73 65 2c 20 70 45 2d 3e 70 4c 69 73  pParse, pE->pLis
1c4d0 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
1c4e0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1c4f0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1c500 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  l, pFunc->iDisti
1c510 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
1c520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c530 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
1c540 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
1c550 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20  _HANDOFF);.     
1c560 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
1c570 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
1c580 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20   OP_AggFinalize 
1c590 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79  opcode for every
1c5a0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1c5b0 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67  ion.** in the Ag
1c5c0 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  gInfo structure.
1c5d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c5e0 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
1c5f0 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72  ions(Parse *pPar
1c600 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
1c610 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
1c620 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1c630 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
1c640 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
1c650 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30  c *pF;.  for(i=0
1c660 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
1c670 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
1c680 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
1c690 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  ++){.    ExprLis
1c6a0 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
1c6b0 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
1c6c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c6d0 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p4(v, OP_AggFina
1c6e0 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
1c6f0 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
1c700 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  r : 0, 0,.      
1c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c720 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
1c730 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
1c740 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
1c750 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
1c760 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
1c770 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
1c780 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
1c790 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
1c7a0 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
1c7b0 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
1c7c0 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
1c7d0 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
1c7e0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
1c7f0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1c800 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
1c810 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
1c820 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73  fo_func *pF;.  s
1c830 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
1c840 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e  l *pC;..  pAggIn
1c850 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
1c860 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   1;.  for(i=0, p
1c870 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
1c880 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
1c890 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
1c8a0 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  {.    int nArg;.
1c8b0 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74      int addrNext
1c8c0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
1c8d0 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69  gAgg;.    ExprLi
1c8e0 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
1c8f0 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
1c900 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
1c910 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73       nArg = pLis
1c920 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
1c930 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33  regAgg = sqlite3
1c940 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
1c950 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20  rse, nArg);.    
1c960 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1c970 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
1c980 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c  , pList, regAgg,
1c990 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1c9a0 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a        nArg = 0;.
1c9b0 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 30        regAgg = 0
1c9c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1c9d0 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  pF->iDistinct>=0
1c9e0 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65   ){.      addrNe
1c9f0 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  xt = sqlite3Vdbe
1ca00 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1ca10 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67      assert( nArg
1ca20 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63 6f 64  ==1 );.      cod
1ca30 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65  eDistinct(pParse
1ca40 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c  , pF->iDistinct,
1ca50 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65   addrNext, 1, re
1ca60 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gAgg);.    }.   
1ca70 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e   if( pF->pFunc->
1ca80 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  flags & SQLITE_F
1ca90 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
1caa0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
1cab0 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Coll = 0;.      
1cac0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
1cad0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
1cae0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
1caf0 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
1cb00 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30   );  /* pList!=0
1cb10 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61   if pF->pFunc ha
1cb20 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20  s NEEDCOLL */.  
1cb30 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
1cb40 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43  em=pList->a; !pC
1cb50 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a  oll && j<nArg; j
1cb60 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1cb70 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1cb80 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1cb90 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
1cba0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
1cbb0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
1cbc0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
1cbd0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
1cbe0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
1cbf0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1cc00 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1cc10 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20  _CollSeq, 0, 0, 
1cc20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c  0, (char *)pColl
1cc30 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P4_COLLSEQ);. 
1cc40 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1cc50 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1cc60 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67  _AggStep, 0, reg
1cc70 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20  Agg, pF->iMem,. 
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc90 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e       (void*)pF->
1cca0 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
1ccb0 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  F);.    sqlite3V
1ccc0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 6e  dbeChangeP5(v, n
1ccd0 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
1cce0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
1ccf0 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
1cd00 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  , nArg);.    sql
1cd10 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
1cd20 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
1cd30 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
1cd40 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e  );.    if( addrN
1cd50 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ext ){.      sql
1cd60 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1cd70 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74  abel(v, addrNext
1cd80 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
1cd90 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49  or(i=0, pC=pAggI
1cda0 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67  nfo->aCol; i<pAg
1cdb0 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
1cdc0 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b  tor; i++, pC++){
1cdd0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1cde0 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d  Code(pParse, pC-
1cdf0 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d  >pExpr, pC->iMem
1ce00 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66  );.  }.  pAggInf
1ce10 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
1ce20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
1ce30 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
1ce40 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1ce50 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  nt given in the 
1ce60 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a  p argument.  .**
1ce70 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20  .** The results 
1ce80 61 72 65 20 64 69 73 74 72 69 62 75 74 65 64 20  are distributed 
1ce90 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73 20  in various ways 
1cea0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
1ceb0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
1cec0 74 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73  the SelectDest s
1ced0 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
1cee0 20 74 6f 20 62 79 20 61 72 67 75 6d 65 6e 74 20   to by argument 
1cef0 70 44 65 73 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c  pDest.** as foll
1cf00 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70  ows:.**.**     p
1cf10 44 65 73 74 2d 3e 65 44 65 73 74 20 20 20 20 52  Dest->eDest    R
1cf20 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d 2d  esult.**     ---
1cf30 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d  ---------    ---
1cf40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cf50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cf60 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
1cf70 53 52 54 5f 4f 75 74 70 75 74 20 20 20 20 20 20  SRT_Output      
1cf80 47 65 6e 65 72 61 74 65 20 61 20 72 6f 77 20 6f  Generate a row o
1cf90 66 20 6f 75 74 70 75 74 20 28 75 73 69 6e 67 20  f output (using 
1cfa0 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  the OP_ResultRow
1cfb0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1cfc0 20 20 20 20 20 20 20 20 6f 70 63 6f 64 65 29 20          opcode) 
1cfd0 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e 20  for each row in 
1cfe0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
1cff0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d 65  **.**     SRT_Me
1d000 6d 20 20 20 20 20 20 20 20 20 4f 6e 6c 79 20 76  m         Only v
1d010 61 6c 69 64 20 69 66 20 74 68 65 20 72 65 73 75  alid if the resu
1d020 6c 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 63  lt is a single c
1d030 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 20 20  olumn..**       
1d040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 74                St
1d050 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 6f  ore the first co
1d060 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 69 72 73  lumn of the firs
1d070 74 20 72 65 73 75 6c 74 20 72 6f 77 0a 2a 2a 20  t result row.** 
1d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d090 20 20 20 20 69 6e 20 72 65 67 69 73 74 65 72 20      in register 
1d0a0 70 44 65 73 74 2d 3e 69 50 61 72 6d 20 74 68 65  pDest->iParm the
1d0b0 6e 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 65  n abandon the re
1d0c0 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  st.**           
1d0d0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
1d0e0 20 71 75 65 72 79 2e 20 20 54 68 69 73 20 64 65   query.  This de
1d0f0 73 74 69 6e 61 74 69 6f 6e 20 69 6d 70 6c 69 65  stination implie
1d100 73 20 22 4c 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a  s "LIMIT 1"..**.
1d110 2a 2a 20 20 20 20 20 53 52 54 5f 53 65 74 20 20  **     SRT_Set  
1d120 20 20 20 20 20 20 20 54 68 65 20 72 65 73 75 6c         The resul
1d130 74 20 6d 75 73 74 20 62 65 20 61 20 73 69 6e 67  t must be a sing
1d140 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72  le column.  Stor
1d150 65 20 65 61 63 68 0a 2a 2a 20 20 20 20 20 20 20  e each.**       
1d160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f                ro
1d170 77 20 6f 66 20 72 65 73 75 6c 74 20 61 73 20 74  w of result as t
1d180 68 65 20 6b 65 79 20 69 6e 20 74 61 62 6c 65 20  he key in table 
1d190 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 20 0a 2a  pDest->iParm. .*
1d1a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1d1b0 20 20 20 20 20 20 41 70 70 6c 79 20 74 68 65 20        Apply the 
1d1c0 61 66 66 69 6e 69 74 79 20 70 44 65 73 74 2d 3e  affinity pDest->
1d1d0 61 66 66 69 6e 69 74 79 20 62 65 66 6f 72 65 20  affinity before 
1d1e0 73 74 6f 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20  storing.**      
1d1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1d200 65 73 75 6c 74 73 2e 20 20 55 73 65 64 20 74 6f  esults.  Used to
1d210 20 69 6d 70 6c 65 6d 65 6e 74 20 22 49 4e 20 28   implement "IN (
1d220 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a  SELECT ...)"..**
1d230 0a 2a 2a 20 20 20 20 20 53 52 54 5f 55 6e 69 6f  .**     SRT_Unio
1d240 6e 20 20 20 20 20 20 20 53 74 6f 72 65 20 72 65  n       Store re
1d250 73 75 6c 74 73 20 61 73 20 61 20 6b 65 79 20 69  sults as a key i
1d260 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  n a temporary ta
1d270 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ble pDest->iParm
1d280 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1d290 45 78 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f  Except      Remo
1d2a0 76 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  ve results from 
1d2b0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
1d2c0 62 6c 65 20 70 44 65 73 74 2d 3e 69 50 61 72 6d  ble pDest->iParm
1d2d0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
1d2e0 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72  Table       Stor
1d2f0 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d  e results in tem
1d300 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65  porary table pDe
1d310 73 74 2d 3e 69 50 61 72 6d 2e 0a 2a 2a 20 20 20  st->iParm..**   
1d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d330 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53    This is like S
1d340 52 54 5f 45 70 68 65 6d 54 61 62 20 65 78 63 65  RT_EphemTab exce
1d350 70 74 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  pt that the tabl
1d360 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
1d370 20 20 20 20 20 20 20 20 20 69 73 20 61 73 73 75           is assu
1d380 6d 65 64 20 74 6f 20 61 6c 72 65 61 64 79 20 62  med to already b
1d390 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  e open..**.**   
1d3a0 20 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 20    SRT_EphemTab  
1d3b0 20 20 43 72 65 61 74 65 20 61 6e 20 74 65 6d 70    Create an temp
1d3c0 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73  orary table pDes
1d3d0 74 2d 3e 69 50 61 72 6d 20 61 6e 64 20 73 74 6f  t->iParm and sto
1d3e0 72 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  re.**           
1d3f0 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 65            the re
1d400 73 75 6c 74 20 74 68 65 72 65 2e 20 54 68 65 20  sult there. The 
1d410 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 6f  cursor is left o
1d420 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20 20 20 20  pen after.**    
1d430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d440 20 72 65 74 75 72 6e 69 6e 67 2e 20 20 54 68 69   returning.  Thi
1d450 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f 54 61  s is like SRT_Ta
1d460 62 6c 65 20 65 78 63 65 70 74 20 74 68 61 74 0a  ble except that.
1d470 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1d480 20 20 20 20 20 20 20 74 68 69 73 20 64 65 73 74         this dest
1d490 69 6e 61 74 69 6f 6e 20 75 73 65 73 20 4f 50 5f  ination uses OP_
1d4a0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 6f  OpenEphemeral to
1d4b0 20 63 72 65 61 74 65 0a 2a 2a 20 20 20 20 20 20   create.**      
1d4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1d4d0 68 65 20 74 61 62 6c 65 20 66 69 72 73 74 2e 0a  he table first..
1d4e0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 43 6f  **.**     SRT_Co
1d4f0 72 6f 75 74 69 6e 65 20 20 20 47 65 6e 65 72 61  routine   Genera
1d500 74 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  te a co-routine 
1d510 74 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 6e  that returns a n
1d520 65 77 20 72 6f 77 20 6f 66 0a 2a 2a 20 20 20 20  ew row of.**    
1d530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d540 20 72 65 73 75 6c 74 73 20 65 61 63 68 20 74 69   results each ti
1d550 6d 65 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64  me it is invoked
1d560 2e 20 20 54 68 65 20 65 6e 74 72 79 20 70 6f 69  .  The entry poi
1d570 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nt.**           
1d580 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
1d590 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 73 20 73   co-routine is s
1d5a0 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65  tored in registe
1d5b0 72 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2e 0a  r pDest->iParm..
1d5c0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
1d5d0 69 73 74 73 20 20 20 20 20 20 53 74 6f 72 65 20  ists      Store 
1d5e0 61 20 31 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65  a 1 in memory ce
1d5f0 6c 6c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 20  ll pDest->iParm 
1d600 69 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  if the result.**
1d610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d620 20 20 20 20 20 73 65 74 20 69 73 20 6e 6f 74 20       set is not 
1d630 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  empty..**.**    
1d640 20 53 52 54 5f 44 69 73 63 61 72 64 20 20 20 20   SRT_Discard    
1d650 20 54 68 72 6f 77 20 74 68 65 20 72 65 73 75 6c   Throw the resul
1d660 74 73 20 61 77 61 79 2e 20 20 54 68 69 73 20 69  ts away.  This i
1d670 73 20 75 73 65 64 20 62 79 20 53 45 4c 45 43 54  s used by SELECT
1d680 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1d690 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
1d6a0 74 73 20 77 69 74 68 69 6e 20 74 72 69 67 67 65  ts within trigge
1d6b0 72 73 20 77 68 6f 73 65 20 6f 6e 6c 79 20 70 75  rs whose only pu
1d6c0 72 70 6f 73 65 20 69 73 0a 2a 2a 20 20 20 20 20  rpose is.**     
1d6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6e0 74 68 65 20 73 69 64 65 2d 65 66 66 65 63 74 73  the side-effects
1d6f0 20 6f 66 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a   of functions..*
1d700 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1d710 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
1d720 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
1d730 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
1d740 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
1d750 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
1d760 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
1d770 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
1d780 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
1d790 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
1d7a0 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
1d7b0 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
1d7c0 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
1d7d0 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
1d7e0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
1d7f0 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
1d800 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
1d810 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
1d820 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
1d830 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
1d840 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
1d850 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1d860 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
1d870 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
1d880 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  oded. */.  Selec
1d890 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
1d8a0 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
1d8b0 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72  with the query r
1d8c0 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
1d8d0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
1d8e0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1d8f0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
1d900 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
1d910 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f     /* Return fro
1d920 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  m sqlite3WhereBe
1d930 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20  gin() */.  Vdbe 
1d940 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
1d950 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
1d960 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63   machine under c
1d970 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
1d980 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20   int isAgg;     
1d990 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1d9a0 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
1d9b0 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
1d9c0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1d9d0 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20  pEList;      /* 
1d9e0 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
1d9f0 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
1da00 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
1da10 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
1da20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
1da30 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
1da40 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
1da50 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
1da60 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
1da70 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
1da80 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
1da90 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
1daa0 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
1dab0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
1dac0 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
1dad0 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50      /* The GROUP
1dae0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79   BY clause.  May
1daf0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
1db00 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20  pr *pHaving;    
1db10 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49       /* The HAVI
1db20 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  NG clause.  May 
1db30 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
1db40 20 69 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20   isDistinct;    
1db50 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1db60 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
1db70 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
1db80 2f 0a 20 20 69 6e 74 20 64 69 73 74 69 6e 63 74  /.  int distinct
1db90 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ;          /* Ta
1dba0 62 6c 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74  ble to use for t
1dbb0 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74 20  he distinct set 
1dbc0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
1dbd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1dbe0 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
1dbf0 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
1dc00 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  n */.  int addrS
1dc10 6f 72 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a  ortIndex;     /*
1dc20 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f   Address of an O
1dc30 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
1dc40 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  instruction */. 
1dc50 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66   AggInfo sAggInf
1dc60 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72  o;      /* Infor
1dc70 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61  mation used by a
1dc80 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
1dc90 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20   */.  int iEnd; 
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dcb0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65  Address of the e
1dcc0 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  nd of the query 
1dcd0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1dce0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
1dcf0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1dd00 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20  ection */..  db 
1dd10 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1dd20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  if( p==0 || db->
1dd30 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
1dd40 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
1dd50 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1dd60 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  }.  if( sqlite3A
1dd70 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1dd80 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
1dd90 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
1dda0 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n 1;.  memset(&s
1ddb0 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  AggInfo, 0, size
1ddc0 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a  of(sAggInfo));..
1ddd0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
1dde0 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  pOrderBy;.  if( 
1ddf0 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
1de00 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 70  (pDest) ){.    p
1de10 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
1de20 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 73 65  .    /* In these
1de30 20 63 61 73 65 73 20 74 68 65 20 44 49 53 54 49   cases the DISTI
1de40 4e 43 54 20 6f 70 65 72 61 74 6f 72 20 6d 61 6b  NCT operator mak
1de50 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  es no difference
1de60 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   to the.    ** r
1de70 65 73 75 6c 74 73 2c 20 73 6f 20 72 65 6d 6f 76  esults, so remov
1de80 65 20 69 74 20 69 66 20 69 74 20 77 65 72 65 20  e it if it were 
1de90 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
1dea0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 70 44 65  /.    assert(pDe
1deb0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
1dec0 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e  xists || pDest->
1ded0 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e  eDest==SRT_Union
1dee0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
1def0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
1df00 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73  T_Except || pDes
1df10 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
1df20 73 63 61 72 64 29 3b 0a 20 20 20 20 70 2d 3e 73  scard);.    p->s
1df30 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44  elFlags &= ~SF_D
1df40 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73  istinct;.  }.  s
1df50 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
1df60 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a  (pParse, p, 0);.
1df70 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1df80 72 72 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  rr ){.    goto s
1df90 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
1dfa0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
1dfb0 4f 72 64 65 72 42 79 3b 0a 0a 0a 20 20 2f 2a 20  OrderBy;...  /* 
1dfc0 4d 61 6b 65 20 6c 6f 63 61 6c 20 63 6f 70 69 65  Make local copie
1dfd0 73 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74  s of the paramet
1dfe0 65 72 73 20 66 6f 72 20 74 68 69 73 20 71 75 65  ers for this que
1dff0 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 54 61 62 4c  ry..  */.  pTabL
1e000 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
1e010 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c   isAgg = (p->sel
1e020 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
1e030 67 61 74 65 29 21 3d 30 3b 0a 20 20 70 45 4c 69  gate)!=0;.  pELi
1e040 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
1e050 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
1e060 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
1e070 64 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 44  d;..  /* .  ** D
1e080 6f 20 6e 6f 74 20 65 76 65 6e 20 61 74 74 65 6d  o not even attem
1e090 70 74 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  pt to generate a
1e0a0 6e 79 20 63 6f 64 65 20 69 66 20 77 65 20 68 61  ny code if we ha
1e0b0 76 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 0a  ve already seen.
1e0c0 20 20 2a 2a 20 65 72 72 6f 72 73 20 62 65 66 6f    ** errors befo
1e0d0 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
1e0e0 73 74 61 72 74 73 2e 0a 20 20 2a 2f 0a 20 20 69  starts..  */.  i
1e0f0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e  f( pParse->nErr>
1e100 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
1e110 65 6e 64 3b 0a 0a 20 20 2f 2a 20 4f 52 44 45 52  end;..  /* ORDER
1e120 20 42 59 20 69 73 20 69 67 6e 6f 72 65 64 20 66   BY is ignored f
1e130 6f 72 20 73 6f 6d 65 20 64 65 73 74 69 6e 61 74  or some destinat
1e140 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
1e150 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62   IgnorableOrderb
1e160 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
1e170 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1e180 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65  }..  /* Begin ge
1e190 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20  nerating code.. 
1e1a0 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   */.  v = sqlite
1e1b0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1e1c0 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67  ;.  if( v==0 ) g
1e1d0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
1e1e0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1e1f0 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d  ode for all sub-
1e200 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46  queries in the F
1e210 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  ROM clause.  */.
1e220 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1e230 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1e240 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1e250 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1e260 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e  .  for(i=0; !p->
1e270 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62  pPrior && i<pTab
1e280 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
1e290 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
1e2a0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1e2b0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
1e2c0 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65  i];.    SelectDe
1e2d0 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c  st dest;.    Sel
1e2e0 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65  ect *pSub = pIte
1e2f0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
1e300 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20  int isAggSub;.. 
1e310 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c     if( pSub==0 |
1e320 7c 20 70 49 74 65 6d 2d 3e 69 73 50 6f 70 75 6c  | pItem->isPopul
1e330 61 74 65 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ated ) continue;
1e340 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  ..    /* Increme
1e350 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74  nt Parse.nHeight
1e360 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f   by the height o
1e370 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78  f the largest ex
1e380 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
1e390 74 72 65 65 20 72 65 66 65 72 65 64 20 74 6f 20  tree refered to 
1e3a0 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72  by this, the par
1e3b0 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20  ent select. The 
1e3c0 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20  child select.   
1e3d0 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   ** may contain 
1e3e0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
1e3f0 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20   of at most.    
1e400 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ** (SQLITE_MAX_E
1e410 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e  XPR_DEPTH-Parse.
1e420 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e  nHeight) height.
1e430 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20   This is a bit. 
1e440 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65     ** more conse
1e450 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rvative than nec
1e460 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68  essary, but much
1e470 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66   easier than enf
1e480 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  orcing.    ** an
1e490 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20   exact limit..  
1e4a0 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
1e4b0 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69  >nHeight += sqli
1e4c0 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
1e4d0 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  ght(p);..    /* 
1e4e0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1e4f0 74 68 65 20 73 75 62 71 75 65 72 79 20 63 61 6e  the subquery can
1e500 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74   be absorbed int
1e510 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f  o the parent. */
1e520 0a 20 20 20 20 69 73 41 67 67 53 75 62 20 3d 20  .    isAggSub = 
1e530 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20  (pSub->selFlags 
1e540 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
1e550 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74  =0;.    if( flat
1e560 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72  tenSubquery(pPar
1e570 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c  se, p, i, isAgg,
1e580 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20   isAggSub) ){.  
1e590 20 20 20 20 69 66 28 20 69 73 41 67 67 53 75 62      if( isAggSub
1e5a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67   ){.        isAg
1e5b0 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  g = 1;.        p
1e5c0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
1e5d0 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20  _Aggregate;.    
1e5e0 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31    }.      i = -1
1e5f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e600 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
1e610 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
1e620 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49  SRT_EphemTab, pI
1e630 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
1e640 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
1e650 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64 3d  em->isPopulated=
1e660 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1e670 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
1e680 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a  , pSub, &dest);.
1e690 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 50        pItem->isP
1e6a0 6f 70 75 6c 61 74 65 64 20 3d 20 31 3b 0a 20 20  opulated = 1;.  
1e6b0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72    }.    if( pPar
1e6c0 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
1e6d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1e6e0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
1e6f0 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
1e700 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
1e710 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   -= sqlite3Selec
1e720 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
1e730 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
1e740 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20  ->pSrc;.    if( 
1e750 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62  !IgnorableOrderb
1e760 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
1e770 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
1e780 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a  pOrderBy;.    }.
1e790 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70    }.  pEList = p
1e7a0 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66  ->pEList;.#endif
1e7b0 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
1e7c0 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42  Where;.  pGroupB
1e7d0 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
1e7e0 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
1e7f0 70 48 61 76 69 6e 67 3b 0a 20 20 69 73 44 69 73  pHaving;.  isDis
1e800 74 69 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46  tinct = (p->selF
1e810 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1e820 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66  ct)!=0;..#ifndef
1e830 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
1e840 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f  POUND_SELECT.  /
1e850 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72  * If there is ar
1e860 65 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  e a sequence of 
1e870 71 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20  queries, do the 
1e880 65 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72  earlier ones fir
1e890 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
1e8a0 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
1e8b0 69 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73  if( p->pRightmos
1e8c0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65  t==0 ){.      Se
1e8d0 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52  lect *pLoop, *pR
1e8e0 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ight = 0;.      
1e8f0 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
1e900 20 20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b     int mxSelect;
1e910 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  .      for(pLoop
1e920 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =p; pLoop; pLoop
1e930 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20  =pLoop->pPrior, 
1e940 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  cnt++){.        
1e950 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73  pLoop->pRightmos
1e960 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70  t = p;.        p
1e970 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52  Loop->pNext = pR
1e980 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52  ight;.        pR
1e990 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20  ight = pLoop;.  
1e9a0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65      }.      mxSe
1e9b0 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69  lect = db->aLimi
1e9c0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
1e9d0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b  OMPOUND_SELECT];
1e9e0 0a 20 20 20 20 20 20 69 66 28 20 6d 78 53 65 6c  .      if( mxSel
1e9f0 65 63 74 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c  ect && cnt>mxSel
1ea00 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
1ea10 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1ea20 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
1ea30 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75   terms in compou
1ea40 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20  nd SELECT");.   
1ea50 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1ea60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1ea70 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
1ea80 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ect(pParse, p, p
1ea90 44 65 73 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Dest);.  }.#endi
1eaa0 66 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69  f..  /* If writi
1eab0 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20  ng to memory or 
1eac0 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74  generating a set
1ead0 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  .  ** only a sin
1eae0 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62  gle column may b
1eaf0 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23  e output..  */.#
1eb00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1eb10 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
1eb20 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  ( checkForMultiC
1eb30 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
1eb40 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20  (pParse, pDest, 
1eb50 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
1eb60 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
1eb70 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69  t_end;.  }.#endi
1eb80 66 0a 0a 20 20 2f 2a 20 49 66 20 70 6f 73 73 69  f..  /* If possi
1eb90 62 6c 65 2c 20 72 65 77 72 69 74 65 20 74 68 65  ble, rewrite the
1eba0 20 71 75 65 72 79 20 74 6f 20 75 73 65 20 47 52   query to use GR
1ebb0 4f 55 50 20 42 59 20 69 6e 73 74 65 61 64 20 6f  OUP BY instead o
1ebc0 66 20 44 49 53 54 49 4e 43 54 2e 0a 20 20 2a 2a  f DISTINCT..  **
1ebd0 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20   GROUP BY might 
1ebe0 75 73 65 20 61 6e 20 69 6e 64 65 78 2c 20 44 49  use an index, DI
1ebf0 53 54 49 4e 43 54 20 6e 65 76 65 72 20 64 6f 65  STINCT never doe
1ec00 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  s..  */.  if( (p
1ec10 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1ec20 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
1ec30 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
1ec40 74 69 6e 63 74 20 26 26 20 21 70 2d 3e 70 47 72  tinct && !p->pGr
1ec50 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 70 2d 3e  oupBy ){.    p->
1ec60 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74  pGroupBy = sqlit
1ec70 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
1ec80 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
1ec90 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
1eca0 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 2d  pGroupBy;.    p-
1ecb0 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
1ecc0 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 69  _Distinct;.    i
1ecd0 73 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20  sDistinct = 0;. 
1ece0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
1ecf0 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
1ed00 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68   clause, then th
1ed10 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20  is sorting.  ** 
1ed20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20  index might end 
1ed30 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20  up being unused 
1ed40 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20  if the data can 
1ed50 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74  be .  ** extract
1ed60 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64  ed in pre-sorted
1ed70 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61 74   order.  If that
1ed80 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
1ed90 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f  en the.  ** OP_O
1eda0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
1edb0 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  truction will be
1edc0 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f   changed to an O
1edd0 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a  P_Noop once.  **
1ede0 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74   we figure out t
1edf0 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20  hat the sorting 
1ee00 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65  index is not nee
1ee10 64 65 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f  ded.  The addrSo
1ee20 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72  rtIndex.  ** var
1ee30 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
1ee40 20 66 61 63 69 6c 69 74 61 74 65 20 74 68 61 74   facilitate that
1ee50 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20   change..  */.  
1ee60 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
1ee70 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
1ee80 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49  yInfo;.    pKeyI
1ee90 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
1eea0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
1eeb0 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
1eec0 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
1eed0 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
1eee0 61 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64  ab++;.    p->add
1eef0 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61  rOpenEphm[2] = a
1ef00 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20  ddrSortIndex =. 
1ef10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ef20 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
1ef30 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
1ef40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef50 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
1ef60 3e 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65  >iECursor, pOrde
1ef70 72 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c  rBy->nExpr+2, 0,
1ef80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ef90 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
1efa0 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
1efb0 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
1efc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1efd0 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d  ddrSortIndex = -
1efe0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1eff0 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65  the output is de
1f000 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d  stined for a tem
1f010 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70  porary table, op
1f020 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20  en that table.. 
1f030 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d   */.  if( pDest-
1f040 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  >eDest==SRT_Ephe
1f050 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  mTab ){.    sqli
1f060 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1f070 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
1f080 6c 2c 20 70 44 65 73 74 2d 3e 69 50 61 72 6d 2c  l, pDest->iParm,
1f090 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
1f0a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
1f0b0 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f  he limiter..  */
1f0c0 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65  .  iEnd = sqlite
1f0d0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1f0e0 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  );.  computeLimi
1f0f0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
1f100 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 0a 20 20  e, p, iEnd);..  
1f110 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61  /* Open a virtua
1f120 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  l index to use f
1f130 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  or the distinct 
1f140 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  set..  */.  if( 
1f150 69 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  isDistinct ){.  
1f160 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1f170 6e 66 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nfo;.    assert(
1f180 20 69 73 41 67 67 20 7c 7c 20 70 47 72 6f 75 70   isAgg || pGroup
1f190 42 79 20 29 3b 0a 20 20 20 20 64 69 73 74 69 6e  By );.    distin
1f1a0 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ct = pParse->nTa
1f1b0 62 2b 2b 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  b++;.    pKeyInf
1f1c0 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
1f1d0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
1f1e0 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  p->pEList);.    
1f1f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f200 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
1f210 6d 65 72 61 6c 2c 20 64 69 73 74 69 6e 63 74 2c  meral, distinct,
1f220 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
1f230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1f240 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
1f250 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
1f260 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  FF);.  }else{.  
1f270 20 20 64 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b    distinct = -1;
1f280 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 67 67 72 65  .  }..  /* Aggre
1f290 67 61 74 65 20 61 6e 64 20 6e 6f 6e 2d 61 67 67  gate and non-agg
1f2a0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 61  regate queries a
1f2b0 72 65 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65  re handled diffe
1f2c0 72 65 6e 74 6c 79 20 2a 2f 0a 20 20 69 66 28 20  rently */.  if( 
1f2d0 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70  !isAgg && pGroup
1f2e0 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  By==0 ){.    /* 
1f2f0 54 68 69 73 20 63 61 73 65 20 69 73 20 66 6f 72  This case is for
1f300 20 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71   non-aggregate q
1f310 75 65 72 69 65 73 0a 20 20 20 20 2a 2a 20 42 65  ueries.    ** Be
1f320 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
1f330 20 73 63 61 6e 0a 20 20 20 20 2a 2f 0a 20 20 20   scan.    */.   
1f340 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
1f350 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
1f360 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
1f370 68 65 72 65 2c 20 26 70 4f 72 64 65 72 42 79 2c  here, &pOrderBy,
1f380 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49   0);.    if( pWI
1f390 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
1f3a0 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f  lect_end;..    /
1f3b0 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64  * If sorting ind
1f3c0 65 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61  ex that was crea
1f3d0 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f  ted by a prior O
1f3e0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
1f3f0 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  .    ** instruct
1f400 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74  ion ended up not
1f410 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74   being needed, t
1f420 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f  hen change the O
1f430 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a  P_OpenEphemeral.
1f440 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f      ** into an O
1f450 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  P_Noop..    */. 
1f460 20 20 20 69 66 28 20 61 64 64 72 53 6f 72 74 49     if( addrSortI
1f470 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f 72 64 65  ndex>=0 && pOrde
1f480 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
1f490 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1f4a0 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53  eToNoop(v, addrS
1f4b0 6f 72 74 49 6e 64 65 78 2c 20 31 29 3b 0a 20 20  ortIndex, 1);.  
1f4c0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
1f4d0 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[2] = -1;.   
1f4e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74   }..    /* Use t
1f4f0 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65  he standard inne
1f500 72 20 6c 6f 6f 70 0a 20 20 20 20 2a 2f 0a 20 20  r loop.    */.  
1f510 20 20 61 73 73 65 72 74 28 21 69 73 44 69 73 74    assert(!isDist
1f520 69 6e 63 74 29 3b 0a 20 20 20 20 73 65 6c 65 63  inct);.    selec
1f530 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
1f540 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c  e, p, pEList, 0,
1f550 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 20 2d 31   0, pOrderBy, -1
1f560 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
1f570 20 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49               pWI
1f580 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 2c 20  nfo->iContinue, 
1f590 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b  pWInfo->iBreak);
1f5a0 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65  ..    /* End the
1f5b0 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c   database scan l
1f5c0 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
1f5d0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
1f5e0 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65  pWInfo);.  }else
1f5f0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
1f600 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
1f610 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 71 75  for aggregate qu
1f620 65 72 69 65 73 20 2a 2f 0a 20 20 20 20 4e 61 6d  eries */.    Nam
1f630 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
1f640 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
1f650 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
1f660 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d  aggregate inform
1f670 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ation */.    int
1f680 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iAMem;         
1f690 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
1f6a0 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e  dress for storin
1f6b0 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  g current GROUP 
1f6c0 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  BY */.    int iB
1f6d0 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
1f6e0 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
1f6f0 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20  ss for previous 
1f700 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
1f710 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20  int iUseFlag;   
1f720 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
1f730 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20  ss holding flag 
1f740 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
1f750 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20  at least.       
1f760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f770 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74   ** one row of t
1f780 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20  he input to the 
1f790 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62  aggregator has b
1f7a0 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  een.            
1f7b0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
1f7c0 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
1f7d0 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20  int iAbortFlag; 
1f7e0 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
1f7f0 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20  ss which causes 
1f800 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70  query abort if p
1f810 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69  ositive */.    i
1f820 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20  nt groupBySort; 
1f830 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20     /* Rows come 
1f840 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47  from source in G
1f850 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f  ROUP BY order */
1f860 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64  .    int addrEnd
1f870 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;        /* End 
1f880 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  of processing fo
1f890 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f  r this SELECT */
1f8a0 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
1f8b0 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61  any and all alia
1f8c0 73 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ses between the 
1f8d0 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74  result set and t
1f8e0 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20  he.    ** GROUP 
1f8f0 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a  BY clause..    *
1f900 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
1f910 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  By ){.      int 
1f920 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1f930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1f940 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
1f950 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
1f960 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
1f970 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1f980 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  over expression 
1f990 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20  in a list */..  
1f9a0 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 70 45 4c      for(i=p->pEL
1f9b0 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  ist->nExpr, pIte
1f9c0 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20  m=p->pEList->a; 
1f9d0 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
1f9e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
1f9f0 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  m->iAlias = 0;. 
1fa00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
1fa10 28 69 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  (i=pGroupBy->nEx
1fa20 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70  pr, pItem=pGroup
1fa30 42 79 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  By->a; i>0; i--,
1fa40 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
1fa50 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69 61 73     pItem->iAlias
1fa60 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1fa70 20 20 7d 0a 0a 20 0a 20 20 20 20 2f 2a 20 43 72    }.. .    /* Cr
1fa80 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20  eate a label to 
1fa90 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20  jump to when we 
1faa0 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68  want to abort th
1fab0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61  e query */.    a
1fac0 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  ddrEnd = sqlite3
1fad0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
1fae0 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  ;..    /* Conver
1faf0 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  t TK_COLUMN node
1fb00 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f  s into TK_AGG_CO
1fb10 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e  LUMN and make en
1fb20 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20  tries in.    ** 
1fb30 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c  sAggInfo for all
1fb40 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
1fb50 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73   nodes in expres
1fb60 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20  sions of the.   
1fb70 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
1fb80 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ment..    */.   
1fb90 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
1fba0 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
1fbb0 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
1fbc0 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e  pParse;.    sNC.
1fbd0 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
1fbe0 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67  ist;.    sNC.pAg
1fbf0 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66  gInfo = &sAggInf
1fc00 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  o;.    sAggInfo.
1fc10 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d  nSortingColumn =
1fc20 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f   pGroupBy ? pGro
1fc30 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20  upBy->nExpr+1 : 
1fc40 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  0;.    sAggInfo.
1fc50 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
1fc60 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBy;.    sqlite3
1fc70 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
1fc80 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29  st(&sNC, pEList)
1fc90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
1fca0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
1fcb0 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 3b  &sNC, pOrderBy);
1fcc0 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
1fcd0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1fce0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
1fcf0 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61  egates(&sNC, pHa
1fd00 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ving);.    }.   
1fd10 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d   sAggInfo.nAccum
1fd20 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66  ulator = sAggInf
1fd30 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66  o.nColumn;.    f
1fd40 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
1fd50 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  fo.nFunc; i++){.
1fd60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1fd70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
1fd80 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61  &sNC, sAggInfo.a
1fd90 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 70  Func[i].pExpr->p
1fda0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
1fdb0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1fdc0 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c  ailed ) goto sel
1fdd0 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a  ect_end;..    /*
1fde0 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   Processing for 
1fdf0 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20  aggregates with 
1fe00 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79  GROUP BY is very
1fe10 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20   different and. 
1fe20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20     ** much more 
1fe30 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67  complex than agg
1fe40 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20  regates without 
1fe50 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20  a GROUP BY..    
1fe60 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
1fe70 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79  pBy ){.      Key
1fe80 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
1fe90 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72   /* Keying infor
1fea0 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67  mation for the g
1feb0 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
1fec0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 20  /.      int j1; 
1fed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1fee0 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f  -vs-B comparisio
1fef0 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20  n jump */.      
1ff00 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f  int addrOutputRo
1ff10 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  w;  /* Start of 
1ff20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
1ff30 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74  outputs a result
1ff40 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e   row */.      in
1ff50 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20  t regOutputRow; 
1ff60 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72    /* Return addr
1ff70 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
1ff80 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
1ff90 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ne */.      int 
1ffa0 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20  addrSetAbort;   
1ffb0 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74  /* Set the abort
1ffc0 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e   flag and return
1ffd0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
1ffe0 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a  drTopOfLoop;  /*
1fff0 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75   Top of the inpu
20000 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  t loop */.      
20010 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49  int addrSortingI
20020 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70  dx; /* The OP_Op
20030 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20  enEphemeral for 
20040 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
20050 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  x */.      int a
20060 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  ddrReset;      /
20070 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  * Subroutine for
20080 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61   resetting the a
20090 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20  ccumulator */.  
200a0 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74      int regReset
200b0 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  ;       /* Retur
200c0 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
200d0 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62  er for reset sub
200e0 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20  routine */..    
200f0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
20100 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
20110 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64  se we might need
20120 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
20130 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70   to.      ** imp
20140 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f  lement it.  Allo
20150 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e  cate that sortin
20160 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66  g index now.  If
20170 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20   it turns out.  
20180 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
20190 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66  o not need it af
201a0 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 70 65  ter all, the Ope
201b0 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
201c0 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  uction.      ** 
201d0 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
201e0 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20  d into a Noop.  
201f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
20200 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
20210 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
20220 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79  ab++;.      pKey
20230 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
20240 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
20250 65 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  e, pGroupBy);.  
20260 20 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49      addrSortingI
20270 64 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dx = sqlite3Vdbe
20280 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
20290 6e 45 70 68 65 6d 65 72 61 6c 2c 20 0a 20 20 20  nEphemeral, .   
202a0 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
202b0 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67  sortingIdx, sAgg
202c0 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
202d0 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  umn, .          
202e0 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  0, (char*)pKeyIn
202f0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  fo, P4_KEYINFO_H
20300 41 4e 44 4f 46 46 29 3b 0a 0a 20 20 20 20 20 20  ANDOFF);..      
20310 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  /* Initialize me
20320 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75  mory locations u
20330 73 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20  sed by GROUP BY 
20340 61 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73  aggregate proces
20350 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sing.      */.  
20360 20 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b      iUseFlag = +
20370 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
20380 20 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20       iAbortFlag 
20390 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
203a0 3b 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75  ;.      regOutpu
203b0 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tRow = ++pParse-
203c0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
203d0 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
203e0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
203f0 6c 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52  l(v);.      regR
20400 65 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  eset = ++pParse-
20410 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64  >nMem;.      add
20420 72 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33  rReset = sqlite3
20430 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
20440 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20  ;.      iAMem = 
20450 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
20460 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
20470 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
20480 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ->nExpr;.      i
20490 42 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  BMem = pParse->n
204a0 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
204b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
204c0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
204d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
204e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
204f0 74 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74  teger, 0, iAbort
20500 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
20510 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c  eComment((v, "cl
20520 65 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29  ear abort flag")
20530 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20540 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20550 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73  _Integer, 0, iUs
20560 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  eFlag);.      Vd
20570 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
20580 6e 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61  ndicate accumula
20590 74 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 0a 20  tor empty"));.. 
205a0 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20       /* Begin a 
205b0 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65  loop that will e
205c0 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63  xtract all sourc
205d0 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20  e rows in GROUP 
205e0 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20  BY order..      
205f0 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e  ** This might in
20600 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61  volve two separa
20610 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e  te loops with an
20620 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77   OP_Sort in betw
20630 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a  een, or.      **
20640 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73   it might be a s
20650 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20  ingle loop that 
20660 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f  uses an index to
20670 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61   extract informa
20680 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tion.      ** in
20690 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72   the right order
206a0 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a   to begin with..
206b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
206c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
206d0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
206e0 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
206f0 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  t);.      pWInfo
20700 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
20710 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
20720 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 26  bList, pWhere, &
20730 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20  pGroupBy, 0);.  
20740 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
20750 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  0 ) goto select_
20760 65 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 70  end;.      if( p
20770 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
20780 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74        /* The opt
20790 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74  imizer is able t
207a0 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69  o deliver rows i
207b0 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72  n group by order
207c0 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   so.        ** w
207d0 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  e do not have to
207e0 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f   sort.  The OP_O
207f0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62  penEphemeral tab
20800 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  le will be.     
20810 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20     ** cancelled 
20820 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65  later because we
20830 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75   still need to u
20840 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a  se the pKeyInfo.
20850 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
20860 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
20870 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20  >pGroupBy;.     
20880 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
20890 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
208a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73  .        /* Rows
208b0 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20   are coming out 
208c0 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20  in undetermined 
208d0 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20  order.  We have 
208e0 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20  to push.        
208f0 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f  ** each row into
20900 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
20910 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  , terminate the 
20920 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20  first loop,.    
20930 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70      ** then loop
20940 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e   over the sortin
20950 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72  g index in order
20960 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70   to get the outp
20970 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ut.        ** in
20980 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20   sorted order.  
20990 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
209a0 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20   int regBase;.  
209b0 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63        int regRec
209c0 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ord;.        int
209d0 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69   nCol;.        i
209e0 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20  nt nGroupBy;..  
209f0 20 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72        groupBySor
20a00 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e  t = 1;.        n
20a10 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70  GroupBy = pGroup
20a20 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
20a30 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70     nCol = nGroup
20a40 42 79 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  By + 1;.        
20a50 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a  j = nGroupBy+1;.
20a60 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
20a70 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
20a80 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
20a90 20 20 20 20 20 69 66 28 20 73 41 67 67 49 6e 66       if( sAggInf
20aa0 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65  o.aCol[i].iSorte
20ab0 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20  rColumn>=j ){.  
20ac0 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b            nCol++
20ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  ;.            j+
20ae0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
20af0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20b00 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74   regBase = sqlit
20b10 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
20b20 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  Parse, nCol);.  
20b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
20b40 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
20b50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  arse, pGroupBy, 
20b60 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 20  regBase, 0);.   
20b70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20b80 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
20b90 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e  uence, sAggInfo.
20ba0 73 6f 72 74 69 6e 67 49 64 78 2c 72 65 67 42 61  sortingIdx,regBa
20bb0 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b 0a 20 20  se+nGroupBy);.  
20bc0 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70        j = nGroup
20bd0 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f  By+1;.        fo
20be0 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66  r(i=0; i<sAggInf
20bf0 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  o.nColumn; i++){
20c00 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
20c10 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
20c20 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e  Col = &sAggInfo.
20c30 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  aCol[i];.       
20c40 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f     if( pCol->iSo
20c50 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
20c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
20c70 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73   r1 = j + regBas
20c80 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
20c90 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20 20 20 20  nt r2;..        
20ca0 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33      r2 = sqlite3
20cb0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
20cc0 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  n(pParse, .     
20cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ce0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
20cf0 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c  pTab, pCol->iCol
20d00 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c  umn, pCol->iTabl
20d10 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  e, r1, 0);.     
20d20 20 20 20 20 20 20 20 69 66 28 20 72 31 21 3d 72         if( r1!=r
20d30 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
20d40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20d50 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79  dOp2(v, OP_SCopy
20d60 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20 20 20  , r2, r1);.     
20d70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20d80 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
20d90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
20da0 20 20 20 20 20 20 20 20 72 65 67 52 65 63 6f 72          regRecor
20db0 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
20dc0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
20dd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
20de0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
20df0 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61  akeRecord, regBa
20e00 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63  se, nCol, regRec
20e10 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
20e20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
20e30 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
20e40 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
20e50 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29  gIdx, regRecord)
20e60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20e70 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
20e80 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
20e90 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
20ea0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
20eb0 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 42  nge(pParse, regB
20ec0 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  ase, nCol);.    
20ed0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
20ee0 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
20ef0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20f00 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
20f10 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
20f20 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29  ingIdx, addrEnd)
20f30 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
20f40 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50  mment((v, "GROUP
20f50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a 20 20 20   BY sort"));.   
20f60 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73       sAggInfo.us
20f70 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b  eSortingIdx = 1;
20f80 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
20f90 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20  /* Evaluate the 
20fa0 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59  current GROUP BY
20fb0 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65   terms and store
20fc0 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e   in b0, b1, b2..
20fd0 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69  ..      ** (b0 i
20fe0 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  s memory locatio
20ff0 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73  n iBMem+0, b1 is
21000 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f   iBMem+1, and so
21010 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a   forth).      **
21020 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68   Then compare th
21030 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
21040 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74  BY terms against
21050 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65   the GROUP BY te
21060 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  rms.      ** fro
21070 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  m the previous r
21080 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ow currently sto
21090 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61  red in a0, a1, a
210a0 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  2....      */.  
210b0 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f      addrTopOfLoo
210c0 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
210d0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
210e0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
210f0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
21100 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
21110 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
21120 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
21130 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
21140 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 41 67 67   OP_Column, sAgg
21150 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
21160 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20   j, iBMem+j);.  
21170 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21180 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
21190 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
211a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
211b0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
211c0 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d  , pGroupBy->a[j]
211d0 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29  .pExpr, iBMem+j)
211e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
211f0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
21200 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
21210 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d  P_Compare, iAMem
21220 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42  , iBMem, pGroupB
21230 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  y->nExpr,.      
21240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21250 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
21260 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
21270 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c  ;.      j1 = sql
21280 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
21290 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
212a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
212b0 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31  v, OP_Jump, j1+1
212c0 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20 20  , 0, j1+1);..   
212d0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
212e0 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20 77 68  ode that runs wh
212f0 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f 55 50  enever the GROUP
21300 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20   BY changes..   
21310 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e     ** Changes in
21320 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 61 72   the GROUP BY ar
21330 65 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68  e detected by th
21340 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a  e previous code.
21350 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20        ** block. 
21360 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e   If there were n
21370 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20  o changes, this 
21380 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64  block is skipped
21390 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
213a0 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f   ** This code co
213b0 70 69 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f  pies current gro
213c0 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62  up by terms in b
213d0 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20  0,b1,b2,....    
213e0 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c    ** over to a0,
213f0 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20  a1,a2.  It then 
21400 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74  calls the output
21410 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
21420 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20    ** and resets 
21430 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
21440 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74  cumulator regist
21450 65 72 73 20 69 6e 20 70 72 65 70 61 72 61 74 69  ers in preparati
21460 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  on.      ** for 
21470 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42  the next GROUP B
21480 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a  Y batch..      *
21490 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
214a0 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
214b0 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d  se, iBMem, iAMem
214c0 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
214d0 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
214e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
214f0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70  P_Gosub, regOutp
21500 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75  utRow, addrOutpu
21510 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62  tRow);.      Vdb
21520 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75  eComment((v, "ou
21530 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b  tput one row"));
21540 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21550 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
21560 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67  fPos, iAbortFlag
21570 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
21580 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
21590 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66  , "check abort f
215a0 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71  lag"));.      sq
215b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
215c0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
215d0 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
215e0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
215f0 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20  ment((v, "reset 
21600 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a  accumulator"));.
21610 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
21620 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
21630 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65  ccumulators base
21640 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d on the content
21650 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
21660 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20   current row.   
21670 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
21680 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
21690 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20 75 70  v, j1);.      up
216a0 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
216b0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
216c0 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
216d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
216e0 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55  P_Integer, 1, iU
216f0 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56  seFlag);.      V
21700 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
21710 69 6e 64 69 63 61 74 65 20 64 61 74 61 20 69 6e  indicate data in
21720 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b   accumulator"));
21730 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f  ..      /* End o
21740 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20  f the loop.     
21750 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72   */.      if( gr
21760 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
21770 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
21780 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
21790 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
217a0 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f  ingIdx, addrTopO
217b0 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 65  fLoop);.      }e
217c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
217d0 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
217e0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  nfo);.        sq
217f0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
21800 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72  oNoop(v, addrSor
21810 74 69 6e 67 49 64 78 2c 20 31 29 3b 0a 20 20 20  tingIdx, 1);.   
21820 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f     }..      /* O
21830 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20  utput the final 
21840 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20  row of result.  
21850 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
21860 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
21870 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
21880 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
21890 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
218a0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
218b0 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f  "output final ro
218c0 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  w"));..      /* 
218d0 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75  Jump over the su
218e0 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20  broutines.      
218f0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
21900 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
21910 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6e  _Goto, 0, addrEn
21920 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  d);..      /* Ge
21930 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
21940 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
21950 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
21960 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
21970 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20    ** set.  This 
21980 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74  subroutine first
21990 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55   looks at the iU
219a0 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65  seFlag.  If iUse
219b0 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  Flag.      ** is
219c0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
219d0 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
219e0 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61   subroutine is a
219f0 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20   no-op.  If.    
21a00 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
21a10 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  ing calls for th
21a20 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74  e query to abort
21a30 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  , this subroutin
21a40 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65  e.      ** incre
21a50 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74  ments the iAbort
21a60 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  Flag memory loca
21a70 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75  tion before retu
21a80 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a  rning in.      *
21a90 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61  * order to signa
21aa0 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  l the caller to 
21ab0 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  abort..      */.
21ac0 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f        addrSetAbo
21ad0 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
21ae0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
21af0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
21b00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
21b10 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74  teger, 1, iAbort
21b20 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
21b30 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
21b40 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  t abort flag"));
21b50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21b60 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
21b70 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
21b80 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Row);.      sqli
21b90 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
21ba0 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75  bel(v, addrOutpu
21bb0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64  tRow);.      add
21bc0 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
21bd0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
21be0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
21bf0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
21c00 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73  v, OP_IfPos, iUs
21c10 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75  eFlag, addrOutpu
21c20 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56  tRow+2);.      V
21c30 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
21c40 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  Groupby result g
21c50 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70  enerator entry p
21c60 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73  oint"));.      s
21c70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
21c80 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
21c90 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
21ca0 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
21cb0 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
21cc0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
21cd0 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
21ce0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21cf0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
21d00 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64  rse, pHaving, ad
21d10 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53  drOutputRow+1, S
21d20 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
21d30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21d40 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
21d50 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
21d60 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72  EList, 0, 0, pOr
21d70 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
21d80 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
21d90 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
21da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21db0 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
21dc0 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72  w+1, addrSetAbor
21dd0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
21de0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
21df0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
21e00 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
21e10 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
21e20 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75  end groupby resu
21e30 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b  lt generator"));
21e40 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
21e50 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
21e60 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74   that will reset
21e70 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63   the group-by ac
21e80 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20  cumulator.      
21e90 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
21ea0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
21eb0 28 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  (v, addrReset);.
21ec0 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
21ed0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
21ee0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
21ef0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21f00 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
21f10 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20   regReset);.    
21f20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66   .    } /* endif
21f30 20 70 47 72 6f 75 70 42 79 20 2a 2f 0a 20 20 20   pGroupBy */.   
21f40 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78   else {.      Ex
21f50 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20  prList *pMinMax 
21f60 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72 4c  = 0;.      ExprL
21f70 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 20  ist *pDel = 0;. 
21f80 20 20 20 20 20 75 38 20 66 6c 61 67 3b 0a 0a 20       u8 flag;.. 
21f90 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66       /* Check if
21fa0 20 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66   the query is of
21fb0 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c   one of the foll
21fc0 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20  owing forms:.   
21fd0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
21fe0 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46   SELECT min(x) F
21ff0 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  ROM ....      **
22000 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29     SELECT max(x)
22010 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20   FROM ....      
22020 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 69  **.      ** If i
22030 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74  t is, then ask t
22040 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  he code in where
22050 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  .c to attempt to
22060 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20   sort results.  
22070 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65      ** as if the
22080 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52  re was an "ORDER
22090 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52   ON x" or "ORDER
220a0 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75   ON x DESC" clau
220b0 73 65 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 66  se. .      ** If
220c0 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c 65   where.c is able
220d0 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73 75   to produce resu
220e0 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74 68  lts sorted in th
220f0 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20  is order, then. 
22100 20 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65       ** add vdbe
22110 20 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f   code to break o
22120 75 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73  ut of the proces
22130 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20  sing loop after 
22140 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  the .      ** fi
22150 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73  rst iteration (s
22160 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69  ince the first i
22170 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
22180 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 2a  loop is .      *
22190 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
221a0 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72  operate on the r
221b0 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69  ow with the mini
221c0 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a  mum or maximum .
221d0 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f        ** value o
221e0 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f  f x, the only ro
221f0 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20  w required)..   
22200 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41     **.      ** A
22210 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75   special flag mu
22220 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  st be passed to 
22230 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
22240 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a  n() to slightly.
22250 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20        ** modify 
22260 62 65 68 61 76 69 6f 75 72 20 61 73 20 66 6f 6c  behaviour as fol
22270 6c 6f 77 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  lows:.      **. 
22280 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74       **   + If t
22290 68 65 20 71 75 65 72 79 20 69 73 20 61 20 22 53  he query is a "S
222a0 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74  ELECT min(x)", t
222b0 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64  hen the loop cod
222c0 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 20  ed by.      **  
222d0 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c     where.c shoul
222e0 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76  d not iterate ov
222f0 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69  er any values wi
22300 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a  th a NULL value.
22310 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72        **     for
22320 20 78 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20   x..      **.   
22330 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70     **   + The op
22340 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20  timizer code in 
22350 77 68 65 72 65 2e 63 20 28 74 68 65 20 74 68 69  where.c (the thi
22360 6e 67 20 74 68 61 74 20 64 65 63 69 64 65 73 20  ng that decides 
22370 77 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 20  which.      **  
22380 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69     index or indi
22390 63 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75  ces to use) shou
223a0 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66 66 65  ld place a diffe
223b0 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e  rent priority on
223c0 20 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73   .      **     s
223d0 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f  atisfying the 'O
223e0 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20  RDER BY' clause 
223f0 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20  than it does in 
22400 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20  other cases..   
22410 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20     **     Refer 
22420 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d  to code and comm
22430 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20  ents in where.c 
22440 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20  for details..   
22450 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67     */.      flag
22460 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 70   = minMaxQuery(p
22470 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
22480 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20   if( flag ){.   
22490 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e       pDel = pMin
224a0 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Max = sqlite3Exp
224b0 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
224c0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
224d0 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20  pr->pList);.    
224e0 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20      if( pMinMax 
224f0 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
22500 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
22510 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
22520 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67  sortOrder = flag
22530 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  !=WHERE_ORDERBY_
22540 4d 49 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 70  MIN;.          p
22550 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78  MinMax->a[0].pEx
22560 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pr->op = TK_COLU
22570 4d 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  MN;.        }.  
22580 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
22590 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69  This case runs i
225a0 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  f the aggregate 
225b0 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  has no GROUP BY 
225c0 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20  clause.  The.   
225d0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
225e0 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72   is much simpler
225f0 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
22600 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f  only a single ro
22610 77 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75  w.      ** of ou
22620 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tput..      */. 
22630 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
22640 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
22650 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
22660 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
22670 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
22680 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
22690 65 72 65 2c 20 26 70 4d 69 6e 4d 61 78 2c 20 66  ere, &pMinMax, f
226a0 6c 61 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  lag);.      if( 
226b0 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  pWInfo==0 ){.   
226c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
226d0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
226e0 44 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  Del);.        go
226f0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
22700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 70 64       }.      upd
22710 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
22720 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
22730 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d  );.      if( !pM
22740 69 6e 4d 61 78 20 26 26 20 66 6c 61 67 20 29 7b  inMax && flag ){
22750 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22760 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22770 5f 47 6f 74 6f 2c 20 30 2c 20 70 57 49 6e 66 6f  _Goto, 0, pWInfo
22780 2d 3e 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  ->iBreak);.     
22790 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
227a0 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65  v, "%s() by inde
227b0 78 22 2c 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f  x",(flag==WHERE_
227c0 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e  ORDERBY_MIN?"min
227d0 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20  ":"max")));.    
227e0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
227f0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
22800 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
22810 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
22820 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
22830 3b 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79  ;.      pOrderBy
22840 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
22850 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
22860 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
22870 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
22880 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20  aving, addrEnd, 
22890 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
228a0 4c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  L);.      }.    
228b0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
228c0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
228d0 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30 2c  pEList, 0, 0, 0,
228e0 20 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20   -1, .          
228f0 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73              pDes
22900 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64 64 72  t, addrEnd, addr
22910 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  End);..      sql
22920 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
22930 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20  te(db, pDel);.  
22940 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
22950 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
22960 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  v, addrEnd);.   
22970 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 61   .  } /* endif a
22980 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20 2a  ggregate query *
22990 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  /..  /* If there
229a0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
229b0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20  clause, then we 
229c0 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65  need to sort the
229d0 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e   results.  ** an
229e0 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74  d send them to t
229f0 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20  he callback one 
22a00 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  by one..  */.  i
22a10 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
22a20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54     generateSortT
22a30 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 76  ail(pParse, p, v
22a40 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  , pEList->nExpr,
22a50 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20   pDest);.  }..  
22a60 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
22a70 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79 0a  skip this query.
22a80 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
22a90 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
22aa0 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54  , iEnd);..  /* T
22ab0 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73 75  he SELECT was su
22ac0 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65 64  ccessfully coded
22ad0 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74 75  .   Set the retu
22ae0 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20 2a  rn code to 0.  *
22af0 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e 6f  * to indicate no
22b00 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20   errors..  */.  
22b10 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  rc = 0;..  /* Co
22b20 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20 68  ntrol jumps to h
22b30 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ere if an error 
22b40 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  is encountered a
22b50 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20 20  bove, or upon.  
22b60 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63 6f  ** successful co
22b70 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c 45  ding of the SELE
22b80 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74 5f  CT..  */.select_
22b90 65 6e 64 3a 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  end:..  /* Ident
22ba0 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ify column names
22bb0 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20 74   if results of t
22bc0 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 74 6f  he SELECT are to
22bd0 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
22be0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
22bf0 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65  E_OK && pDest->e
22c00 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
22c10 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
22c20 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
22c30 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
22c40 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  List);.  }..  sq
22c50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
22c60 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a  sAggInfo.aCol);.
22c70 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
22c80 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  db, sAggInfo.aFu
22c90 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nc);.  return rc
22ca0 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
22cb0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
22cc0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
22cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
22d20 6e 67 20 63 6f 64 65 20 69 73 20 75 73 65 64 20  ng code is used 
22d30 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
22d40 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20  debugging only. 
22d50 20 54 68 65 20 63 6f 64 65 0a 2a 2a 20 74 68 61   The code.** tha
22d60 74 20 66 6f 6c 6c 6f 77 73 20 64 6f 65 73 20 6e  t follows does n
22d70 6f 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72  ot appear in nor
22d80 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a  mal builds..**.*
22d90 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
22da0 20 61 72 65 20 75 73 65 64 20 74 6f 20 70 72 69   are used to pri
22db0 6e 74 20 6f 75 74 20 74 68 65 20 63 6f 6e 74 65  nt out the conte
22dc0 6e 74 20 6f 66 20 61 6c 6c 20 6f 72 20 70 61 72  nt of all or par
22dd0 74 20 6f 66 20 61 20 0a 2a 2a 20 70 61 72 73 65  t of a .** parse
22de0 20 73 74 72 75 63 74 75 72 65 73 20 73 75 63 68   structures such
22df0 20 61 73 20 53 65 6c 65 63 74 20 6f 72 20 45 78   as Select or Ex
22e00 70 72 2e 20 20 53 75 63 68 20 70 72 69 6e 74 6f  pr.  Such printo
22e10 75 74 73 20 61 72 65 20 75 73 65 66 75 6c 0a 2a  uts are useful.*
22e20 2a 20 66 6f 72 20 68 65 6c 70 69 6e 67 20 74 6f  * for helping to
22e30 20 75 6e 64 65 72 73 74 61 6e 64 20 77 68 61 74   understand what
22e40 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 69 6e   is happening in
22e50 73 69 64 65 20 74 68 65 20 63 6f 64 65 20 67 65  side the code ge
22e60 6e 65 72 61 74 6f 72 0a 2a 2a 20 64 75 72 69 6e  nerator.** durin
22e70 67 20 74 68 65 20 65 78 65 63 75 74 69 6f 6e 20  g the execution 
22e80 6f 66 20 63 6f 6d 70 6c 65 78 20 53 45 4c 45 43  of complex SELEC
22e90 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  T statements..**
22ea0 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e  .** These routin
22eb0 65 20 61 72 65 20 6e 6f 74 20 63 61 6c 6c 65 64  e are not called
22ec0 20 61 6e 79 77 68 65 72 65 20 66 72 6f 6d 20 77   anywhere from w
22ed0 69 74 68 69 6e 20 74 68 65 20 6e 6f 72 6d 61 6c  ithin the normal
22ee0 0a 2a 2a 20 63 6f 64 65 20 62 61 73 65 2e 20 20  .** code base.  
22ef0 54 68 65 6e 20 61 72 65 20 69 6e 74 65 6e 64 65  Then are intende
22f00 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 66  d to be called f
22f10 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 64  rom within the d
22f20 65 62 75 67 67 65 72 0a 2a 2a 20 6f 72 20 66 72  ebugger.** or fr
22f30 6f 6d 20 74 65 6d 70 6f 72 61 72 79 20 22 70 72  om temporary "pr
22f40 69 6e 74 66 22 20 73 74 61 74 65 6d 65 6e 74 73  intf" statements
22f50 20 69 6e 73 65 72 74 65 64 20 66 6f 72 20 64 65   inserted for de
22f60 62 75 67 67 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64  bugging..*/.void
22f70 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
22f80 72 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  r(Expr *p){.  if
22f90 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 20 26 26 20  ( p->token.z && 
22fa0 70 2d 3e 74 6f 6b 65 6e 2e 6e 3e 30 20 29 7b 0a  p->token.n>0 ){.
22fb0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
22fc0 50 72 69 6e 74 66 28 22 28 25 2e 2a 73 22 2c 20  Printf("(%.*s", 
22fd0 70 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 70 2d 3e 74  p->token.n, p->t
22fe0 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65  oken.z);.  }else
22ff0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
23000 75 67 50 72 69 6e 74 66 28 22 28 25 64 22 2c 20  ugPrintf("(%d", 
23010 70 2d 3e 6f 70 29 3b 0a 20 20 7d 0a 20 20 69 66  p->op);.  }.  if
23020 28 20 70 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  ( p->pLeft ){.  
23030 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23040 69 6e 74 66 28 22 20 22 29 3b 0a 20 20 20 20 73  intf(" ");.    s
23050 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70 72 28  qlite3PrintExpr(
23060 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20  p->pLeft);.  }. 
23070 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 29   if( p->pRight )
23080 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
23090 75 67 50 72 69 6e 74 66 28 22 20 22 29 3b 0a 20  ugPrintf(" ");. 
230a0 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
230b0 78 70 72 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a  xpr(p->pRight);.
230c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62    }.  sqlite3Deb
230d0 75 67 50 72 69 6e 74 66 28 22 29 22 29 3b 0a 7d  ugPrintf(")");.}
230e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 72 69  .void sqlite3Pri
230f0 6e 74 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  ntExprList(ExprL
23100 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
23110 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
23120 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
23130 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
23140 65 33 50 72 69 6e 74 45 78 70 72 28 70 4c 69 73  e3PrintExpr(pLis
23150 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
23160 20 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74 2d      if( i<pList-
23170 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20 20  >nExpr-1 ){.    
23180 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23190 69 6e 74 66 28 22 2c 20 22 29 3b 0a 20 20 20 20  intf(", ");.    
231a0 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  }.  }.}.void sql
231b0 69 74 65 33 50 72 69 6e 74 53 65 6c 65 63 74 28  ite3PrintSelect(
231c0 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
231d0 6e 64 65 6e 74 29 7b 0a 20 20 73 71 6c 69 74 65  ndent){.  sqlite
231e0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 2a  3DebugPrintf("%*
231f0 73 53 45 4c 45 43 54 28 25 70 29 20 22 2c 20 69  sSELECT(%p) ", i
23200 6e 64 65 6e 74 2c 20 22 22 2c 20 70 29 3b 0a 20  ndent, "", p);. 
23210 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
23220 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 29  rList(p->pEList)
23230 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
23240 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  Printf("\n");.  
23250 69 66 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20  if( p->pSrc ){. 
23260 20 20 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78     char *zPrefix
23270 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
23280 20 7a 50 72 65 66 69 78 20 3d 20 22 46 52 4f 4d   zPrefix = "FROM
23290 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ";.    for(i=0; 
232a0 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b  i<p->pSrc->nSrc;
232b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
232c0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
232d0 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53   *pItem = &p->pS
232e0 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
232f0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
23300 74 66 28 22 25 2a 73 20 22 2c 20 69 6e 64 65 6e  tf("%*s ", inden
23310 74 2b 36 2c 20 7a 50 72 65 66 69 78 29 3b 0a 20  t+6, zPrefix);. 
23320 20 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22       zPrefix = "
23330 22 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ";.      if( pIt
23340 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
23350 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
23360 62 75 67 50 72 69 6e 74 66 28 22 28 5c 6e 22 29  bugPrintf("(\n")
23370 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
23380 33 50 72 69 6e 74 53 65 6c 65 63 74 28 70 49 74  3PrintSelect(pIt
23390 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 6e 64  em->pSelect, ind
233a0 65 6e 74 2b 31 30 29 3b 0a 20 20 20 20 20 20 20  ent+10);.       
233b0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
233c0 6e 74 66 28 22 25 2a 73 29 22 2c 20 69 6e 64 65  ntf("%*s)", inde
233d0 6e 74 2b 38 2c 20 22 22 29 3b 0a 20 20 20 20 20  nt+8, "");.     
233e0 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 6d   }else if( pItem
233f0 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ->zName ){.     
23400 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
23410 72 69 6e 74 66 28 22 25 73 22 2c 20 70 49 74 65  rintf("%s", pIte
23420 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m->zName);.     
23430 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74   }.      if( pIt
23440 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20  em->pTab ){.    
23450 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23460 50 72 69 6e 74 66 28 22 28 74 61 62 6c 65 3a 20  Printf("(table: 
23470 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  %s)", pItem->pTa
23480 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b->zName);.     
23490 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74   }.      if( pIt
234a0 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  em->zAlias ){.  
234b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
234c0 75 67 50 72 69 6e 74 66 28 22 20 41 53 20 25 73  ugPrintf(" AS %s
234d0 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  ", pItem->zAlias
234e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
234f0 20 69 66 28 20 69 3c 70 2d 3e 70 53 72 63 2d 3e   if( i<p->pSrc->
23500 6e 53 72 63 2d 31 20 29 7b 0a 20 20 20 20 20 20  nSrc-1 ){.      
23510 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23520 69 6e 74 66 28 22 2c 22 29 3b 0a 20 20 20 20 20  intf(",");.     
23530 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
23540 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
23550 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
23560 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a  f( p->pWhere ){.
23570 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23580 50 72 69 6e 74 66 28 22 25 2a 73 20 57 48 45 52  Printf("%*s WHER
23590 45 20 22 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29  E ", indent, "")
235a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 72 69  ;.    sqlite3Pri
235b0 6e 74 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  ntExpr(p->pWhere
235c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
235d0 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b  bugPrintf("\n");
235e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47  .  }.  if( p->pG
235f0 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71  roupBy ){.    sq
23600 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
23610 28 22 25 2a 73 20 47 52 4f 55 50 20 42 59 20 22  ("%*s GROUP BY "
23620 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20  , indent, "");. 
23630 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
23640 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75  xprList(p->pGrou
23650 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBy);.    sqlite
23660 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
23670 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ");.  }.  if( p-
23680 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20  >pHaving ){.    
23690 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
236a0 74 66 28 22 25 2a 73 20 48 41 56 49 4e 47 20 22  tf("%*s HAVING "
236b0 2c 20 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20  , indent, "");. 
236c0 20 20 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45     sqlite3PrintE
236d0 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b  xpr(p->pHaving);
236e0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
236f0 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20  gPrintf("\n");. 
23700 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64   }.  if( p->pOrd
23710 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
23720 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
23730 25 2a 73 20 4f 52 44 45 52 20 42 59 20 22 2c 20  %*s ORDER BY ", 
23740 69 6e 64 65 6e 74 2c 20 22 22 29 3b 0a 20 20 20  indent, "");.   
23750 20 73 71 6c 69 74 65 33 50 72 69 6e 74 45 78 70   sqlite3PrintExp
23760 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42  rList(p->pOrderB
23770 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  y);.    sqlite3D
23780 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29  ebugPrintf("\n")
23790 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20 6f  ;.  }.}./* End o
237a0 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  f the structure 
237b0 64 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63  debug printing c
237c0 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ode.************
237d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  */.#endif /* def
23820 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
23830 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
23840 49 54 45 5f 44 45 42 55 47 29 20 2a 2f 0a        ITE_DEBUG) */.