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

Artifact 0e82e32d3bd536c90e778c930cdf7dafa5afd886cc8c467c443ff95c38109e10:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 73 2f 25 64 2f 25 70 3a 20 22 2c 28 53 29  "%s/%d/%p: ",(S)
02c0: 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28 50 29 2d 3e  ->zSelName,(P)->
02d0: 61 64 64 72 45 78 70 6c 61 69 6e 2c 28 53 29 29  addrExplain,(S))
02e0: 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ,\.    sqlite3De
02f0: 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65 6c 73  bugPrintf X.#els
0300: 65 0a 23 20 64 65 66 69 6e 65 20 53 45 4c 45 43  e.# define SELEC
0310: 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c 58 29 0a  TTRACE(K,P,S,X).
0320: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
0330: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0340: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65  e following obje
0350: 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  ct is used to re
0360: 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  cord information
0370: 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f   about.** how to
0380: 20 70 72 6f 63 65 73 73 20 74 68 65 20 44 49 53   process the DIS
0390: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 2c 20 74  TINCT keyword, t
03a0: 6f 20 73 69 6d 70 6c 69 66 79 20 70 61 73 73 69  o simplify passi
03b0: 6e 67 20 74 68 61 74 20 69 6e 66 6f 72 6d 61 74  ng that informat
03c0: 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  ion.** into the 
03d0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
03e0: 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79  ) routine..*/.ty
03f0: 70 65 64 65 66 20 73 74 72 75 63 74 20 44 69 73  pedef struct Dis
0400: 74 69 6e 63 74 43 74 78 20 44 69 73 74 69 6e 63  tinctCtx Distinc
0410: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 44 69 73  tCtx;.struct Dis
0420: 74 69 6e 63 74 43 74 78 20 7b 0a 20 20 75 38 20  tinctCtx {.  u8 
0430: 69 73 54 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20  isTnct;      /* 
0440: 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
0450: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
0460: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20  present */.  u8 
0470: 65 54 6e 63 74 54 79 70 65 3b 20 20 20 2f 2a 20  eTnctType;   /* 
0480: 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
0490: 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72  _DISTINCT_* oper
04a0: 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74  ators */.  int t
04b0: 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70  abTnct;    /* Ep
04c0: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73  hemeral table us
04d0: 65 64 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20  ed for DISTINCT 
04e0: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20  processing */.  
04f0: 69 6e 74 20 61 64 64 72 54 6e 63 74 3b 20 20 20  int addrTnct;   
0500: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
0510: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f  _OpenEphemeral o
0520: 70 63 6f 64 65 20 66 6f 72 20 74 61 62 54 6e 63  pcode for tabTnc
0530: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
0540: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0550: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65  e following obje
0560: 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  ct is used to re
0570: 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  cord information
0580: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 4f 52   about.** the OR
0590: 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50  DER BY (or GROUP
05a0: 20 42 59 29 20 63 6c 61 75 73 65 20 6f 66 20 71   BY) clause of q
05b0: 75 65 72 79 20 69 73 20 62 65 69 6e 67 20 63 6f  uery is being co
05c0: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ded..**.** The a
05d0: 44 65 66 65 72 5b 5d 20 61 72 72 61 79 20 69 73  Defer[] array is
05e0: 20 75 73 65 64 20 62 79 20 74 68 65 20 73 6f 72   used by the sor
05f0: 74 65 72 2d 72 65 66 65 72 65 6e 63 65 73 20 6f  ter-references o
0600: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 46 6f 72  ptimization. For
0610: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  .** example, ass
0620: 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 6e  uming there is n
0630: 6f 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e  o index that can
0640: 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
0650: 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 66 6f   ORDER BY,.** fo
0660: 72 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  r the query:.**.
0670: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c  **     SELECT a,
0680: 20 62 69 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31   bigblob FROM t1
0690: 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49   ORDER BY a LIMI
06a0: 54 20 31 30 3b 0a 2a 2a 0a 2a 2a 20 69 74 20 6d  T 10;.**.** it m
06b0: 61 79 20 62 65 20 6d 6f 72 65 20 65 66 66 69 63  ay be more effic
06c0: 69 65 6e 74 20 74 6f 20 61 64 64 20 6a 75 73 74  ient to add just
06d0: 20 74 68 65 20 22 61 22 20 76 61 6c 75 65 73 20   the "a" values 
06e0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 20 61  to the sorter, a
06f0: 6e 64 0a 2a 2a 20 72 65 74 72 69 65 76 65 20 74  nd.** retrieve t
0700: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 62  he associated "b
0710: 69 67 62 6c 6f 62 22 20 76 61 6c 75 65 73 20 64  igblob" values d
0720: 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 61 62  irectly from tab
0730: 6c 65 20 74 31 20 61 73 20 74 68 65 0a 2a 2a 20  le t1 as the.** 
0740: 31 30 20 73 6d 61 6c 6c 65 73 74 20 22 61 22 20  10 smallest "a" 
0750: 76 61 6c 75 65 73 20 61 72 65 20 65 78 74 72 61  values are extra
0760: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 6f  cted from the so
0770: 72 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  rter..**.** When
0780: 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65   the sorter-refe
0790: 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69  rence optimizati
07a0: 6f 6e 20 69 73 20 75 73 65 64 2c 20 74 68 65 72  on is used, ther
07b0: 65 20 69 73 20 6f 6e 65 20 65 6e 74 72 79 20 69  e is one entry i
07c0: 6e 20 74 68 65 0a 2a 2a 20 61 44 65 66 65 72 5b  n the.** aDefer[
07d0: 5d 20 61 72 72 61 79 20 66 6f 72 20 65 61 63 68  ] array for each
07e0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
07f0: 74 68 61 74 20 6d 61 79 20 62 65 20 72 65 61 64  that may be read
0800: 20 61 73 20 76 61 6c 75 65 73 20 61 72 65 0a 2a   as values are.*
0810: 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  * extracted from
0820: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
0830: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0840: 6f 72 74 43 74 78 20 53 6f 72 74 43 74 78 3b 0a  ortCtx SortCtx;.
0850: 73 74 72 75 63 74 20 53 6f 72 74 43 74 78 20 7b  struct SortCtx {
0860: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
0870: 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
0880: 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f  ORDER BY (or GRO
0890: 55 50 20 42 59 20 63 6c 61 75 73 65 29 20 2a 2f  UP BY clause) */
08a0: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20  .  int nOBSat;  
08b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
08c0: 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74  er of ORDER BY t
08d0: 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 62  erms satisfied b
08e0: 79 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  y indices */.  i
08f0: 6e 74 20 69 45 43 75 72 73 6f 72 3b 20 20 20 20  nt iECursor;    
0900: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
0910: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73 6f  umber for the so
0920: 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  rter */.  int re
0930: 67 52 65 74 75 72 6e 3b 20 20 20 20 20 20 20 20  gReturn;        
0940: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
0950: 69 6e 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74  ing block-output
0960: 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
0970: 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b  */.  int labelBk
0980: 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 74  Out;       /* St
0990: 61 72 74 20 6c 61 62 65 6c 20 66 6f 72 20 74 68  art label for th
09a0: 65 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73  e block-output s
09b0: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
09c0: 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  nt addrSortIndex
09d0: 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  ;    /* Address 
09e0: 6f 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72  of the OP_Sorter
09f0: 4f 70 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45  Open or OP_OpenE
0a00: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 69 6e  phemeral */.  in
0a10: 74 20 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20  t labelDone;    
0a20: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
0a30: 20 77 68 65 6e 20 64 6f 6e 65 2c 20 65 78 3a 20   when done, ex: 
0a40: 4c 49 4d 49 54 20 72 65 61 63 68 65 64 20 2a 2f  LIMIT reached */
0a50: 0a 20 20 75 38 20 73 6f 72 74 46 6c 61 67 73 3b  .  u8 sortFlags;
0a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f           /* Zero
0a70: 20 6f 72 20 6d 6f 72 65 20 53 4f 52 54 46 4c 41   or more SORTFLA
0a80: 47 5f 2a 20 62 69 74 73 20 2a 2f 0a 20 20 75 38  G_* bits */.  u8
0a90: 20 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f   bOrderedInnerLo
0aa0: 6f 70 3b 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  op; /* ORDER BY 
0ab0: 63 6f 72 72 65 63 74 6c 79 20 73 6f 72 74 73 20  correctly sorts 
0ac0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a  the inner loop *
0ad0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
0ae0: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
0af0: 46 45 52 45 4e 43 45 53 0a 20 20 75 38 20 6e 44  FERENCES.  u8 nD
0b00: 65 66 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  efer;           
0b10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
0b20: 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61  lid entries in a
0b30: 44 65 66 65 72 5b 5d 20 2a 2f 0a 20 20 73 74 72  Defer[] */.  str
0b40: 75 63 74 20 44 65 66 65 72 72 65 64 43 73 72 20  uct DeferredCsr 
0b50: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
0b60: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  b;        /* Tab
0b70: 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f  le definition */
0b80: 0a 20 20 20 20 69 6e 74 20 69 43 73 72 3b 20 20  .    int iCsr;  
0b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
0ba0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61  or number for ta
0bb0: 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ble */.    int n
0bc0: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Key;           /
0bd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 4b 20 63  * Number of PK c
0be0: 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 61 62 6c 65  olumns for table
0bf0: 20 70 54 61 62 20 28 3e 3d 31 29 20 2a 2f 0a 20   pTab (>=1) */. 
0c00: 20 7d 20 61 44 65 66 65 72 5b 34 5d 3b 0a 23 65   } aDefer[4];.#e
0c10: 6e 64 69 66 0a 20 20 73 74 72 75 63 74 20 52 6f  ndif.  struct Ro
0c20: 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 44 65 66 65  wLoadInfo *pDefe
0c30: 72 72 65 64 52 6f 77 4c 6f 61 64 3b 20 20 2f 2a  rredRowLoad;  /*
0c40: 20 44 65 66 65 72 72 65 64 20 72 6f 77 20 6c 6f   Deferred row lo
0c50: 61 64 69 6e 67 20 69 6e 66 6f 20 6f 72 20 4e 55  ading info or NU
0c60: 4c 4c 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65  LL */.};.#define
0c70: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
0c80: 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a 20 55  ter  0x01   /* U
0c90: 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  se SorterOpen in
0ca0: 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45 70 68  stead of OpenEph
0cb0: 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  emeral */../*.**
0cc0: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
0cd0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
0ce0: 65 63 74 20 73 74 72 75 63 74 75 72 65 2e 20 20  ect structure.  
0cf0: 44 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  Deallocate the s
0d00: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65  tructure.** itse
0d10: 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46 72 65 65  lf only if bFree
0d20: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
0d30: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0d40: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0d50: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
0d60: 20 62 46 72 65 65 29 7b 0a 20 20 77 68 69 6c 65   bFree){.  while
0d70: 28 20 70 20 29 7b 0a 20 20 20 20 53 65 6c 65 63  ( p ){.    Selec
0d80: 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
0d90: 50 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74  Prior;.    sqlit
0da0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
0db0: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  (db, p->pEList);
0dc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
0dd0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
0de0: 3e 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69  >pSrc);.    sqli
0df0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
0e00: 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  , p->pWhere);.  
0e10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0e20: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
0e30: 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71  GroupBy);.    sq
0e40: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0e50: 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  db, p->pHaving);
0e60: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0e70: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0e80: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
0e90: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
0ea0: 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
0eb0: 29 3b 0a 20 20 20 20 69 66 28 20 4f 4b 5f 49 46  );.    if( OK_IF
0ec0: 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70 2d 3e  _ALWAYS_TRUE(p->
0ed0: 70 57 69 74 68 29 20 29 20 73 71 6c 69 74 65 33  pWith) ) sqlite3
0ee0: 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70  WithDelete(db, p
0ef0: 2d 3e 70 57 69 74 68 29 3b 0a 20 20 20 20 69 66  ->pWith);.    if
0f00: 28 20 62 46 72 65 65 20 29 20 73 71 6c 69 74 65  ( bFree ) sqlite
0f10: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
0f20: 3b 0a 20 20 20 20 70 20 3d 20 70 50 72 69 6f 72  ;.    p = pPrior
0f30: 3b 0a 20 20 20 20 62 46 72 65 65 20 3d 20 31 3b  ;.    bFree = 1;
0f40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
0f50: 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63  itialize a Selec
0f60: 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e  tDest structure.
0f70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0f80: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53  SelectDestInit(S
0f90: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
0fa0: 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74  , int eDest, int
0fb0: 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74   iParm){.  pDest
0fc0: 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44  ->eDest = (u8)eD
0fd0: 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53  est;.  pDest->iS
0fe0: 44 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20  DParm = iParm;. 
0ff0: 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74   pDest->zAffSdst
1000: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69   = 0;.  pDest->i
1010: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
1020: 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a  t->nSdst = 0;.}.
1030: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1040: 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74   a new Select st
1050: 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75  ructure and retu
1060: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1070: 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72  that.** structur
1080: 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71  e..*/.Select *sq
1090: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a  lite3SelectNew(.
10a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
10c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
10d0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
10e0: 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63  ,     /* which c
10f0: 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64  olumns to includ
1100: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
1110: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1120: 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  rc,        /* th
1130: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d  e FROM clause --
1140: 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f   which tables to
1150: 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20   scan */.  Expr 
1160: 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
1170: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
1180: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
1190: 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20  st *pGroupBy,   
11a0: 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  /* the GROUP BY 
11b0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
11c0: 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20   *pHaving,      
11d0: 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20    /* the HAVING 
11e0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
11f0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
1200: 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42    /* the ORDER B
1210: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 33  Y clause */.  u3
1220: 32 20 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20  2 selFlags,     
1230: 20 20 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61      /* Flag para
1240: 6d 65 74 65 72 73 2c 20 73 75 63 68 20 61 73 20  meters, such as 
1250: 53 46 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20  SF_Distinct */. 
1260: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 20 20   Expr *pLimit   
1270: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20         /* LIMIT 
1280: 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61  value.  NULL mea
1290: 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 29  ns not used */.)
12a0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
12b0: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
12c0: 69 6e 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  in;.  pNew = sql
12d0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
12e0: 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  N(pParse->db, si
12f0: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
1300: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1310: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1320: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1330: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
1340: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d   = &standin;.  }
1350: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
1360: 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d   ){.    pEList =
1370: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1380: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
1390: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13c0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 54 4b 5f 41  (pParse->db,TK_A
13d0: 53 54 45 52 49 53 4b 2c 30 29 29 3b 0a 20 20 7d  STERISK,0));.  }
13e0: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
13f0: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77  = pEList;.  pNew
1400: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
1410: 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61  ;.  pNew->selFla
1420: 67 73 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20  gs = selFlags;. 
1430: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
1440: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  0;.  pNew->iOffs
1450: 65 74 20 3d 20 30 3b 0a 23 69 66 20 53 45 4c 45  et = 0;.#if SELE
1460: 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
1470: 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65    pNew->zSelName
1480: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
1490: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
14a0: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
14b0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
14c0: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
14d0: 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d  ew->nSelectRow =
14e0: 20 30 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d   0;.  if( pSrc==
14f0: 30 20 29 20 70 53 72 63 20 3d 20 73 71 6c 69 74  0 ) pSrc = sqlit
1500: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
1510: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
1520: 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65  f(*pSrc));.  pNe
1530: 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  w->pSrc = pSrc;.
1540: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
1550: 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d   pWhere;.  pNew-
1560: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
1570: 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  upBy;.  pNew->pH
1580: 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b  aving = pHaving;
1590: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
15a0: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
15b0: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30  pNew->pPrior = 0
15c0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
15d0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  = 0;.  pNew->pLi
15e0: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
15f0: 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b  pNew->pWith = 0;
1600: 0a 20 20 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20  .  pNew->pWin = 
1610: 30 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  0;.  if( pParse-
1620: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1630: 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53  d ) {.    clearS
1640: 65 6c 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62  elect(pParse->db
1650: 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73  , pNew, pNew!=&s
1660: 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65  tandin);.    pNe
1670: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
1680: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
1690: 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50 61  ->pSrc!=0 || pPa
16a0: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20  rse->nErr>0 );. 
16b0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65   }.  assert( pNe
16c0: 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20  w!=&standin );. 
16d0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
16e0: 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
16f0: 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53  _ENABLED./*.** S
1700: 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  et the name of a
1710: 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 0a 2a   Select object.*
1720: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
1730: 6c 65 63 74 53 65 74 4e 61 6d 65 28 53 65 6c 65  lectSetName(Sele
1740: 63 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ct *p, const cha
1750: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
1760: 20 70 20 26 26 20 7a 4e 61 6d 65 20 29 7b 0a 20   p && zName ){. 
1770: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1780: 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 53  ntf(sizeof(p->zS
1790: 65 6c 4e 61 6d 65 29 2c 20 70 2d 3e 7a 53 65 6c  elName), p->zSel
17a0: 4e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 4e 61 6d  Name, "%s", zNam
17b0: 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  e);.  }.}.#endif
17c0: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  .../*.** Delete 
17d0: 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74  the given Select
17e0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
17f0: 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72  ll of its substr
1800: 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64  uctures..*/.void
1810: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1820: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
1830: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
1840: 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53  if( OK_IF_ALWAYS
1850: 5f 54 52 55 45 28 70 29 20 29 20 63 6c 65 61 72  _TRUE(p) ) clear
1860: 53 65 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29  Select(db, p, 1)
1870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1880: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1890: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45  he right-most SE
18a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
18b0: 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f  n a compound..*/
18c0: 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a  .static Select *
18d0: 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65  findRightmost(Se
18e0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c  lect *p){.  whil
18f0: 65 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20  e( p->pNext ) p 
1900: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65  = p->pNext;.  re
1910: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1920: 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64   Given 1 to 3 id
1930: 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 64  entifiers preced
1940: 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79  ing the JOIN key
1950: 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20  word, determine 
1960: 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a  the.** type of j
1970: 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  oin.  Return an 
1980: 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  integer constant
1990: 20 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20   that expresses 
19a0: 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20  that type.** in 
19b0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c  terms of the fol
19c0: 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65  lowing bit value
19d0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f  s:.**.**     JT_
19e0: 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f  INNER.**     JT_
19f0: 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f  CROSS.**     JT_
1a00: 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f  OUTER.**     JT_
1a10: 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a  NATURAL.**     J
1a20: 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54  T_LEFT.**     JT
1a30: 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66  _RIGHT.**.** A f
1a40: 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69  ull outer join i
1a50: 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f  s the combinatio
1a60: 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64  n of JT_LEFT and
1a70: 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a   JT_RIGHT..**.**
1a80: 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f   If an illegal o
1a90: 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f  r unsupported jo
1aa0: 69 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c  in type is seen,
1ab0: 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75   then still retu
1ac0: 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70  rn.** a join typ
1ad0: 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72  e, but put an er
1ae0: 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73  ror in the pPars
1af0: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
1b00: 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54  int sqlite3JoinT
1b10: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
1b20: 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f  e, Token *pA, To
1b30: 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a  ken *pB, Token *
1b40: 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74  pC){.  int joint
1b50: 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e  ype = 0;.  Token
1b60: 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f   *apAll[3];.  To
1b70: 6b 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20  ken *p;.        
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35       /*   012345
1ba0: 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31  6789 123456789 1
1bb0: 32 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a  23456789 123 */.
1bc0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1bd0: 68 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d  har zKeyText[] =
1be0: 20 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65   "naturaleftoute
1bf0: 72 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72  rightfullinnercr
1c00: 6f 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63  oss";.  static c
1c10: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
1c20: 20 20 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f    u8 i;        /
1c30: 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b  * Beginning of k
1c40: 65 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a  eyword text in z
1c50: 4b 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20  KeyText[] */.   
1c60: 20 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a   u8 nChar;    /*
1c70: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b   Length of the k
1c80: 65 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63  eyword in charac
1c90: 74 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63  ters */.    u8 c
1ca0: 6f 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e  ode;     /* Join
1cb0: 20 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20   type mask */.  
1cc0: 7d 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b  } aKeyword[] = {
1cd0: 0a 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20  .    /* natural 
1ce0: 2a 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e  */ { 0,  7, JT_N
1cf0: 41 54 55 52 41 4c 20 20 20 20 20 20 20 20 20 20  ATURAL          
1d00: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1d10: 6c 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20  left    */ { 6, 
1d20: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f   4, JT_LEFT|JT_O
1d30: 55 54 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c  UTER          },
1d40: 0a 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20  .    /* outer   
1d50: 2a 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f  */ { 10, 5, JT_O
1d60: 55 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20  UTER            
1d70: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1d80: 72 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c  right   */ { 14,
1d90: 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f   5, JT_RIGHT|JT_
1da0: 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c  OUTER         },
1db0: 0a 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20  .    /* full    
1dc0: 2a 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c  */ { 19, 4, JT_L
1dd0: 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f  EFT|JT_RIGHT|JT_
1de0: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20  OUTER },.    /* 
1df0: 69 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c  inner   */ { 23,
1e00: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20   5, JT_INNER    
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1e20: 0a 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20  .    /* cross   
1e30: 2a 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49  */ { 28, 5, JT_I
1e40: 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20  NNER|JT_CROSS   
1e50: 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20        },.  };.  
1e60: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c  int i, j;.  apAl
1e70: 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41  l[0] = pA;.  apA
1e80: 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70  ll[1] = pB;.  ap
1e90: 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66  All[2] = pC;.  f
1ea0: 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61  or(i=0; i<3 && a
1eb0: 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  pAll[i]; i++){. 
1ec0: 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b     p = apAll[i];
1ed0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
1ee0: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1ef0: 72 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  rd); j++){.     
1f00: 20 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77   if( p->n==aKeyw
1f10: 6f 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20  ord[j].nChar .  
1f20: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
1f30: 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
1f40: 2a 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78  *)p->z, &zKeyTex
1f50: 74 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d  t[aKeyword[j].i]
1f60: 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20  , p->n)==0 ){.  
1f70: 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c        jointype |
1f80: 3d 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f  = aKeyword[j].co
1f90: 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  de;.        brea
1fa0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1fb0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a  .    testcase( j
1fc0: 3d 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a  ==0 || j==1 || j
1fd0: 3d 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a  ==2 || j==3 || j
1fe0: 3d 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a  ==4 || j==5 || j
1ff0: 3d 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a  ==6 );.    if( j
2000: 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79  >=ArraySize(aKey
2010: 77 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a  word) ){.      j
2020: 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52  ointype |= JT_ER
2030: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
2040: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2050: 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  (.     (jointype
2060: 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   & (JT_INNER|JT_
2070: 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e  OUTER))==(JT_INN
2080: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a  ER|JT_OUTER) ||.
2090: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
20a0: 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20   JT_ERROR)!=0.  
20b0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
20c0: 72 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20  r *zSp = " ";.  
20d0: 20 20 61 73 73 65 72 74 28 20 70 42 21 3d 30 20    assert( pB!=0 
20e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30  );.    if( pC==0
20f0: 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20   ){ zSp++; }.   
2100: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2110: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
2120: 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64  n or unsupported
2130: 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20   join type: ".  
2140: 20 20 20 20 20 22 25 54 20 25 54 25 73 25 54 22       "%T %T%s%T"
2150: 2c 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70  , pA, pB, zSp, p
2160: 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65  C);.    jointype
2170: 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d   = JT_INNER;.  }
2180: 65 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79  else if( (jointy
2190: 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
21a0: 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0 .         && (
21b0: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c  jointype & (JT_L
21c0: 45 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d  EFT|JT_RIGHT))!=
21d0: 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73  JT_LEFT ){.    s
21e0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
21f0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52  Parse, .      "R
2200: 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55  IGHT and FULL OU
2210: 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f  TER JOINs are no
2220: 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70  t currently supp
2230: 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69  orted");.    joi
2240: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
2250: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a  ;.  }.  return j
2260: 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ointype;.}../*.*
2270: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
2280: 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69  ex of a column i
2290: 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75  n a table.  Retu
22a0: 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c  rn -1 if the col
22b0: 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  umn.** is not co
22c0: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74  ntained in the t
22d0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
22e0: 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  int columnIndex(
22f0: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e  Table *pTab, con
2300: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a  st char *zCol){.
2310: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
2320: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
2330: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2340: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
2350: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  Tab->aCol[i].zNa
2360: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72  me, zCol)==0 ) r
2370: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
2380: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
2390: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 69  ** Search the fi
23a0: 72 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20  rst N tables in 
23b0: 70 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20  pSrc, from left 
23c0: 74 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e  to right, lookin
23d0: 67 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65  g for a.** table
23e0: 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75   that has a colu
23f0: 6d 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20  mn named zCol.  
2400: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e  .**.** When foun
2410: 64 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e  d, set *piTab an
2420: 64 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20  d *piCol to the 
2430: 74 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20  table index and 
2440: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20  column index.** 
2450: 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  of the matching 
2460: 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72  column and retur
2470: 6e 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  n TRUE..**.** If
2480: 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75   not found, retu
2490: 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61  rn FALSE..*/.sta
24a0: 74 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64  tic int tableAnd
24b0: 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53  ColumnIndex(.  S
24c0: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
24d0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
24e0: 74 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68  tables to search
24f0: 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20   */.  int N,    
2500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2510: 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
2520: 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73  n pSrc->a[] to s
2530: 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74  earch */.  const
2540: 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20   char *zCol,    
2550: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
2560: 6f 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f  olumn we are loo
2570: 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  king for */.  in
2580: 74 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20  t *piTab,       
2590: 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65     /* Write inde
25a0: 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68  x of pSrc->a[] h
25b0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  ere */.  int *pi
25c0: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Col           /*
25d0: 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20   Write index of 
25e0: 70 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e  pSrc->a[*piTab].
25f0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72  pTab->aCol[] her
2600: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2620: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
2630: 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72  er tables in pSr
2640: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  c */.  int iCol;
2650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2660: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d  ndex of column m
2670: 61 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a  atching zCol */.
2680: 0a 20 20 61 73 73 65 72 74 28 20 28 70 69 54 61  .  assert( (piTa
2690: 62 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30  b==0)==(piCol==0
26a0: 29 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72  ) );  /* Both or
26b0: 20 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c   neither are NUL
26c0: 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  L */.  for(i=0; 
26d0: 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<N; i++){.    i
26e0: 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65  Col = columnInde
26f0: 78 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61  x(pSrc->a[i].pTa
2700: 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66  b, zCol);.    if
2710: 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
2720: 20 20 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a     if( piTab ){.
2730: 20 20 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d          *piTab =
2740: 20 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43   i;.        *piC
2750: 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  ol = iCol;.     
2760: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
2770: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
2780: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2790: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
27a0: 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 74  is used to add t
27b0: 65 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20  erms implied by 
27c0: 4a 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74  JOIN syntax to t
27d0: 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
27e0: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  se expression of
27f0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2800: 65 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72  ent. The new ter
2810: 6d 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41  m, which.** is A
2820: 4e 44 65 64 20 77 69 74 68 20 74 68 65 20 65 78  NDed with the ex
2830: 69 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61  isting WHERE cla
2840: 75 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66  use, is of the f
2850: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74  orm:.**.**    (t
2860: 61 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e  ab1.col1 = tab2.
2870: 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72  col2).**.** wher
2880: 65 20 74 61 62 31 20 69 73 20 74 68 65 20 69 53  e tab1 is the iS
2890: 72 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53  rc'th table in S
28a0: 72 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20  rcList pSrc and 
28b0: 74 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20  tab2 is the .** 
28c0: 28 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c  (iSrc+1)'th. Col
28d0: 75 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75  umn col1 is colu
28e0: 6d 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74  mn iColLeft of t
28f0: 61 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73  ab1, and col2 is
2900: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52  .** column iColR
2910: 69 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f  ight of tab2..*/
2920: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64  .static void add
2930: 57 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72  WhereTerm(.  Par
2940: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2960: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
2970: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
2980: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rc,             
2990: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
29a0: 74 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63  tables in FROM c
29b0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
29c0: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
29d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
29e0: 64 65 78 20 6f 66 20 66 69 72 73 74 20 74 61 62  dex of first tab
29f0: 6c 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53  le to join in pS
2a00: 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  rc */.  int iCol
2a10: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
2a20: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2a30: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69   of column in fi
2a40: 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  rst table */.  i
2a50: 6e 74 20 69 52 69 67 68 74 2c 20 20 20 20 20 20  nt iRight,      
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a70: 2a 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e  * Index of secon
2a80: 64 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20  d table in pSrc 
2a90: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67  */.  int iColRig
2aa0: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
2ab0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2ac0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e   column in secon
2ad0: 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  d table */.  int
2ae0: 20 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20   isOuterJoin,   
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b00: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2b10: 61 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f  an OUTER join */
2b20: 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72  .  Expr **ppWher
2b30: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2b40: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68     /* IN/OUT: Th
2b50: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2b60: 6f 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20  o add to */.){. 
2b70: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2b80: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
2b90: 72 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a  r *pE1;.  Expr *
2ba0: 70 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71  pE2;.  Expr *pEq
2bb0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65  ;..  assert( iLe
2bc0: 66 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61  ft<iRight );.  a
2bd0: 73 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72  ssert( pSrc->nSr
2be0: 63 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73  c>iRight );.  as
2bf0: 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c  sert( pSrc->a[iL
2c00: 65 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61  eft].pTab );.  a
2c10: 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69  ssert( pSrc->a[i
2c20: 52 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a  Right].pTab );..
2c30: 20 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43    pE1 = sqlite3C
2c40: 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28  reateColumnExpr(
2c50: 64 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  db, pSrc, iLeft,
2c60: 20 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45   iColLeft);.  pE
2c70: 32 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  2 = sqlite3Creat
2c80: 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20  eColumnExpr(db, 
2c90: 70 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43  pSrc, iRight, iC
2ca0: 6f 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71  olRight);..  pEq
2cb0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2cc0: 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70  pParse, TK_EQ, p
2cd0: 45 31 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20  E1, pE2);.  if( 
2ce0: 70 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f  pEq && isOuterJo
2cf0: 69 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65  in ){.    ExprSe
2d00: 74 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45  tProperty(pEq, E
2d10: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20  P_FromJoin);.   
2d20: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2d30: 73 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45  sProperty(pEq, E
2d40: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
2d50: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45  educed) );.    E
2d60: 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
2d70: 79 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75  y(pEq, EP_NoRedu
2d80: 63 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52  ce);.    pEq->iR
2d90: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
2da0: 28 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65  (i16)pE2->iTable
2db0: 3b 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65  ;.  }.  *ppWhere
2dc0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
2dd0: 64 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20  d(db, *ppWhere, 
2de0: 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pEq);.}../*.** S
2df0: 65 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  et the EP_FromJo
2e00: 69 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61  in property on a
2e10: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
2e20: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
2e30: 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65  ..** And set the
2e40: 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e   Expr.iRightJoin
2e50: 54 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20  Table to iTable 
2e60: 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69  for every term i
2e70: 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  n the.** express
2e80: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  ion..**.** The E
2e90: 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65  P_FromJoin prope
2ea0: 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74  rty is used on t
2eb0: 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65  erms of an expre
2ec0: 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a  ssion to tell.**
2ed0: 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20   the LEFT OUTER 
2ee0: 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20  JOIN processing 
2ef0: 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20  logic that this 
2f00: 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20  term is part of 
2f10: 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74  the.** join rest
2f20: 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65  riction specifie
2f30: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
2f40: 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20  SING clause and 
2f50: 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66  not a part.** of
2f60: 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61   the more genera
2f70: 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  l WHERE clause. 
2f80: 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65   These terms are
2f90: 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74   moved over to t
2fa0: 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
2fb0: 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70  se during join p
2fc0: 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65  rocessing but we
2fd0: 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
2fe0: 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f  r that they.** o
2ff0: 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65  riginated in the
3000: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
3010: 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  use..**.** The E
3020: 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
3030: 62 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48  ble tells the WH
3040: 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
3050: 73 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a  ssing that the.*
3060: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  * expression dep
3070: 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52  ends on table iR
3080: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76  ightJoinTable ev
3090: 65 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65  en if that table
30a0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69   is not.** expli
30b0: 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20  citly mentioned 
30c0: 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  in the expressio
30d0: 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61  n.  That informa
30e0: 74 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a  tion is needed.*
30f0: 2a 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65  * for cases like
3100: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
3110: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3120: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
3130: 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74   t1.a=t2.b AND t
3140: 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  1.x=5.**.** The 
3150: 77 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65  where clause nee
3160: 64 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20  ds to defer the 
3170: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20  handling of the 
3180: 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75  t1.x=5.** term u
3190: 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74  ntil after the t
31a0: 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f  2 loop of the jo
31b0: 69 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79  in.  In that way
31c0: 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72  , a.** NULL t2 r
31d0: 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  ow will be inser
31e0: 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e  ted whenever t1.
31f0: 78 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20  x!=5.  If we do 
3200: 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65  not.** defer the
3210: 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e   handling of t1.
3220: 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  x=5, it will be 
3230: 70 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69  processed immedi
3240: 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74  ately.** after t
3250: 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72  he t1 loop and r
3260: 6f 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35  ows with t1.x!=5
3270: 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65   will never appe
3280: 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74  ar in.** the out
3290: 70 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e  put, which is in
32a0: 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74  correct..*/.stat
32b0: 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45  ic void setJoinE
32c0: 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  xpr(Expr *p, int
32d0: 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c   iTable){.  whil
32e0: 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72  e( p ){.    Expr
32f0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45  SetProperty(p, E
3300: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20  P_FromJoin);.   
3310: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
3320: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
3330: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
3340: 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70  uced) );.    Exp
3350: 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
3360: 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  p, EP_NoReduce);
3370: 0a 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f  .    p->iRightJo
3380: 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69  inTable = (i16)i
3390: 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 70  Table;.    if( p
33a0: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
33b0: 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20  N && p->x.pList 
33c0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
33d0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
33e0: 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  <p->x.pList->nEx
33f0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
3400: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d    setJoinExpr(p-
3410: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
3420: 45 78 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20  Expr, iTable);. 
3430: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
3440: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e   setJoinExpr(p->
3450: 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a  pLeft, iTable);.
3460: 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68      p = p->pRigh
3470: 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 20 55 6e  t;.  } .}../* Un
3480: 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 73  do the work of s
3490: 65 74 4a 6f 69 6e 45 78 70 72 28 29 2e 20 20 49  etJoinExpr().  I
34a0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
34b0: 20 74 72 65 65 20 70 2c 20 63 6f 6e 76 65 72 74   tree p, convert
34c0: 20 65 76 65 72 79 0a 2a 2a 20 74 65 72 6d 20 74   every.** term t
34d0: 68 61 74 20 69 73 20 6d 61 72 6b 65 64 20 77 69  hat is marked wi
34e0: 74 68 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 61  th EP_FromJoin a
34f0: 6e 64 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  nd iRightJoinTab
3500: 6c 65 3d 3d 69 54 61 62 6c 65 20 69 6e 74 6f 0a  le==iTable into.
3510: 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74  ** an ordinary t
3520: 65 72 6d 20 74 68 61 74 20 6f 6d 69 74 73 20 74  erm that omits t
3530: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 6d  he EP_FromJoin m
3540: 61 72 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ark..**.** This 
3550: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 4c  happens when a L
3560: 45 46 54 20 4a 4f 49 4e 20 69 73 20 73 69 6d 70  EFT JOIN is simp
3570: 6c 69 66 69 65 64 20 69 6e 74 6f 20 61 6e 20 6f  lified into an o
3580: 72 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 0a 2a 2f  rdinary JOIN..*/
3590: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 73  .static void uns
35a0: 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20  etJoinExpr(Expr 
35b0: 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b  *p, int iTable){
35c0: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
35d0: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
35e0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
35f0: 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 28  mJoin).     && (
3600: 69 54 61 62 6c 65 3c 30 20 7c 7c 20 70 2d 3e 69  iTable<0 || p->i
3610: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d  RightJoinTable==
3620: 69 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20  iTable) ){.     
3630: 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72   ExprClearProper
3640: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
3650: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  n);.    }.    if
3660: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  ( p->op==TK_FUNC
3670: 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69  TION && p->x.pLi
3680: 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
3690: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
36a0: 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  ; i<p->x.pList->
36b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
36c0: 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78       unsetJoinEx
36d0: 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  pr(p->x.pList->a
36e0: 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
36f0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
3700: 7d 0a 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45  }.    unsetJoinE
3710: 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54  xpr(p->pLeft, iT
3720: 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70  able);.    p = p
3730: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d  ->pRight;.  } .}
3740: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3750: 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74  tine processes t
3760: 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74  he join informat
3770: 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54  ion for a SELECT
3780: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f   statement..** O
3790: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
37a0: 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65  ses are converte
37b0: 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72  d into extra ter
37c0: 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
37d0: 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52  clause..** NATUR
37e0: 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72  AL joins also cr
37f0: 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45  eate extra WHERE
3800: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a   clause terms..*
3810: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f  *.** The terms o
3820: 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  f a FROM clause 
3830: 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  are contained in
3840: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63   the Select.pSrc
3850: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54   structure..** T
3860: 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62  he left most tab
3870: 6c 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20  le is the first 
3880: 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e  entry in Select.
3890: 70 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74  pSrc.  The right
38a0: 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69  -most.** table i
38b0: 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  s the last entry
38c0: 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72  .  The join oper
38d0: 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20  ator is held in 
38e0: 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20  the entry to.** 
38f0: 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20  the left.  Thus 
3900: 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73  entry 0 contains
3910: 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   the join operat
3920: 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20  or for the join 
3930: 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69  between.** entri
3940: 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79  es 0 and 1.  Any
3950: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
3960: 75 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  uses associated 
3970: 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72  with the join ar
3980: 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68  e.** also attach
3990: 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65  ed to the left e
39a0: 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ntry..**.** This
39b0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
39c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
39d0: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
39e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
39f0: 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
3a00: 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  in(Parse *pParse
3a10: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
3a20: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a40: 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e  /* All tables in
3a50: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
3a60: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a80: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
3a90: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75  unters */.  stru
3aa0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
3ab0: 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c  *pLeft;     /* L
3ac0: 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  eft table being 
3ad0: 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  joined */.  stru
3ae0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
3af0: 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52  *pRight;    /* R
3b00: 69 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67  ight table being
3b10: 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53   joined */..  pS
3b20: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
3b30: 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61  pLeft = &pSrc->a
3b40: 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20  [0];.  pRight = 
3b50: 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72  &pLeft[1];.  for
3b60: 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
3b70: 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68  rc-1; i++, pRigh
3b80: 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20  t++, pLeft++){. 
3b90: 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74     Table *pRight
3ba0: 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54  Tab = pRight->pT
3bb0: 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75  ab;.    int isOu
3bc0: 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45  ter;..    if( NE
3bd0: 56 45 52 28 70 4c 65 66 74 2d 3e 70 54 61 62 3d  VER(pLeft->pTab=
3be0: 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d  =0 || pRightTab=
3bf0: 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =0) ) continue;.
3c00: 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70      isOuter = (p
3c10: 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79  Right->fg.jointy
3c20: 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
3c30: 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  0;..    /* When 
3c40: 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
3c50: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ord is present, 
3c60: 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65  add WHERE clause
3c70: 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a   terms for.    *
3c80: 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74  * every column t
3c90: 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c  hat the two tabl
3ca0: 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f  es have in commo
3cb0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
3cc0: 28 20 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69  ( pRight->fg.joi
3cd0: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
3ce0: 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  AL ){.      if( 
3cf0: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70  pRight->pOn || p
3d00: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
3d10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3d20: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3d30: 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e   "a NATURAL join
3d40: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a   may not have ".
3d50: 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f             "an O
3d60: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
3d70: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  e", 0);.        
3d80: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
3d90: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
3da0: 20 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43   j<pRightTab->nC
3db0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
3dc0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
3dd0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75   /* Name of colu
3de0: 6d 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74 20  mn in the right 
3df0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
3e00: 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20   int iLeft;     
3e10: 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74  /* Matching left
3e20: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
3e30: 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20    int iLeftCol; 
3e40: 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c   /* Matching col
3e50: 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20  umn in the left 
3e60: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20  table */..      
3e70: 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74    zName = pRight
3e80: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
3e90: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
3ea0: 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
3eb0: 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a  dex(pSrc, i+1, z
3ec0: 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69  Name, &iLeft, &i
3ed0: 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20  LeftCol) ){.    
3ee0: 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65        addWhereTe
3ef0: 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c  rm(pParse, pSrc,
3f00: 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c   iLeft, iLeftCol
3f10: 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20  , i+1, j,.      
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f30: 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57   isOuter, &p->pW
3f40: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  here);.        }
3f50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
3f60: 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20      /* Disallow 
3f70: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
3f80: 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65  G clauses in the
3f90: 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a   same join.    *
3fa0: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3fb0: 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d  ->pOn && pRight-
3fc0: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
3fd0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3fe0: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
3ff0: 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e   have both ON an
4000: 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20  d USING ".      
4010: 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68    "clauses in th
4020: 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20  e same join");. 
4030: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
4040: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
4050: 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74   the ON clause t
4060: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
4070: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63   WHERE clause, c
4080: 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20  onnected by.    
4090: 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ** an AND operat
40a0: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
40b0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29  f( pRight->pOn )
40c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75  {.      if( isOu
40d0: 74 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70  ter ) setJoinExp
40e0: 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70  r(pRight->pOn, p
40f0: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b  Right->iCursor);
4100: 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65  .      p->pWhere
4110: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
4120: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  d(pParse->db, p-
4130: 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d  >pWhere, pRight-
4140: 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69  >pOn);.      pRi
4150: 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20  ght->pOn = 0;.  
4160: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
4170: 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  te extra terms o
4180: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
4190: 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  se for each colu
41a0: 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20  mn named.    ** 
41b0: 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  in the USING cla
41c0: 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49  use.  Example: I
41d0: 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  f the two tables
41e0: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72   to be joined ar
41f0: 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20  e .    ** A and 
4200: 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20  B and the USING 
4210: 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20  clause names X, 
4220: 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61  Y, and Z, then a
4230: 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74  dd this.    ** t
4240: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
4250: 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41  se:    A.X=B.X A
4260: 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41  ND A.Y=B.Y AND A
4270: 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65  .Z=B.Z.    ** Re
4280: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66  port an error if
4290: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74   any column ment
42a0: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49  ioned in the USI
42b0: 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20  NG clause is.   
42c0: 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   ** not containe
42d0: 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  d in both tables
42e0: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20   to be joined.. 
42f0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
4300: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
4310: 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c        IdList *pL
4320: 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55  ist = pRight->pU
4330: 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  sing;.      for(
4340: 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49  j=0; j<pList->nI
4350: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
4360: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
4370: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
4380: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49   term in the USI
4390: 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  NG clause */.   
43a0: 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20       int iLeft; 
43b0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f        /* Table o
43c0: 6e 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20  n the left with 
43d0: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
43e0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
43f0: 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20  int iLeftCol;   
4400: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
4410: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f  r of matching co
4420: 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74  lumn on the left
4430: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
4440: 69 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20  iRightCol;   /* 
4450: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
4460: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
4470: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
4480: 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ..        zName 
4490: 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e  = pList->a[j].zN
44a0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69  ame;.        iRi
44b0: 67 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49  ghtCol = columnI
44c0: 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20  ndex(pRightTab, 
44d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
44e0: 69 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a  if( iRightCol<0.
44f0: 20 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62           || !tab
4500: 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
4510: 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d  (pSrc, i+1, zNam
4520: 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66  e, &iLeft, &iLef
4530: 74 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b  tCol).        ){
4540: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4550: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4560: 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20  e, "cannot join 
4570: 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20  using column %s 
4580: 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20  - column ".     
4590: 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73         "not pres
45a0: 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c  ent in both tabl
45b0: 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  es", zName);.   
45c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
45d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
45e0: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
45f0: 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c  pParse, pSrc, iL
4600: 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69  eft, iLeftCol, i
4610: 2b 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20  +1, iRightCol,. 
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d      isOuter, &p-
4640: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
4650: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
4660: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f  turn 0;.}../* Fo
4670: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
4680: 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
4690: 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  o *keyInfoFromEx
46a0: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
46b0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
46c0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
46d0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
46e0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46  *pList,     /* F
46f0: 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  orm the KeyInfo 
4700: 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73  object from this
4710: 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69   ExprList */.  i
4720: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
4730: 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74      /* Begin wit
4740: 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66  h this column of
4750: 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
4760: 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  nExtra          
4770: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
4780: 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  y extra columns 
4790: 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b  to the end */.);
47a0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
47b0: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
47c0: 63 74 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61  ct holds informa
47d0: 74 69 6f 6e 20 28 62 65 79 6f 6e 64 20 70 50 61  tion (beyond pPa
47e0: 72 73 65 20 61 6e 64 20 70 53 65 6c 65 63 74 29  rse and pSelect)
47f0: 0a 2a 2a 20 6e 65 65 64 65 64 20 74 6f 20 6c 6f  .** needed to lo
4800: 61 64 20 74 68 65 20 6e 65 78 74 20 72 65 73 75  ad the next resu
4810: 6c 74 20 72 6f 77 20 74 68 61 74 20 69 73 20 74  lt row that is t
4820: 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
4830: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74 79 70  e sorter..*/.typ
4840: 65 64 65 66 20 73 74 72 75 63 74 20 52 6f 77 4c  edef struct RowL
4850: 6f 61 64 49 6e 66 6f 20 52 6f 77 4c 6f 61 64 49  oadInfo RowLoadI
4860: 6e 66 6f 3b 0a 73 74 72 75 63 74 20 52 6f 77 4c  nfo;.struct RowL
4870: 6f 61 64 49 6e 66 6f 20 7b 0a 20 20 69 6e 74 20  oadInfo {.  int 
4880: 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20  regResult;      
4890: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
48a0: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 72 72  e results in arr
48b0: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
48c0: 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 65 63 65  here */.  u8 ece
48d0: 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  lFlags;         
48e0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 61         /* Flag a
48f0: 72 67 75 6d 65 6e 74 20 74 6f 20 45 78 70 72 43  rgument to ExprC
4900: 6f 64 65 45 78 70 72 4c 69 73 74 28 29 20 2a 2f  odeExprList() */
4910: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
4920: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
4930: 45 52 45 4e 43 45 53 0a 20 20 45 78 70 72 4c 69  ERENCES.  ExprLi
4940: 73 74 20 2a 70 45 78 74 72 61 3b 20 20 20 20 20  st *pExtra;     
4950: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
4960: 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 62  columns needed b
4970: 79 20 73 6f 72 74 65 72 20 72 65 66 73 20 2a 2f  y sorter refs */
4980: 0a 20 20 69 6e 74 20 72 65 67 45 78 74 72 61 52  .  int regExtraR
4990: 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
49a0: 2f 2a 20 57 68 65 72 65 20 74 6f 20 6c 6f 61 64  /* Where to load
49b0: 20 74 68 65 20 65 78 74 72 61 20 63 6f 6c 75 6d   the extra colum
49c0: 6e 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ns */.#endif.};.
49d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
49e0: 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72  ine does the wor
49f0: 6b 20 6f 66 20 6c 6f 61 64 69 6e 67 20 71 75 65  k of loading que
4a00: 72 79 20 64 61 74 61 20 69 6e 74 6f 20 61 6e 20  ry data into an 
4a10: 61 72 72 61 79 20 6f 66 0a 2a 2a 20 72 65 67 69  array of.** regi
4a20: 73 74 65 72 73 20 73 6f 20 74 68 61 74 20 69 74  sters so that it
4a30: 20 63 61 6e 20 62 65 20 61 64 64 65 64 20 74 6f   can be added to
4a40: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
4a50: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 6e 65  static void inne
4a60: 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 0a 20 20  rLoopLoadRow(.  
4a70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4a80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
4a90: 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
4aa0: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
4ab0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
4ac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
4ad0: 65 20 71 75 65 72 79 20 62 65 69 6e 67 20 63 6f  e query being co
4ae0: 64 65 64 20 2a 2f 0a 20 20 52 6f 77 4c 6f 61 64  ded */.  RowLoad
4af0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
4b00: 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6e 65 65 64      /* Info need
4b10: 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  ed to complete t
4b20: 68 65 20 72 6f 77 20 6c 6f 61 64 20 2a 2f 0a 29  he row load */.)
4b30: 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  {.  sqlite3ExprC
4b40: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
4b50: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  se, pSelect->pEL
4b60: 69 73 74 2c 20 70 49 6e 66 6f 2d 3e 72 65 67 52  ist, pInfo->regR
4b70: 65 73 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20  esult,.         
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b90: 20 30 2c 20 70 49 6e 66 6f 2d 3e 65 63 65 6c 46   0, pInfo->ecelF
4ba0: 6c 61 67 73 29 3b 0a 23 69 66 64 65 66 20 53 51  lags);.#ifdef SQ
4bb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
4bc0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
4bd0: 69 66 28 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72  if( pInfo->pExtr
4be0: 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  a ){.    sqlite3
4bf0: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
4c00: 28 70 50 61 72 73 65 2c 20 70 49 6e 66 6f 2d 3e  (pParse, pInfo->
4c10: 70 45 78 74 72 61 2c 20 70 49 6e 66 6f 2d 3e 72  pExtra, pInfo->r
4c20: 65 67 45 78 74 72 61 52 65 73 75 6c 74 2c 20 30  egExtraResult, 0
4c30: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4c40: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
4c50: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 66  pParse->db, pInf
4c60: 6f 2d 3e 70 45 78 74 72 61 29 3b 0a 20 20 7d 0a  o->pExtra);.  }.
4c70: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
4c80: 43 6f 64 65 20 74 68 65 20 4f 50 5f 4d 61 6b 65  Code the OP_Make
4c90: 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63 74 69  Record instructi
4ca0: 6f 6e 20 74 68 61 74 20 67 65 6e 65 72 61 74 65  on that generate
4cb0: 73 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 62  s the entry to b
4cc0: 65 0a 2a 2a 20 61 64 64 65 64 20 69 6e 74 6f 20  e.** added into 
4cd0: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2a 0a 2a  the sorter..**.*
4ce0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67  * Return the reg
4cf0: 69 73 74 65 72 20 69 6e 20 77 68 69 63 68 20 74  ister in which t
4d00: 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f  he result is sto
4d10: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
4d20: 6e 74 20 6d 61 6b 65 53 6f 72 74 65 72 52 65 63  nt makeSorterRec
4d30: 6f 72 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ord(.  Parse *pP
4d40: 61 72 73 65 2c 0a 20 20 53 6f 72 74 43 74 78 20  arse,.  SortCtx 
4d50: 2a 70 53 6f 72 74 2c 0a 20 20 53 65 6c 65 63 74  *pSort,.  Select
4d60: 20 2a 70 53 65 6c 65 63 74 2c 0a 20 20 69 6e 74   *pSelect,.  int
4d70: 20 72 65 67 42 61 73 65 2c 0a 20 20 69 6e 74 20   regBase,.  int 
4d80: 6e 42 61 73 65 0a 29 7b 0a 20 20 69 6e 74 20 6e  nBase.){.  int n
4d90: 4f 42 53 61 74 20 3d 20 70 53 6f 72 74 2d 3e 6e  OBSat = pSort->n
4da0: 4f 42 53 61 74 3b 0a 20 20 56 64 62 65 20 2a 76  OBSat;.  Vdbe *v
4db0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
4dc0: 3b 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 3d  ;.  int regOut =
4dd0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
4de0: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 70 44  .  if( pSort->pD
4df0: 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 20 29  eferredRowLoad )
4e00: 7b 0a 20 20 20 20 69 6e 6e 65 72 4c 6f 6f 70 4c  {.    innerLoopL
4e10: 6f 61 64 52 6f 77 28 70 50 61 72 73 65 2c 20 70  oadRow(pParse, p
4e20: 53 65 6c 65 63 74 2c 20 70 53 6f 72 74 2d 3e 70  Select, pSort->p
4e30: 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 29  DeferredRowLoad)
4e40: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
4e50: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4e60: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
4e70: 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73  ase+nOBSat, nBas
4e80: 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 4f 75 74  e-nOBSat, regOut
4e90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 4f  );.  return regO
4ea0: 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ut;.}../*.** Gen
4eb0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
4ec0: 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65  will push the re
4ed0: 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65 72  cord in register
4ee0: 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74 68 72  s regData.** thr
4ef0: 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e 44 61  ough regData+nDa
4f00: 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73 6f  ta-1 onto the so
4f10: 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rter..*/.static 
4f20: 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72  void pushOntoSor
4f30: 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ter(.  Parse *pP
4f40: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
4f50: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
4f60: 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53  */.  SortCtx *pS
4f70: 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 49  ort,        /* I
4f80: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
4f90: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
4fa0: 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ause */.  Select
4fb0: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
4fc0: 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45   /* The whole SE
4fd0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
4fe0: 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 2c  /.  int regData,
4ff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
5000: 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c  rst register hol
5010: 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20  ding data to be 
5020: 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  sorted */.  int 
5030: 72 65 67 4f 72 69 67 44 61 74 61 2c 20 20 20 20  regOrigData,    
5040: 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69     /* First regi
5050: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74  ster holding dat
5060: 61 20 62 65 66 6f 72 65 20 70 61 63 6b 69 6e 67  a before packing
5070: 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c   */.  int nData,
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5090: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
50a0: 74 73 20 69 6e 20 74 68 65 20 72 65 67 44 61 74  ts in the regDat
50b0: 61 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f 0a  a data array */.
50c0: 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67    int nPrefixReg
50d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20           /* No. 
50e0: 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f 20  of reg prior to 
50f0: 72 65 67 44 61 74 61 20 61 76 61 69 6c 61 62 6c  regData availabl
5100: 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b 0a  e for use */.){.
5110: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
5120: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65 72     /* Stmt under
5150: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
5160: 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28 28  .  int bSeq = ((
5170: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
5180: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
5190: 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69 6e  orter)==0);.  in
51a0: 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74 2d  t nExpr = pSort-
51b0: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
51c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
51d0: 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20 42  * No. of ORDER B
51e0: 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  Y terms */.  int
51f0: 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20 2b   nBase = nExpr +
5200: 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20 20   bSeq + nData;  
5210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5220: 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74 65   Fields in sorte
5230: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
5240: 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5270: 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74 65  * Regs for sorte
5280: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
5290: 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 30 3b  t regRecord = 0;
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
52c0: 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72 74  * Assembled sort
52d0: 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  er record */.  i
52e0: 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72  nt nOBSat = pSor
52f0: 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20 20  t->nOBSat;      
5300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5310: 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  /* ORDER BY term
5320: 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 69  s to skip */.  i
5330: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
5340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5350: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61    /* Opcode to a
5360: 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  dd sorter record
5370: 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20   to sorter */.  
5380: 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20 20 20  int iLimit;     
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53a0: 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f 75 6e     /* LIMIT coun
53b0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6b  ter */.  int iSk
53c0: 69 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ip = 0;         
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
53e0: 6e 64 20 6f 66 20 74 68 65 20 73 6f 72 74 65 72  nd of the sorter
53f0: 20 69 6e 73 65 72 74 20 6c 6f 6f 70 20 2a 2f 0a   insert loop */.
5400: 0a 20 20 61 73 73 65 72 74 28 20 62 53 65 71 3d  .  assert( bSeq=
5410: 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b  =0 || bSeq==1 );
5420: 0a 0a 20 20 2f 2a 20 54 68 72 65 65 20 63 61 73  ..  /* Three cas
5430: 65 73 3a 0a 20 20 2a 2a 20 20 20 28 31 29 20 54  es:.  **   (1) T
5440: 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f  he data to be so
5450: 72 74 65 64 20 68 61 73 20 61 6c 72 65 61 64 79  rted has already
5460: 20 62 65 65 6e 20 70 61 63 6b 65 64 20 69 6e 74   been packed int
5470: 6f 20 61 20 52 65 63 6f 72 64 0a 20 20 2a 2a 20  o a Record.  ** 
5480: 20 20 20 20 20 20 62 79 20 61 20 70 72 69 6f 72        by a prior
5490: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 20   OP_MakeRecord. 
54a0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6e 44   In this case nD
54b0: 61 74 61 3d 3d 31 20 61 6e 64 20 72 65 67 44 61  ata==1 and regDa
54c0: 74 61 0a 20 20 2a 2a 20 20 20 20 20 20 20 77 69  ta.  **       wi
54d0: 6c 6c 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  ll be completely
54e0: 20 75 6e 72 65 6c 61 74 65 64 20 74 6f 20 72 65   unrelated to re
54f0: 67 4f 72 69 67 44 61 74 61 2e 0a 20 20 2a 2a 20  gOrigData..  ** 
5500: 20 20 28 32 29 20 41 6c 6c 20 6f 75 74 70 75 74    (2) All output
5510: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 69 6e 63   columns are inc
5520: 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 6f 72  luded in the sor
5530: 74 20 72 65 63 6f 72 64 2e 20 20 49 6e 20 74 68  t record.  In th
5540: 61 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 63 61  at.  **       ca
5550: 73 65 20 72 65 67 44 61 74 61 3d 3d 72 65 67 4f  se regData==regO
5560: 72 69 67 44 61 74 61 2e 0a 20 20 2a 2a 20 20 20  rigData..  **   
5570: 28 33 29 20 53 6f 6d 65 20 6f 75 74 70 75 74 20  (3) Some output 
5580: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6f 6d 69 74  columns are omit
5590: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72  ted from the sor
55a0: 74 20 72 65 63 6f 72 64 20 64 75 65 20 74 6f 0a  t record due to.
55b0: 20 20 2a 2a 20 20 20 20 20 20 20 74 68 65 20 53    **       the S
55c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
55d0: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 20 6f 70  TER_REFERENCE op
55e0: 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 6f 72 20 64  timization, or d
55f0: 75 65 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 20  ue to the.  **  
5600: 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c       SQLITE_ECEL
5610: 5f 4f 4d 49 54 52 45 46 20 6f 70 74 69 6d 69 7a  _OMITREF optimiz
5620: 61 74 69 6f 6e 2c 20 6f 72 20 64 75 65 20 74 6f  ation, or due to
5630: 20 74 68 65 20 0a 20 20 2a 2a 20 20 20 20 20 20   the .  **      
5640: 20 53 6f 72 74 43 74 78 2e 70 44 65 66 65 72 72   SortCtx.pDeferr
5650: 65 64 52 6f 77 4c 6f 61 64 20 6f 70 74 69 6d 69  edRowLoad optimi
5660: 61 74 69 6f 6e 2e 20 20 49 6e 20 61 6e 79 20 6f  ation.  In any o
5670: 66 20 74 68 65 73 65 20 63 61 73 65 73 0a 20 20  f these cases.  
5680: 2a 2a 20 20 20 20 20 20 20 72 65 67 4f 72 69 67  **       regOrig
5690: 44 61 74 61 20 69 73 20 30 20 74 6f 20 70 72 65  Data is 0 to pre
56a0: 76 65 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e  vent this routin
56b0: 65 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  e from trying to
56c0: 20 63 6f 70 79 0a 20 20 2a 2a 20 20 20 20 20 20   copy.  **      
56d0: 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 69 67   values that mig
56e0: 68 74 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74  ht not yet exist
56f0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
5700: 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72 65 67   nData==1 || reg
5710: 44 61 74 61 3d 3d 72 65 67 4f 72 69 67 44 61 74  Data==regOrigDat
5720: 61 20 7c 7c 20 72 65 67 4f 72 69 67 44 61 74 61  a || regOrigData
5730: 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 6e 50  ==0 );..  if( nP
5740: 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20 20 20  refixReg ){.    
5750: 61 73 73 65 72 74 28 20 6e 50 72 65 66 69 78 52  assert( nPrefixR
5760: 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20 29  eg==nExpr+bSeq )
5770: 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  ;.    regBase = 
5780: 72 65 67 44 61 74 61 20 2d 20 6e 50 72 65 66 69  regData - nPrefi
5790: 78 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  xReg;.  }else{. 
57a0: 20 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61     regBase = pPa
57b0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
57c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
57d0: 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a 20 20  += nBase;.  }.  
57e0: 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 2d  assert( pSelect-
57f0: 3e 69 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70  >iOffset==0 || p
5800: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 21 3d  Select->iLimit!=
5810: 30 20 29 3b 0a 20 20 69 4c 69 6d 69 74 20 3d 20  0 );.  iLimit = 
5820: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
5830: 20 3f 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   ? pSelect->iOff
5840: 73 65 74 2b 31 20 3a 20 70 53 65 6c 65 63 74 2d  set+1 : pSelect-
5850: 3e 69 4c 69 6d 69 74 3b 0a 20 20 70 53 6f 72 74  >iLimit;.  pSort
5860: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d 20 73 71  ->labelDone = sq
5870: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
5880: 65 6c 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  el(v);.  sqlite3
5890: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
58a0: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e  (pParse, pSort->
58b0: 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61 73  pOrderBy, regBas
58c0: 65 2c 20 72 65 67 4f 72 69 67 44 61 74 61 2c 0a  e, regOrigData,.
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58e0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
58f0: 5f 45 43 45 4c 5f 44 55 50 20 7c 20 28 72 65 67  _ECEL_DUP | (reg
5900: 4f 72 69 67 44 61 74 61 3f 20 53 51 4c 49 54 45  OrigData? SQLITE
5910: 5f 45 43 45 4c 5f 52 45 46 20 3a 20 30 29 29 3b  _ECEL_REF : 0));
5920: 0a 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20  .  if( bSeq ){. 
5930: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5940: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp2(v, OP_Seque
5950: 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  nce, pSort->iECu
5960: 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e 45  rsor, regBase+nE
5970: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  xpr);.  }.  if( 
5980: 6e 50 72 65 66 69 78 52 65 67 3d 3d 30 20 26 26  nPrefixReg==0 &&
5990: 20 6e 44 61 74 61 3e 30 20 29 7b 0a 20 20 20 20   nData>0 ){.    
59a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
59b0: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 44  ove(pParse, regD
59c0: 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78  ata, regBase+nEx
59d0: 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61 29 3b  pr+bSeq, nData);
59e0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 42 53 61  .  }.  if( nOBSa
59f0: 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  t>0 ){.    int r
5a00: 65 67 50 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20  egPrevKey;   /* 
5a10: 54 68 65 20 66 69 72 73 74 20 6e 4f 42 53 61 74  The first nOBSat
5a20: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
5a30: 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a  previous row */.
5a40: 20 20 20 20 69 6e 74 20 61 64 64 72 46 69 72 73      int addrFirs
5a50: 74 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  t;    /* Address
5a60: 20 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74   of the OP_IfNot
5a70: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69   opcode */.    i
5a80: 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20 20 20 20  nt addrJmp;     
5a90: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
5aa0: 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64  he OP_Jump opcod
5ab0: 65 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f 70 20  e */.    VdbeOp 
5ac0: 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70  *pOp;      /* Op
5ad0: 63 6f 64 65 20 74 68 61 74 20 6f 70 65 6e 73 20  code that opens 
5ae0: 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20  the sorter */.  
5af0: 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20    int nKey;     
5b00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5b10: 20 73 6f 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c   sorting key col
5b20: 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  umns, including 
5b30: 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20  OP_Sequence */. 
5b40: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b     KeyInfo *pKI;
5b50: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
5b60: 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20   KeyInfo on the 
5b70: 73 6f 72 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  sorter table */.
5b80: 0a 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d  .    regRecord =
5b90: 20 6d 61 6b 65 53 6f 72 74 65 72 52 65 63 6f 72   makeSorterRecor
5ba0: 64 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c  d(pParse, pSort,
5bb0: 20 70 53 65 6c 65 63 74 2c 20 72 65 67 42 61 73   pSelect, regBas
5bc0: 65 2c 20 6e 42 61 73 65 29 3b 0a 20 20 20 20 72  e, nBase);.    r
5bd0: 65 67 50 72 65 76 4b 65 79 20 3d 20 70 50 61 72  egPrevKey = pPar
5be0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
5bf0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
5c00: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
5c10: 20 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20     nKey = nExpr 
5c20: 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20  - pSort->nOBSat 
5c30: 2b 20 62 53 65 71 3b 0a 20 20 20 20 69 66 28 20  + bSeq;.    if( 
5c40: 62 53 65 71 20 29 7b 0a 20 20 20 20 20 20 61 64  bSeq ){.      ad
5c50: 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
5c60: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5c70: 50 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61 73 65  P_IfNot, regBase
5c80: 2b 6e 45 78 70 72 29 3b 20 0a 20 20 20 20 7d 65  +nExpr); .    }e
5c90: 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 46  lse{.      addrF
5ca0: 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
5cb0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53  beAddOp1(v, OP_S
5cc0: 65 71 75 65 6e 63 65 54 65 73 74 2c 20 70 53 6f  equenceTest, pSo
5cd0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  rt->iECursor);. 
5ce0: 20 20 20 7d 0a 20 20 20 20 56 64 62 65 43 6f 76     }.    VdbeCov
5cf0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
5d00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5d10: 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
5d20: 65 67 50 72 65 76 4b 65 79 2c 20 72 65 67 42 61  egPrevKey, regBa
5d30: 73 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  se, pSort->nOBSa
5d40: 74 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71  t);.    pOp = sq
5d50: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
5d60: 2c 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72  , pSort->addrSor
5d70: 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  tIndex);.    if(
5d80: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
5d90: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
5da0: 72 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20  rn;.    pOp->p2 
5db0: 3d 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a  = nKey + nData;.
5dc0: 20 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70      pKI = pOp->p
5dd0: 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
5de0: 6d 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72  memset(pKI->aSor
5df0: 74 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e  tOrder, 0, pKI->
5e00: 6e 4b 65 79 46 69 65 6c 64 29 3b 20 2f 2a 20 4d  nKeyField); /* M
5e10: 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 74 65 73  akes OP_Jump tes
5e20: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c  table */.    sql
5e30: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
5e40: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70  (v, -1, (char*)p
5e50: 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  KI, P4_KEYINFO);
5e60: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
5e70: 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 3e 20  KI->nAllField > 
5e80: 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64 2b 32  pKI->nKeyField+2
5e90: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   );.    pOp->p4.
5ea0: 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
5eb0: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
5ec0: 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f  Parse, pSort->pO
5ed0: 72 64 65 72 42 79 2c 20 6e 4f 42 53 61 74 2c 0a  rderBy, nOBSat,.
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f00: 20 20 20 20 20 20 20 20 20 20 20 70 4b 49 2d 3e             pKI->
5f10: 6e 41 6c 6c 46 69 65 6c 64 2d 70 4b 49 2d 3e 6e  nAllField-pKI->n
5f20: 4b 65 79 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20  KeyField-1);.   
5f30: 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74   addrJmp = sqlit
5f40: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
5f50: 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
5f60: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5f70: 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b  P_Jump, addrJmp+
5f80: 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29  1, 0, addrJmp+1)
5f90: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
5fa0: 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61  );.    pSort->la
5fb0: 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74  belBkOut = sqlit
5fc0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
5fd0: 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72  v);.    pSort->r
5fe0: 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
5ff0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
6000: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6010: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53  (v, OP_Gosub, pS
6020: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  ort->regReturn, 
6030: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
6040: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
6050: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
6060: 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f  ResetSorter, pSo
6070: 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  rt->iECursor);. 
6080: 20 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29 7b     if( iLimit ){
6090: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
60a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
60b0: 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 70 53  fNot, iLimit, pS
60c0: 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b  ort->labelDone);
60d0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
60e0: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
60f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
6100: 70 48 65 72 65 28 76 2c 20 61 64 64 72 46 69 72  pHere(v, addrFir
6110: 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
6120: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
6130: 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65  rse, regBase, re
6140: 67 50 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d  gPrevKey, pSort-
6150: 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71  >nOBSat);.    sq
6160: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
6170: 65 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20  e(v, addrJmp);. 
6180: 20 7d 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 20   }.  if( iLimit 
6190: 29 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  ){.    /* At thi
61a0: 73 20 70 6f 69 6e 74 20 74 68 65 20 76 61 6c 75  s point the valu
61b0: 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  es for the new s
61c0: 6f 72 74 65 72 20 65 6e 74 72 79 20 61 72 65 20  orter entry are 
61d0: 73 74 6f 72 65 64 0a 20 20 20 20 2a 2a 20 69 6e  stored.    ** in
61e0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
61f0: 69 73 74 65 72 73 2e 20 54 68 65 79 20 6e 65 65  isters. They nee
6200: 64 20 74 6f 20 62 65 20 63 6f 6d 70 6f 73 65 64  d to be composed
6210: 20 69 6e 74 6f 20 61 20 72 65 63 6f 72 64 0a 20   into a record. 
6220: 20 20 20 2a 2a 20 61 6e 64 20 69 6e 73 65 72 74     ** and insert
6230: 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ed into the sort
6240: 65 72 20 69 66 20 65 69 74 68 65 72 20 28 61 29  er if either (a)
6250: 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65   there are curre
6260: 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6c 65 73 73  ntly.    ** less
6270: 20 74 68 61 6e 20 4c 49 4d 49 54 2b 4f 46 46 53   than LIMIT+OFFS
6280: 45 54 20 69 74 65 6d 73 20 6f 72 20 28 62 29 20  ET items or (b) 
6290: 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 69  the new record i
62a0: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
62b0: 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 72 67 65      ** the large
62c0: 73 74 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e  st record curren
62d0: 74 6c 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65  tly in the sorte
62e0: 72 2e 20 49 66 20 28 62 29 20 69 73 20 74 72 75  r. If (b) is tru
62f0: 65 20 61 6e 64 20 74 68 65 72 65 0a 20 20 20 20  e and there.    
6300: 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20 4c  ** are already L
6310: 49 4d 49 54 2b 4f 46 46 53 45 54 20 69 74 65 6d  IMIT+OFFSET item
6320: 73 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2c  s in the sorter,
6330: 20 64 65 6c 65 74 65 20 74 68 65 20 6c 61 72 67   delete the larg
6340: 65 73 74 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79  est.    ** entry
6350: 20 62 65 66 6f 72 65 20 69 6e 73 65 72 74 69 6e   before insertin
6360: 67 20 74 68 65 20 6e 65 77 20 6f 6e 65 2e 20 54  g the new one. T
6370: 68 69 73 20 77 61 79 20 74 68 65 72 65 20 61 72  his way there ar
6380: 65 20 6e 65 76 65 72 20 6d 6f 72 65 20 0a 20 20  e never more .  
6390: 20 20 2a 2a 20 74 68 61 6e 20 4c 49 4d 49 54 2b    ** than LIMIT+
63a0: 4f 46 46 53 45 54 20 69 74 65 6d 73 20 69 6e 20  OFFSET items in 
63b0: 74 68 65 20 73 6f 72 74 65 72 2e 0a 20 20 20 20  the sorter..    
63c0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
63d0: 20 6e 65 77 20 72 65 63 6f 72 64 20 64 6f 65 73   new record does
63e0: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
63f0: 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
6400: 65 20 73 6f 72 74 65 72 2c 0a 20 20 20 20 2a 2a  e sorter,.    **
6410: 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78   jump to the nex
6420: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
6430: 68 65 20 6c 6f 6f 70 2e 20 4f 72 2c 20 69 66 20  he loop. Or, if 
6440: 74 68 65 0a 20 20 20 20 2a 2a 20 70 53 6f 72 74  the.    ** pSort
6450: 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ->bOrderedInnerL
6460: 6f 6f 70 20 66 6c 61 67 20 69 73 20 73 65 74 20  oop flag is set 
6470: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
6480: 20 74 68 65 20 69 6e 6e 65 72 0a 20 20 20 20 2a   the inner.    *
6490: 2a 20 6c 6f 6f 70 20 64 65 6c 69 76 65 72 73 20  * loop delivers 
64a0: 69 74 65 6d 73 20 69 6e 20 73 6f 72 74 65 64 20  items in sorted 
64b0: 6f 72 64 65 72 2c 20 6a 75 6d 70 20 74 6f 20 74  order, jump to t
64c0: 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
64d0: 6e 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  n.    ** of the 
64e0: 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 20 20  outer loop..    
64f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72 20  */.    int iCsr 
6500: 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  = pSort->iECurso
6510: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  r;.    sqlite3Vd
6520: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6530: 66 4e 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74  fNotZero, iLimit
6540: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
6550: 72 65 6e 74 41 64 64 72 28 76 29 2b 34 29 3b 0a  rentAddr(v)+4);.
6560: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
6570: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
6580: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6590: 5f 4c 61 73 74 2c 20 69 43 73 72 2c 20 30 29 3b  _Last, iCsr, 0);
65a0: 0a 20 20 20 20 69 53 6b 69 70 20 3d 20 73 71 6c  .    iSkip = sql
65b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
65c0: 74 28 76 2c 20 4f 50 5f 49 64 78 4c 45 2c 0a 20  t(v, OP_IdxLE,. 
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65f0: 69 43 73 72 2c 20 30 2c 20 72 65 67 42 61 73 65  iCsr, 0, regBase
6600: 2b 6e 4f 42 53 61 74 2c 20 6e 45 78 70 72 2d 6e  +nOBSat, nExpr-n
6610: 4f 42 53 61 74 29 3b 0a 20 20 20 20 56 64 62 65  OBSat);.    Vdbe
6620: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
6630: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6640: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
6650: 20 69 43 73 72 29 3b 0a 20 20 7d 0a 20 20 69 66   iCsr);.  }.  if
6660: 28 20 72 65 67 52 65 63 6f 72 64 3d 3d 30 20 29  ( regRecord==0 )
6670: 7b 0a 20 20 20 20 72 65 67 52 65 63 6f 72 64 20  {.    regRecord 
6680: 3d 20 6d 61 6b 65 53 6f 72 74 65 72 52 65 63 6f  = makeSorterReco
6690: 72 64 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  rd(pParse, pSort
66a0: 2c 20 70 53 65 6c 65 63 74 2c 20 72 65 67 42 61  , pSelect, regBa
66b0: 73 65 2c 20 6e 42 61 73 65 29 3b 0a 20 20 7d 0a  se, nBase);.  }.
66c0: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72    if( pSort->sor
66d0: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
66e0: 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  G_UseSorter ){. 
66f0: 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65     op = OP_Sorte
6700: 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65  rInsert;.  }else
6710: 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64  {.    op = OP_Id
6720: 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73  xInsert;.  }.  s
6730: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
6740: 49 6e 74 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74  Int(v, op, pSort
6750: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52  ->iECursor, regR
6760: 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ecord,.         
6770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
6780: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
6790: 61 73 65 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 69  ase-nOBSat);.  i
67a0: 66 28 20 69 53 6b 69 70 20 29 7b 0a 20 20 20 20  f( iSkip ){.    
67b0: 61 73 73 65 72 74 28 20 70 53 6f 72 74 2d 3e 62  assert( pSort->b
67c0: 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70  OrderedInnerLoop
67d0: 3d 3d 30 20 7c 7c 20 70 53 6f 72 74 2d 3e 62 4f  ==0 || pSort->bO
67e0: 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3d  rderedInnerLoop=
67f0: 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =1 );.    sqlite
6800: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
6810: 20 69 53 6b 69 70 2c 0a 20 20 20 20 20 20 20 20   iSkip,.        
6820: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
6830: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 70 53 6f  entAddr(v) + pSo
6840: 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65  rt->bOrderedInne
6850: 72 4c 6f 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  rLoop);.  }.}../
6860: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f  *.** Add code to
6870: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f   implement the O
6880: 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20  FFSET.*/.static 
6890: 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28  void codeOffset(
68a0: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
68b0: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
68c0: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
68d0: 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66  VM */.  int iOff
68e0: 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65 67  set,      /* Reg
68f0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  ister holding th
6900: 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72  e offset counter
6910: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
6920: 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  nue     /* Jump 
6930: 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65  here to skip the
6940: 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20   current record 
6950: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66 66  */.){.  if( iOff
6960: 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  set>0 ){.    sql
6970: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6980: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66  , OP_IfPos, iOff
6990: 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  set, iContinue, 
69a0: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
69b0: 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  (v);.    VdbeCom
69c0: 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54  ment((v, "OFFSET
69d0: 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  "));.  }.}../*.*
69e0: 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20  * Add code that 
69f0: 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61  will check to ma
6a00: 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65  ke sure the N re
6a10: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
6a20: 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d   at iMem.** form
6a30: 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72   a distinct entr
6a40: 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f  y.  iTab is a so
6a50: 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
6a60: 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c   holds previousl
6a70: 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e  y.** seen combin
6a80: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20  ations of the N 
6a90: 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65  values.  A new e
6aa0: 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20  ntry is made in 
6ab0: 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63  iTab.** if the c
6ac0: 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20  urrent N values 
6ad0: 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41  are new..**.** A
6ae0: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70   jump to addrRep
6af0: 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20  eat is made and 
6b00: 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61  the N+1 values a
6b10: 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  re popped from t
6b20: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74  he.** stack if t
6b30: 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74  he top N element
6b40: 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e  s are not distin
6b50: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
6b60: 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28  id codeDistinct(
6b70: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6b80: 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
6b90: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
6ba0: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
6bb0: 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20    int iTab,     
6bc0: 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e       /* A sortin
6bd0: 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20  g index used to 
6be0: 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63  test for distinc
6bf0: 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61  tness */.  int a
6c00: 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a  ddrRepeat,    /*
6c10: 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66   Jump to here if
6c20: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f   not distinct */
6c30: 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
6c40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6c50: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  of elements */. 
6c60: 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20   int iMem       
6c70: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65      /* First ele
6c80: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  ment */.){.  Vdb
6c90: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a  e *v;.  int r1;.
6ca0: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
6cb0: 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c  Vdbe;.  r1 = sql
6cc0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
6cd0: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
6ce0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
6cf0: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62  , OP_Found, iTab
6d00: 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d  , addrRepeat, iM
6d10: 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76 65  em, N); VdbeCove
6d20: 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
6d30: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6d40: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69  OP_MakeRecord, i
6d50: 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73  Mem, N, r1);.  s
6d60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
6d70: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
6d80: 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c 20 69  ert, iTab, r1, i
6d90: 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74  Mem, N);.  sqlit
6da0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
6db0: 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
6dc0: 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74  RESULT);.  sqlit
6dd0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
6de0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
6df0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6e00: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
6e10: 45 52 45 4e 43 45 53 0a 2f 2a 0a 2a 2a 20 54 68  ERENCES./*.** Th
6e20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
6e30: 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
6e40: 20 69 6e 6e 65 72 2d 6c 6f 6f 70 20 67 65 6e 65   inner-loop gene
6e50: 72 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c  ration for a SEL
6e60: 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
6e70: 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
6e80: 59 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 70  Y that is not op
6e90: 74 69 6d 69 7a 65 64 20 62 79 20 61 6e 20 69 6e  timized by an in
6ea0: 64 65 78 2e 20 49 74 20 0a 2a 2a 20 64 65 74 65  dex. It .** dete
6eb0: 72 6d 69 6e 65 73 20 74 68 65 20 65 78 70 72 65  rmines the expre
6ec0: 73 73 69 6f 6e 73 2c 20 69 66 20 61 6e 79 2c 20  ssions, if any, 
6ed0: 74 68 61 74 20 74 68 65 20 73 6f 72 74 65 72 2d  that the sorter-
6ee0: 72 65 66 65 72 65 6e 63 65 20 0a 2a 2a 20 6f 70  reference .** op
6ef0: 74 69 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c  timization shoul
6f00: 64 20 62 65 20 75 73 65 64 20 66 6f 72 2e 20 54  d be used for. T
6f10: 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65  he sorter-refere
6f20: 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  nce optimization
6f30: 0a 2a 2a 20 69 73 20 75 73 65 64 20 66 6f 72 20  .** is used for 
6f40: 53 45 4c 45 43 54 20 71 75 65 72 69 65 73 20 6c  SELECT queries l
6f50: 69 6b 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ike:.**.**   SEL
6f60: 45 43 54 20 61 2c 20 62 69 67 62 6c 6f 62 20 46  ECT a, bigblob F
6f70: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
6f80: 61 20 4c 49 4d 49 54 20 31 30 0a 2a 2a 0a 2a 2a  a LIMIT 10.**.**
6f90: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
6fa0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
6fb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 22 62 69 67   expression "big
6fc0: 62 6c 6f 62 22 2c 20 74 68 65 6e 20 69 6e 73 74  blob", then inst
6fd0: 65 61 64 20 6f 66 0a 2a 2a 20 73 74 6f 72 69 6e  ead of.** storin
6fe0: 67 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  g values read fr
6ff0: 6f 6d 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  om that column i
7000: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 72 65 63  n the sorter rec
7010: 6f 72 64 73 2c 20 74 68 65 20 50 4b 20 6f 66 0a  ords, the PK of.
7020: 2a 2a 20 74 68 65 20 72 6f 77 20 66 72 6f 6d 20  ** the row from 
7030: 74 61 62 6c 65 20 74 31 20 69 73 20 73 74 6f 72  table t1 is stor
7040: 65 64 20 69 6e 73 74 65 61 64 2e 20 54 68 65 6e  ed instead. Then
7050: 2c 20 61 73 20 72 65 63 6f 72 64 73 20 61 72 65  , as records are
7060: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 0a   extracted from.
7070: 2a 2a 20 74 68 65 20 73 6f 72 74 65 72 20 74 6f  ** the sorter to
7080: 20 72 65 74 75 72 6e 20 74 6f 20 74 68 65 20 75   return to the u
7090: 73 65 72 2c 20 74 68 65 20 72 65 71 75 69 72 65  ser, the require
70a0: 64 20 76 61 6c 75 65 20 6f 66 20 62 69 67 62 6c  d value of bigbl
70b0: 6f 62 20 69 73 0a 2a 2a 20 72 65 74 72 69 65 76  ob is.** retriev
70c0: 65 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  ed directly from
70d0: 20 74 61 62 6c 65 20 74 31 2e 20 49 66 20 74 68   table t1. If th
70e0: 65 20 76 61 6c 75 65 73 20 61 72 65 20 76 65 72  e values are ver
70f0: 79 20 6c 61 72 67 65 2c 20 74 68 69 73 20 0a 2a  y large, this .*
7100: 2a 20 63 61 6e 20 62 65 20 6d 6f 72 65 20 65 66  * can be more ef
7110: 66 69 63 69 65 6e 74 20 74 68 61 6e 20 73 74 6f  ficient than sto
7120: 72 69 6e 67 20 74 68 65 6d 20 64 69 72 65 63 74  ring them direct
7130: 6c 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72  ly in the sorter
7140: 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20   records..**.** 
7150: 54 68 65 20 45 78 70 72 4c 69 73 74 5f 69 74 65  The ExprList_ite
7160: 6d 2e 62 53 6f 72 74 65 72 52 65 66 20 66 6c 61  m.bSorterRef fla
7170: 67 20 69 73 20 73 65 74 20 66 6f 72 20 65 61 63  g is set for eac
7180: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
7190: 70 45 4c 69 73 74 20 0a 2a 2a 20 66 6f 72 20 77  pEList .** for w
71a0: 68 69 63 68 20 74 68 65 20 73 6f 72 74 65 72 2d  hich the sorter-
71b0: 72 65 66 65 72 65 6e 63 65 20 6f 70 74 69 6d 69  reference optimi
71c0: 7a 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  zation should be
71d0: 20 65 6e 61 62 6c 65 64 2e 20 0a 2a 2a 20 41 64   enabled. .** Ad
71e0: 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20  ditionally, the 
71f0: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 5d 20  pSort->aDefer[] 
7200: 61 72 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74  array is populat
7210: 65 64 20 77 69 74 68 20 65 6e 74 72 69 65 73 0a  ed with entries.
7220: 2a 2a 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  ** for all curso
7230: 72 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  rs required to e
7240: 76 61 6c 75 61 74 65 20 61 6c 6c 20 73 65 6c 65  valuate all sele
7250: 63 74 65 64 20 65 78 70 72 65 73 73 69 6f 6e 73  cted expressions
7260: 2e 20 46 69 6e 61 6c 6c 79 2e 0a 2a 2a 20 6f 75  . Finally..** ou
7270: 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 28 2a  tput variable (*
7280: 70 70 45 78 74 72 61 29 20 69 73 20 73 65 74 20  ppExtra) is set 
7290: 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  to an expression
72a0: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
72b0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
72c0: 66 6f 72 20 61 6c 6c 20 65 78 74 72 61 20 50 4b  for all extra PK
72d0: 20 76 61 6c 75 65 73 20 74 68 61 74 20 73 68 6f   values that sho
72e0: 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e  uld be stored in
72f0: 20 74 68 65 0a 2a 2a 20 73 6f 72 74 65 72 20 72   the.** sorter r
7300: 65 63 6f 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ecords..*/.stati
7310: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 45 78 70  c void selectExp
7320: 72 44 65 66 65 72 28 0a 20 20 50 61 72 73 65 20  rDefer(.  Parse 
7330: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
7340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61            /* Lea
7350: 76 65 20 61 6e 79 20 65 72 72 6f 72 20 68 65 72  ve any error her
7360: 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  e */.  SortCtx *
7370: 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 20  pSort,          
7380: 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72         /* Sorter
7390: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
73a0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
73c0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 73   Expressions des
73d0: 74 69 6e 65 64 20 66 6f 72 20 73 6f 72 74 65 72  tined for sorter
73e0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
73f0: 2a 70 70 45 78 74 72 61 20 20 20 20 20 20 20 20  *ppExtra        
7400: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
7410: 69 6f 6e 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ions to append t
7420: 6f 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  o sorter record 
7430: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
7440: 20 69 6e 74 20 6e 44 65 66 65 72 20 3d 20 30 3b   int nDefer = 0;
7450: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78  .  ExprList *pEx
7460: 74 72 61 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  tra = 0;.  for(i
7470: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
7480: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
7490: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
74a0: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 45  tem *pItem = &pE
74b0: 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
74c0: 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  if( pItem->u.x.i
74d0: 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 7b  OrderByCol==0 ){
74e0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
74f0: 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  pr = pItem->pExp
7500: 72 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  r;.      Table *
7510: 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
7520: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  ab;.      if( pE
7530: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
7540: 4d 4e 20 26 26 20 70 54 61 62 20 26 26 20 21 49  MN && pTab && !I
7550: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 0a 20  sVirtual(pTab). 
7560: 20 20 20 20 20 20 26 26 20 28 70 54 61 62 2d 3e        && (pTab->
7570: 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  aCol[pExpr->iCol
7580: 75 6d 6e 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20  umn].colFlags & 
7590: 43 4f 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52 45  COLFLAG_SORTERRE
75a0: 46 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  F).      ){.    
75b0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
75c0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 44     for(j=0; j<nD
75d0: 65 66 65 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  efer; j++){.    
75e0: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d        if( pSort-
75f0: 3e 61 44 65 66 65 72 5b 6a 5d 2e 69 43 73 72 3d  >aDefer[j].iCsr=
7600: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
7610: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7620: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  }.        if( j=
7630: 3d 6e 44 65 66 65 72 20 29 7b 0a 20 20 20 20 20  =nDefer ){.     
7640: 20 20 20 20 20 69 66 28 20 6e 44 65 66 65 72 3d       if( nDefer=
7650: 3d 41 72 72 61 79 53 69 7a 65 28 70 53 6f 72 74  =ArraySize(pSort
7660: 2d 3e 61 44 65 66 65 72 29 20 29 7b 0a 20 20 20  ->aDefer) ){.   
7670: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
7680: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  e;.          }el
7690: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
76a0: 69 6e 74 20 6e 4b 65 79 20 3d 20 31 3b 0a 20 20  int nKey = 1;.  
76b0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
76c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 64  .            Ind
76d0: 65 78 20 2a 70 50 6b 20 3d 20 30 3b 0a 20 20 20  ex *pPk = 0;.   
76e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61           if( !Ha
76f0: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
7710: 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
7720: 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
7730: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7740: 6e 4b 65 79 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79  nKey = pPk->nKey
7750: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
7760: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66   }.            f
7770: 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20  or(k=0; k<nKey; 
7780: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
7790: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
77a0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
77b0: 61 72 73 65 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c  arse, TK_COLUMN,
77c0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
77d0: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
77e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
77f0: 20 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 20 3d    pNew->iTable =
7800: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
7810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7820: 70 4e 65 77 2d 3e 70 54 61 62 20 3d 20 70 45 78  pNew->pTab = pEx
7830: 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
7840: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
7850: 69 43 6f 6c 75 6d 6e 20 3d 20 70 50 6b 20 3f 20  iColumn = pPk ? 
7860: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  pPk->aiColumn[k]
7870: 20 3a 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   : -1;.         
7880: 20 20 20 20 20 20 20 70 45 78 74 72 61 20 3d 20         pExtra = 
7890: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
78a0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 45  ppend(pParse, pE
78b0: 78 74 72 61 2c 20 70 4e 65 77 29 3b 0a 20 20 20  xtra, pNew);.   
78c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
78d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
78e0: 20 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44         pSort->aD
78f0: 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e 70 54 61  efer[nDefer].pTa
7900: 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
7910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 6f  .            pSo
7920: 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44 65 66 65  rt->aDefer[nDefe
7930: 72 5d 2e 69 43 73 72 20 3d 20 70 45 78 70 72 2d  r].iCsr = pExpr-
7940: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
7950: 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44 65 66       pSort->aDef
7960: 65 72 5b 6e 44 65 66 65 72 5d 2e 6e 4b 65 79 20  er[nDefer].nKey 
7970: 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  = nKey;.        
7980: 20 20 20 20 6e 44 65 66 65 72 2b 2b 3b 0a 20 20      nDefer++;.  
7990: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
79a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 49 74 65    }.        pIte
79b0: 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 20 3d 20  m->bSorterRef = 
79c0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
79d0: 0a 20 20 7d 0a 20 20 70 53 6f 72 74 2d 3e 6e 44  .  }.  pSort->nD
79e0: 65 66 65 72 20 3d 20 28 75 38 29 6e 44 65 66 65  efer = (u8)nDefe
79f0: 72 3b 0a 20 20 2a 70 70 45 78 74 72 61 20 3d 20  r;.  *ppExtra = 
7a00: 70 45 78 74 72 61 3b 0a 7d 0a 23 65 6e 64 69 66  pExtra;.}.#endif
7a10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
7a20: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
7a30: 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  he code for the 
7a40: 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e  inside of the in
7a50: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61  ner loop.** of a
7a60: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49   SELECT..**.** I
7a70: 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67 61  f srcTab is nega
7a80: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70  tive, then the p
7a90: 2d 3e 70 45 4c 69 73 74 20 65 78 70 72 65 73 73  ->pEList express
7aa0: 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c  ions.** are eval
7ab0: 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uated in order t
7ac0: 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66  o get the data f
7ad0: 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66  or this row.  If
7ae0: 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65   srcTab is.** ze
7af0: 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e  ro or more, then
7b00: 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20   data is pulled 
7b10: 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20  from srcTab and 
7b20: 70 2d 3e 70 45 4c 69 73 74 20 69 73 20 75 73 65  p->pEList is use
7b30: 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65  d only .** to ge
7b40: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
7b50: 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20  columns and the 
7b60: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
7b70: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
7b80: 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mn..*/.static vo
7b90: 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  id selectInnerLo
7ba0: 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  op(.  Parse *pPa
7bb0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
7bc0: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
7bd0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
7be0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
7bf0: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65   /* The complete
7c00: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
7c10: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
7c20: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
7c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
7c40: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
7c50: 73 20 74 61 62 6c 65 20 69 66 20 6e 6f 6e 2d 6e  s table if non-n
7c60: 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 53 6f 72  egative */.  Sor
7c70: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
7c80: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
7c90: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
7ca0: 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44 45   to process ORDE
7cb0: 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e  R BY */.  Distin
7cc0: 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63 74  ctCtx *pDistinct
7cd0: 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  , /* If not NULL
7ce0: 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  , info on how to
7cf0: 20 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e 43   process DISTINC
7d00: 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  T */.  SelectDes
7d10: 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
7d20: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
7d30: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
7d40: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
7d50: 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ue,          /* 
7d60: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
7d70: 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
7d80: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  row */.  int iBr
7d90: 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
7da0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
7db0: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
7dc0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  e inner loop */.
7dd0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
7de0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
7df0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73  int i;.  int has
7e00: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
7e10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
7e20: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
7e30: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
7e40: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
7e50: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20   pDest->eDest;  
7e60: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
7e70: 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f  se of results */
7e80: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
7e90: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f  Dest->iSDParm; /
7ea0: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
7eb0: 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74   to disposal met
7ec0: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  hod */.  int nRe
7ed0: 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  sultCol;        
7ee0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7ef0: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
7f00: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
7f10: 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  xReg = 0;       
7f20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
7f30: 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 62  xtra registers b
7f40: 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74 20  efore regResult 
7f50: 2a 2f 0a 20 20 52 6f 77 4c 6f 61 64 49 6e 66 6f  */.  RowLoadInfo
7f60: 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 20 20   sRowLoadInfo;  
7f70: 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 64 65 66   /* Info for def
7f80: 65 72 72 65 64 20 72 6f 77 20 6c 6f 61 64 69 6e  erred row loadin
7f90: 67 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 75 61 6c  g */..  /* Usual
7fa0: 6c 79 2c 20 72 65 67 52 65 73 75 6c 74 20 69 73  ly, regResult is
7fb0: 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
7fc0: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6d  in an array of m
7fd0: 65 6d 6f 72 79 20 63 65 6c 6c 73 0a 20 20 2a 2a  emory cells.  **
7fe0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
7ff0: 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 20 72  current result r
8000: 6f 77 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ow. In this case
8010: 20 72 65 67 4f 72 69 67 20 69 73 20 73 65 74 20   regOrig is set 
8020: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  to the.  ** same
8030: 20 76 61 6c 75 65 2e 20 48 6f 77 65 76 65 72 2c   value. However,
8040: 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   if the results 
8050: 61 72 65 20 62 65 69 6e 67 20 73 65 6e 74 20 74  are being sent t
8060: 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 20 74 68  o the sorter, th
8070: 65 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 66 6f  e.  ** values fo
8080: 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  r any expression
8090: 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20  s that are also 
80a0: 70 61 72 74 20 6f 66 20 74 68 65 20 73 6f 72 74  part of the sort
80b0: 2d 6b 65 79 20 61 72 65 20 6f 6d 69 74 74 65 64  -key are omitted
80c0: 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20  .  ** from this 
80d0: 61 72 72 61 79 2e 20 49 6e 20 74 68 69 73 20 63  array. In this c
80e0: 61 73 65 20 72 65 67 4f 72 69 67 20 69 73 20 73  ase regOrig is s
80f0: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 2a 2f 0a  et to zero.  */.
8100: 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b    int regResult;
8110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8120: 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79   Start of memory
8130: 20 68 6f 6c 64 69 6e 67 20 63 75 72 72 65 6e 74   holding current
8140: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
8150: 74 20 72 65 67 4f 72 69 67 3b 20 20 20 20 20 20  t regOrig;      
8160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
8170: 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c  rt of memory hol
8180: 64 69 6e 67 20 66 75 6c 6c 20 72 65 73 75 6c 74  ding full result
8190: 20 28 6f 72 20 30 29 20 2a 2f 0a 0a 20 20 61 73   (or 0) */..  as
81a0: 73 65 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73  sert( v );.  ass
81b0: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d  ert( p->pEList!=
81c0: 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e  0 );.  hasDistin
81d0: 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f  ct = pDistinct ?
81e0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63   pDistinct->eTnc
81f0: 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49  tType : WHERE_DI
8200: 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69  STINCT_NOOP;.  i
8210: 66 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72  f( pSort && pSor
8220: 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t->pOrderBy==0 )
8230: 20 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66   pSort = 0;.  if
8240: 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68  ( pSort==0 && !h
8250: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
8260: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69    assert( iConti
8270: 6e 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f  nue!=0 );.    co
8280: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
8290: 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75  Offset, iContinu
82a0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75  e);.  }..  /* Pu
82b0: 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ll the requested
82c0: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20   columns..  */. 
82d0: 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 2d   nResultCol = p-
82e0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
82f0: 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53  .  if( pDest->iS
8300: 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  dst==0 ){.    if
8310: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
8320: 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20 70 53   nPrefixReg = pS
8330: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  ort->pOrderBy->n
8340: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
8350: 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  !(pSort->sortFla
8360: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
8370: 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72 65 66  eSorter) ) nPref
8380: 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20 70  ixReg++;.      p
8390: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
83a0: 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20 20 7d  PrefixReg;.    }
83b0: 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73  .    pDest->iSds
83c0: 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  t = pParse->nMem
83d0: 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
83e0: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
83f0: 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ol;.  }else if( 
8400: 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52 65  pDest->iSdst+nRe
8410: 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73 65  sultCol > pParse
8420: 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f 2a  ->nMem ){.    /*
8430: 20 54 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f   This is an erro
8440: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74  r condition that
8450: 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f 72   can result, for
8460: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61   example, when a
8470: 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 6f   SELECT.    ** o
8480: 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  n the right-hand
8490: 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e 53 45   side of an INSE
84a0: 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65  RT contains more
84b0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
84c0: 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72  than.    ** ther
84d0: 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  e are columns in
84e0: 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
84f0: 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65 72 72  e left.  The err
8500: 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68  or will be caugh
8510: 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 70  t.    ** and rep
8520: 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20 42 75  orted later.  Bu
8530: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b  t we need to mak
8540: 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20 6d 65  e sure enough me
8550: 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65  mory is allocate
8560: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69  d.    ** to avoi
8570: 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f 75 73  d other spurious
8580: 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20 6d   errors in the m
8590: 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20  eantime. */.    
85a0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
85b0: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a  nResultCol;.  }.
85c0: 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
85d0: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 72   nResultCol;.  r
85e0: 65 67 4f 72 69 67 20 3d 20 72 65 67 52 65 73 75  egOrig = regResu
85f0: 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73  lt = pDest->iSds
8600: 74 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e  t;.  if( srcTab>
8610: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 ){.    for(i=
8620: 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b  0; i<nResultCol;
8630: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
8640: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8650: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63  , OP_Column, src
8660: 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c  Tab, i, regResul
8670: 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65  t+i);.      Vdbe
8680: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
8690: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
86a0: 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  ].zName));.    }
86b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65  .  }else if( eDe
86c0: 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29  st!=SRT_Exists )
86d0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
86e0: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
86f0: 46 45 52 45 4e 43 45 53 0a 20 20 20 20 45 78 70  FERENCES.    Exp
8700: 72 4c 69 73 74 20 2a 70 45 78 74 72 61 20 3d 20  rList *pExtra = 
8710: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a  0;.#endif.    /*
8720: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
8730: 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53  ion is an EXISTS
8740: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
8750: 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20  , the actual.   
8760: 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72   ** values retur
8770: 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
8780: 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72  T are not requir
8790: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ed..    */.    u
87a0: 38 20 65 63 65 6c 46 6c 61 67 73 3b 20 20 20 20  8 ecelFlags;    
87b0: 2f 2a 20 22 65 63 65 6c 22 20 69 73 20 61 6e 20  /* "ecel" is an 
87c0: 61 62 62 72 65 76 69 61 74 69 6f 6e 20 6f 66 20  abbreviation of 
87d0: 22 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  "ExprCodeExprLis
87e0: 74 22 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69  t" */.    ExprLi
87f0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
8800: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d  if( eDest==SRT_M
8810: 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
8820: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
8830: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
8840: 29 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61  ){.      ecelFla
8850: 67 73 20 3d 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs = SQLITE_ECEL
8860: 5f 44 55 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  _DUP;.    }else{
8870: 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73  .      ecelFlags
8880: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
8890: 69 66 28 20 70 53 6f 72 74 20 26 26 20 68 61 73  if( pSort && has
88a0: 44 69 73 74 69 6e 63 74 3d 3d 30 20 26 26 20 65  Distinct==0 && e
88b0: 44 65 73 74 21 3d 53 52 54 5f 45 70 68 65 6d 54  Dest!=SRT_EphemT
88c0: 61 62 20 26 26 20 65 44 65 73 74 21 3d 53 52 54  ab && eDest!=SRT
88d0: 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  _Table ){.      
88e0: 2f 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  /* For each expr
88f0: 65 73 73 69 6f 6e 20 69 6e 20 70 2d 3e 70 45 4c  ession in p->pEL
8900: 69 73 74 20 74 68 61 74 20 69 73 20 61 20 63 6f  ist that is a co
8910: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
8920: 69 6f 6e 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ion in.      ** 
8930: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
8940: 75 73 65 20 28 70 53 6f 72 74 2d 3e 70 4f 72 64  use (pSort->pOrd
8950: 65 72 42 79 29 2c 20 73 65 74 20 74 68 65 20 61  erBy), set the a
8960: 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20 20  ssociated .     
8970: 20 2a 2a 20 69 4f 72 64 65 72 42 79 43 6f 6c 20   ** iOrderByCol 
8980: 76 61 6c 75 65 20 74 6f 20 6f 6e 65 20 6d 6f 72  value to one mor
8990: 65 20 74 68 61 6e 20 74 68 65 20 69 6e 64 65 78  e than the index
89a0: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
89b0: 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65   .      ** expre
89c0: 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 65  ssion within the
89d0: 20 73 6f 72 74 2d 6b 65 79 20 74 68 61 74 20 70   sort-key that p
89e0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20  ushOntoSorter() 
89f0: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20  will generate.. 
8a00: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 61 6c 6c       ** This all
8a10: 6f 77 73 20 74 68 65 20 70 2d 3e 70 45 4c 69 73  ows the p->pELis
8a20: 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 6f 6d  t field to be om
8a30: 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  itted from the s
8a40: 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a 20 20  orted record,.  
8a50: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 73 70      ** saving sp
8a60: 61 63 65 20 61 6e 64 20 43 50 55 20 63 79 63 6c  ace and CPU cycl
8a70: 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65 63  es.  */.      ec
8a80: 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49  elFlags |= (SQLI
8a90: 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 7c  TE_ECEL_OMITREF|
8aa0: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29  SQLITE_ECEL_REF)
8ab0: 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  ;..      for(i=p
8ac0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69 3c  Sort->nOBSat; i<
8ad0: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d  pSort->pOrderBy-
8ae0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
8af0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
8b00: 20 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70 53       if( (j = pS
8b10: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ort->pOrderBy->a
8b20: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
8b30: 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  Col)>0 ){.      
8b40: 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61      p->pEList->a
8b50: 5b 6a 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  [j-1].u.x.iOrder
8b60: 42 79 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f 72  ByCol = i+1-pSor
8b70: 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 20  t->nOBSat;.     
8b80: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
8b90: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
8ba0: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
8bb0: 43 45 53 0a 20 20 20 20 20 20 73 65 6c 65 63 74  CES.      select
8bc0: 45 78 70 72 44 65 66 65 72 28 70 50 61 72 73 65  ExprDefer(pParse
8bd0: 2c 20 70 53 6f 72 74 2c 20 70 2d 3e 70 45 4c 69  , pSort, p->pELi
8be0: 73 74 2c 20 26 70 45 78 74 72 61 29 3b 0a 20 20  st, &pExtra);.  
8bf0: 20 20 20 20 69 66 28 20 70 45 78 74 72 61 20 26      if( pExtra &
8c00: 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  & pParse->db->ma
8c10: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
8c20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
8c30: 68 65 72 65 20 61 72 65 20 61 6e 79 20 65 78 74  here are any ext
8c40: 72 61 20 50 4b 20 63 6f 6c 75 6d 6e 73 20 74 6f  ra PK columns to
8c50: 20 61 64 64 20 74 6f 20 74 68 65 20 73 6f 72 74   add to the sort
8c60: 65 72 20 72 65 63 6f 72 64 73 2c 0a 20 20 20 20  er records,.    
8c70: 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20      ** allocate 
8c80: 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 63 65 6c  extra memory cel
8c90: 6c 73 20 61 6e 64 20 61 64 6a 75 73 74 20 74 68  ls and adjust th
8ca0: 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  e OpenEphemeral 
8cb0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 74  .        ** inst
8cc0: 72 75 63 74 69 6f 6e 20 74 6f 20 61 63 63 6f 75  ruction to accou
8cd0: 6e 74 20 66 6f 72 20 74 68 65 20 6c 61 72 67 65  nt for the large
8ce0: 72 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  r records. This 
8cf0: 69 73 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20 20  is only.        
8d00: 2a 2a 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ** required if t
8d10: 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
8d20: 6d 6f 72 65 20 57 49 54 48 4f 55 54 20 52 4f 57  more WITHOUT ROW
8d30: 49 44 20 74 61 62 6c 65 73 20 77 69 74 68 0a 20  ID tables with. 
8d40: 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6f 73         ** compos
8d50: 69 74 65 20 70 72 69 6d 61 72 79 20 6b 65 79 73  ite primary keys
8d60: 20 69 6e 20 74 68 65 20 53 6f 72 74 43 74 78 2e   in the SortCtx.
8d70: 61 44 65 66 65 72 5b 5d 20 61 72 72 61 79 2e 20  aDefer[] array. 
8d80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 56 64 62 65   */.        Vdbe
8d90: 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65  Op *pOp = sqlite
8da0: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 53  3VdbeGetOp(v, pS
8db0: 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64  ort->addrSortInd
8dc0: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ex);.        pOp
8dd0: 2d 3e 70 32 20 2b 3d 20 28 70 45 78 74 72 61 2d  ->p2 += (pExtra-
8de0: 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e  >nExpr - pSort->
8df0: 6e 44 65 66 65 72 29 3b 0a 20 20 20 20 20 20 20  nDefer);.       
8e00: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
8e10: 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 2b 3d 20  o->nAllField += 
8e20: 28 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 20 2d  (pExtra->nExpr -
8e30: 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 29 3b   pSort->nDefer);
8e40: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
8e50: 3e 6e 4d 65 6d 20 2b 3d 20 70 45 78 74 72 61 2d  >nMem += pExtra-
8e60: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a  >nExpr;.      }.
8e70: 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a  #endif..      /*
8e80: 20 41 64 6a 75 73 74 20 6e 52 65 73 75 6c 74 43   Adjust nResultC
8e90: 6f 6c 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  ol to account fo
8ea0: 72 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  r columns that a
8eb0: 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 20 20 20  re omitted.     
8ec0: 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 6f 72   ** from the sor
8ed0: 74 65 72 20 62 79 20 74 68 65 20 6f 70 74 69 6d  ter by the optim
8ee0: 69 7a 61 74 69 6f 6e 73 20 69 6e 20 74 68 69 73  izations in this
8ef0: 20 62 72 61 6e 63 68 20 2a 2f 0a 20 20 20 20 20   branch */.     
8f00: 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
8f10: 69 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ist;.      for(i
8f20: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
8f30: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
8f40: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
8f50: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
8f60: 43 6f 6c 3e 30 0a 23 69 66 64 65 66 20 53 51 4c  Col>0.#ifdef SQL
8f70: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
8f80: 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20  R_REFERENCES.   
8f90: 20 20 20 20 20 20 7c 7c 20 70 45 4c 69 73 74 2d        || pEList-
8fa0: 3e 61 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65 66  >a[i].bSorterRef
8fb0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
8fc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 52 65  ){.          nRe
8fd0: 73 75 6c 74 43 6f 6c 2d 2d 3b 0a 20 20 20 20 20  sultCol--;.     
8fe0: 20 20 20 20 20 72 65 67 4f 72 69 67 20 3d 20 30       regOrig = 0
8ff0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9000: 20 20 7d 0a 0a 20 20 20 20 20 20 74 65 73 74 63    }..      testc
9010: 61 73 65 28 20 72 65 67 4f 72 69 67 20 29 3b 0a  ase( regOrig );.
9020: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9030: 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 29  eDest==SRT_Set )
9040: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9050: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  ( eDest==SRT_Mem
9060: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
9070: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  se( eDest==SRT_C
9080: 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20  oroutine );.    
9090: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
90a0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
90b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
90c0: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 7c 7c  Dest==SRT_Set ||
90d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20   eDest==SRT_Mem 
90e0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65  .           || e
90f0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
9100: 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  ine || eDest==SR
9110: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
9120: 7d 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64 49 6e  }.    sRowLoadIn
9130: 66 6f 2e 72 65 67 52 65 73 75 6c 74 20 3d 20 72  fo.regResult = r
9140: 65 67 52 65 73 75 6c 74 3b 0a 20 20 20 20 73 52  egResult;.    sR
9150: 6f 77 4c 6f 61 64 49 6e 66 6f 2e 65 63 65 6c 46  owLoadInfo.ecelF
9160: 6c 61 67 73 20 3d 20 65 63 65 6c 46 6c 61 67 73  lags = ecelFlags
9170: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
9180: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
9190: 46 45 52 45 4e 43 45 53 0a 20 20 20 20 73 52 6f  FERENCES.    sRo
91a0: 77 4c 6f 61 64 49 6e 66 6f 2e 70 45 78 74 72 61  wLoadInfo.pExtra
91b0: 20 3d 20 70 45 78 74 72 61 3b 0a 20 20 20 20 73   = pExtra;.    s
91c0: 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 72 65 67 45  RowLoadInfo.regE
91d0: 78 74 72 61 52 65 73 75 6c 74 20 3d 20 72 65 67  xtraResult = reg
91e0: 52 65 73 75 6c 74 20 2b 20 6e 52 65 73 75 6c 74  Result + nResult
91f0: 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 70 45 78  Col;.    if( pEx
9200: 74 72 61 20 29 20 6e 52 65 73 75 6c 74 43 6f 6c  tra ) nResultCol
9210: 20 2b 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78 70   += pExtra->nExp
9220: 72 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  r;.#endif.    if
9230: 28 20 70 2d 3e 69 4c 69 6d 69 74 0a 20 20 20 20  ( p->iLimit.    
9240: 20 26 26 20 28 65 63 65 6c 46 6c 61 67 73 20 26   && (ecelFlags &
9250: 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49   SQLITE_ECEL_OMI
9260: 54 52 45 46 29 21 3d 30 20 0a 20 20 20 20 20 26  TREF)!=0 .     &
9270: 26 20 6e 50 72 65 66 69 78 52 65 67 3e 30 0a 20  & nPrefixReg>0. 
9280: 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
9290: 72 74 28 20 70 53 6f 72 74 21 3d 30 20 29 3b 0a  rt( pSort!=0 );.
92a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 68 61        assert( ha
92b0: 73 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a  sDistinct==0 );.
92c0: 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 70 44 65        pSort->pDe
92d0: 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 20 3d 20  ferredRowLoad = 
92e0: 26 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 0a 20  &sRowLoadInfo;. 
92f0: 20 20 20 20 20 72 65 67 4f 72 69 67 20 3d 20 30       regOrig = 0
9300: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9310: 20 20 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f 61 64     innerLoopLoad
9320: 52 6f 77 28 70 50 61 72 73 65 2c 20 70 2c 20 26  Row(pParse, p, &
9330: 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 29 3b 0a 20  sRowLoadInfo);. 
9340: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
9350: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
9360: 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65  eyword was prese
9370: 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  nt on the SELECT
9380: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
9390: 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73  and this row has
93a0: 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72   been seen befor
93b0: 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d  e, then do not m
93c0: 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a  ake this row.  *
93d0: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65  * part of the re
93e0: 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
93f0: 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a   hasDistinct ){.
9400: 20 20 20 20 73 77 69 74 63 68 28 20 70 44 69 73      switch( pDis
9410: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
9420: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57   ){.      case W
9430: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
9440: 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
9450: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20   VdbeOp *pOp;   
9460: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c           /* No l
9470: 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20 4f  onger required O
9480: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
9490: 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  tr. */.        i
94a0: 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20  nt iJump;       
94b0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64         /* Jump d
94c0: 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
94d0: 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 72 65        int regPre
94e0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v;            /*
94f0: 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f   Previous row co
9500: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20  ntent */..      
9510: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
9520: 61 63 65 20 66 6f 72 20 74 68 65 20 70 72 65 76  ace for the prev
9530: 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20  ious row */.    
9540: 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50      regPrev = pP
9550: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
9560: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
9570: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
9580: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ;..        /* Ch
9590: 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
95a0: 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20  Ephemeral coded 
95b0: 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50  earlier to an OP
95c0: 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  _Null.        **
95d0: 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c   sets the MEM_Cl
95e0: 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65  eared bit on the
95f0: 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
9600: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
9610: 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  * previous value
9620: 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
9630: 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c  se the OP_Ne bel
9640: 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20  ow to always.   
9650: 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20       ** fail on 
9660: 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
9670: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ion of the loop 
9680: 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72 73  even if the firs
9690: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77  t.        ** row
96a0: 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20   is all NULLs.. 
96b0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
96c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
96d0: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69  ngeToNoop(v, pDi
96e0: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
96f0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d  );.        pOp =
9700: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
9710: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
9720: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
9730: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
9740: 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20   OP_Null;.      
9750: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20    pOp->p1 = 1;. 
9760: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
9770: 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20   regPrev;..     
9780: 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74     iJump = sqlit
9790: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
97a0: 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f  r(v) + nResultCo
97b0: 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  l;.        for(i
97c0: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
97d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
97e0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
97f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
9800: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
9810: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  >pEList->a[i].pE
9820: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
9830: 69 66 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  if( i<nResultCol
9840: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
9850: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9860: 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65  Op3(v, OP_Ne, re
9870: 67 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70  gResult+i, iJump
9880: 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20  , regPrev+i);.  
9890: 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
98a0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
98b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
98c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
98d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
98e0: 45 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c  Eq, regResult+i,
98f0: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50   iContinue, regP
9900: 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20  rev+i);.        
9910: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
9920: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
9930: 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
9940: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
9950: 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68  v, -1, (const ch
9960: 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
9970: 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20  OLLSEQ);.       
9980: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
9990: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
99a0: 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
99b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
99c0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43  rt( sqlite3VdbeC
99d0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69  urrentAddr(v)==i
99e0: 4a 75 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Jump || pParse->
99f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9a00: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
9a10: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
9a20: 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73   OP_Copy, regRes
9a30: 75 6c 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52  ult, regPrev, nR
9a40: 65 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20  esultCol-1);.   
9a50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9a60: 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20    }..      case 
9a70: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
9a80: 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20  NIQUE: {.       
9a90: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
9aa0: 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73  geToNoop(v, pDis
9ab0: 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29  tinct->addrTnct)
9ac0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9ad0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
9ae0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
9af0: 20 20 20 61 73 73 65 72 74 28 20 70 44 69 73 74     assert( pDist
9b00: 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d  inct->eTnctType=
9b10: 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
9b20: 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20  UNORDERED );.   
9b30: 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63       codeDistinc
9b40: 74 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  t(pParse, pDisti
9b50: 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43  nct->tabTnct, iC
9b60: 6f 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74  ontinue, nResult
9b70: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
9b80: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
9b90: 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ult);.        br
9ba0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9bb0: 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74   }.    if( pSort
9bc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ==0 ){.      cod
9bd0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
9be0: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
9bf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
9c00: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
9c10: 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
9c20: 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68  mode, write each
9c30: 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f   query result to
9c40: 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
9c50: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a  temporary.    **
9c60: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
9c70: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
9c80: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
9c90: 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73  D_SELECT.    cas
9ca0: 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20  e SRT_Union: {. 
9cb0: 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20       int r1;.   
9cc0: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
9cd0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
9ce0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9cf0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9d00: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
9d10: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
9d20: 6f 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  ol, r1);.      s
9d30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
9d40: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
9d50: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
9d60: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
9d70: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73 71  ltCol);.      sq
9d80: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
9d90: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
9da0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9db0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73    }..    /* Cons
9dc0: 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66  truct a record f
9dd0: 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65  rom the query re
9de0: 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61  sult, but instea
9df0: 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69  d of.    ** savi
9e00: 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20  ng that record, 
9e10: 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20  use it as a key 
9e20: 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e  to delete elemen
9e30: 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ts from.    ** t
9e40: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
9e50: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
9e60: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
9e70: 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71  cept: {.      sq
9e80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9e90: 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c  v, OP_IdxDelete,
9ea0: 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c   iParm, regResul
9eb0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
9ec0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9ed0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
9ee0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
9ef0: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20  D_SELECT */..   
9f00: 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
9f10: 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
9f20: 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
9f30: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
9f40: 20 53 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63   SRT_Fifo:.    c
9f50: 61 73 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f  ase SRT_DistFifo
9f60: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  :.    case SRT_T
9f70: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
9f80: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
9f90: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
9fa0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
9fb0: 65 28 70 50 61 72 73 65 2c 20 6e 50 72 65 66 69  e(pParse, nPrefi
9fc0: 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 74  xReg+1);.      t
9fd0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
9fe0: 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20  SRT_Table );.   
9ff0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
a000: 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
a010: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
a020: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 46  se( eDest==SRT_F
a030: 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ifo );.      tes
a040: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
a050: 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20  T_DistFifo );.  
a060: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a070: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
a080: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
a090: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  t, nResultCol, r
a0a0: 31 2b 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 23  1+nPrefixReg);.#
a0b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a0c0: 49 54 5f 43 54 45 0a 20 20 20 20 20 20 69 66 28  IT_CTE.      if(
a0d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
a0e0: 46 69 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Fifo ){.        
a0f0: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
a100: 61 74 69 6f 6e 20 69 73 20 44 69 73 74 46 69 66  ation is DistFif
a110: 6f 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28  o, then cursor (
a120: 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e  iParm+1) is open
a130: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61  .        ** on a
a140: 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  n ephemeral inde
a150: 78 2e 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  x. If the curren
a160: 74 20 72 6f 77 20 69 73 20 61 6c 72 65 61 64 79  t row is already
a170: 20 70 72 65 73 65 6e 74 0a 20 20 20 20 20 20 20   present.       
a180: 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78   ** in the index
a190: 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69  , do not write i
a1a0: 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  t to the output.
a1b0: 20 49 66 20 6e 6f 74 2c 20 61 64 64 20 74 68 65   If not, add the
a1c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72  .        ** curr
a1d0: 65 6e 74 20 72 6f 77 20 74 6f 20 74 68 65 20 69  ent row to the i
a1e0: 6e 64 65 78 20 61 6e 64 20 70 72 6f 63 65 65 64  ndex and proceed
a1f0: 20 77 69 74 68 20 77 72 69 74 69 6e 67 20 69 74   with writing it
a200: 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   to the.        
a210: 2a 2a 20 6f 75 74 70 75 74 20 74 61 62 6c 65 20  ** output table 
a220: 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20  as well.  */.   
a230: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
a240: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
a250: 6e 74 41 64 64 72 28 76 29 20 2b 20 34 3b 0a 20  ntAddr(v) + 4;. 
a260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a270: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
a280: 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31  P_Found, iParm+1
a290: 2c 20 61 64 64 72 2c 20 72 31 2c 20 30 29 3b 0a  , addr, r1, 0);.
a2a0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
a2b0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
a2c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a2d0: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
a2e0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20  nsert, iParm+1, 
a2f0: 72 31 2c 72 65 67 52 65 73 75 6c 74 2c 6e 52 65  r1,regResult,nRe
a300: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
a310: 20 20 61 73 73 65 72 74 28 20 70 53 6f 72 74 3d    assert( pSort=
a320: 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  =0 );.      }.#e
a330: 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
a340: 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
a350: 61 73 73 65 72 74 28 20 72 65 67 52 65 73 75 6c  assert( regResul
a360: 74 3d 3d 72 65 67 4f 72 69 67 20 29 3b 0a 20 20  t==regOrig );.  
a370: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
a380: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  rter(pParse, pSo
a390: 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69  rt, p, r1+nPrefi
a3a0: 78 52 65 67 2c 20 72 65 67 4f 72 69 67 2c 20 31  xReg, regOrig, 1
a3b0: 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  , nPrefixReg);. 
a3c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a3d0: 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
a3e0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
a3f0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
a400: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a410: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
a420: 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20  , iParm, r2);.  
a430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a440: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
a450: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c  sert, iParm, r1,
a460: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r2);.        sq
a470: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
a480: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
a490: 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ND);.        sql
a4a0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
a4b0: 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
a4c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
a4d0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
a4e0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  Range(pParse, r1
a4f0: 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b  , nPrefixReg+1);
a500: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a510: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
a520: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
a530: 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
a540: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
a550: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
a560: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
a570: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
a580: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
a590: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
a5a0: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
a5b0: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
a5c0: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
a5d0: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
a5e0: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
a5f0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
a600: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
a610: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
a620: 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74       /* At first
a630: 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c   glance you woul
a640: 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64  d think we could
a650: 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68   optimize out th
a660: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44  e.        ** ORD
a670: 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61  ER BY in this ca
a680: 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64  se since the ord
a690: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
a6a0: 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20   the set.       
a6b0: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   ** does not mat
a6c0: 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20  ter.  But there 
a6d0: 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54  might be a LIMIT
a6e0: 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63   clause, in whic
a6f0: 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73  h.        ** cas
a700: 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73  e the order does
a710: 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20   matter */.     
a720: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
a730: 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r(.            p
a740: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c  Parse, pSort, p,
a750: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f   regResult, regO
a760: 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  rig, nResultCol,
a770: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
a780: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a790: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
a7a0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a7b0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61  arse);.        a
a7c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 74  ssert( sqlite3St
a7d0: 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41  rlen30(pDest->zA
a7e0: 66 66 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74  ffSdst)==nResult
a7f0: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73  Col );.        s
a800: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
a810: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
a820: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
a830: 65 73 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20  esultCol, .     
a840: 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74         r1, pDest
a850: 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73  ->zAffSdst, nRes
a860: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
a870: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
a880: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
a890: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
a8a0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
a8b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a8c0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
a8d0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
a8e0: 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75  arm, r1, regResu
a8f0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
a900: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a910: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
a920: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
a930: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
a940: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
a950: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
a960: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
a970: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
a980: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
a990: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
a9a0: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
a9b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a9c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
a9d0: 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20  er, 1, iParm);. 
a9e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
a9f0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
aa00: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
aa10: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
aa20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
aa30: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
aa40: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
aa50: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
aa60: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
aa70: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
aa80: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
aa90: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
aaa0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20   memory cell or 
aab0: 61 72 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a  array of .    **
aac0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
aad0: 64 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  d break out of t
aae0: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
aaf0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
ab00: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69  T_Mem: {.      i
ab10: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
ab20: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
ab30: 75 6c 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e  ultCol<=pDest->n
ab40: 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Sdst );.        
ab50: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a  pushOntoSorter(.
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
ab70: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65  se, pSort, p, re
ab80: 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67  gResult, regOrig
ab90: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50  , nResultCol, nP
aba0: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
abb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
abc0: 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43  assert( nResultC
abd0: 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74  ol==pDest->nSdst
abe0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
abf0: 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69  rt( regResult==i
ac00: 50 61 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  Parm );.        
ac10: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
ac20: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
ac30: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
ac40: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r us */.      }.
ac50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ac60: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
ac70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ac80: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
ac90: 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
aca0: 74 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53  tine:       /* S
acb0: 65 6e 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f  end data to a co
acc0: 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  -routine */.    
acd0: 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a  case SRT_Output:
ace0: 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74   {        /* Ret
acf0: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  urn the results 
ad00: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
ad10: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
ad20: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
ad30: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
ad40: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
ad50: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
ad60: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
ad70: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
ad80: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
ad90: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
ada0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20  nResultCol,.    
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adc0: 20 20 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a     nPrefixReg);.
add0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ade0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
adf0: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tine ){.        
ae00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ae10: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
ae20: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
ae30: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ae40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ae50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
ae60: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
ae70: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
ae80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
ae90: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
aea0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
aeb0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
aec0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tCol);.      }. 
aed0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aee0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
aef0: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f  E_OMIT_CTE.    /
af00: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75  * Write the resu
af10: 6c 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72  lts into a prior
af20: 69 74 79 20 71 75 65 75 65 20 74 68 61 74 20 69  ity queue that i
af30: 73 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e  s order accordin
af40: 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73  g to.    ** pDes
af50: 74 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20  t->pOrderBy (in 
af60: 70 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53  pSO).  pDest->iS
af70: 44 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29  DParm (in iParm)
af80: 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66   is the cursor f
af90: 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64  or an.    ** ind
afa0: 65 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78  ex with pSO->nEx
afb0: 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42  pr+2 columns.  B
afc0: 75 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67  uild a key using
afd0: 20 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72   pSO for the fir
afe0: 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e  st.    ** pSO->n
aff0: 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  Expr columns, th
b000: 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  en make sure all
b010: 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65   keys are unique
b020: 20 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20   by adding a.   
b030: 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71   ** final OP_Seq
b040: 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54  uence column.  T
b050: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
b060: 73 20 74 68 65 20 72 65 63 6f 72 64 20 61 73 20  s the record as 
b070: 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  a blob..    */. 
b080: 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74     case SRT_Dist
b090: 51 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20  Queue:.    case 
b0a0: 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20  SRT_Queue: {.   
b0b0: 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20     int nKey;.   
b0c0: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
b0d0: 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  3;.      int add
b0e0: 72 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  rTest = 0;.     
b0f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a   ExprList *pSO;.
b100: 20 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73        pSO = pDes
b110: 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  t->pOrderBy;.   
b120: 20 20 20 61 73 73 65 72 74 28 20 70 53 4f 20 29     assert( pSO )
b130: 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70  ;.      nKey = p
b140: 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  SO->nExpr;.     
b150: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
b160: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
b170: 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
b180: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
b190: 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b  pParse, nKey+2);
b1a0: 0a 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e  .      r3 = r2+n
b1b0: 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28  Key+1;.      if(
b1c0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
b1d0: 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Queue ){.       
b1e0: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
b1f0: 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75  nation is DistQu
b200: 65 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72  eue, then cursor
b210: 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70   (iParm+1) is op
b220: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  en.        ** on
b230: 20 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65   a second epheme
b240: 72 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68  ral index that h
b250: 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20  olds all values 
b260: 65 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79  every previously
b270: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65  .        ** adde
b280: 64 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20  d to the queue. 
b290: 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72 54  */.        addrT
b2a0: 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
b2b0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
b2c0: 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c  _Found, iParm+1,
b2d0: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
b300: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
b310: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  ol);.        Vdb
b320: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b330: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
b340: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
b350: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
b360: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
b370: 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20  ltCol, r3);.    
b380: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
b390: 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20  _DistQueue ){.  
b3a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b3b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
b3c0: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
b3d0: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73  , r3);.        s
b3e0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
b3f0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
b400: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20  SEEKRESULT);.   
b410: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
b420: 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29  =0; i<nKey; i++)
b430: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b440: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b450: 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20  P_SCopy,.       
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b470: 20 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70     regResult + p
b480: 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  SO->a[i].u.x.iOr
b490: 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20  derByCol - 1,.  
b4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4b0: 20 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20          r2+i);. 
b4c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
b4d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b4e0: 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69  , OP_Sequence, i
b4f0: 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a  Parm, r2+nKey);.
b500: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b510: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
b520: 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b  keRecord, r2, nK
b530: 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20  ey+2, r1);.     
b540: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b550: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
b560: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
b570: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  , r2, nKey+2);. 
b580: 20 20 20 20 20 69 66 28 20 61 64 64 72 54 65 73       if( addrTes
b590: 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  t ) sqlite3VdbeJ
b5a0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
b5b0: 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
b5c0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
b5d0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
b5e0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
b5f0: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
b600: 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29  rse, r2, nKey+2)
b610: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b620: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
b630: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a  QLITE_OMIT_CTE *
b640: 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  /....#if !define
b650: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
b660: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
b670: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
b680: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
b690: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
b6a0: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
b6b0: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
b6c0: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
b6d0: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
b6e0: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
b6f0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
b700: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
b710: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
b720: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
b730: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
b740: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
b750: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
b760: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
b770: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
b780: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
b790: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
b7a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b7b0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
b7c0: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
b7d0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
b7e0: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
b7f0: 69 73 20 72 65 61 63 68 65 64 2e 20 20 45 78 63  is reached.  Exc
b800: 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65  ept, if.  ** the
b810: 72 65 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20  re is a sorter, 
b820: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
b830: 65 20 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72  e sorter has alr
b840: 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a  eady limited.  *
b850: 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72  * the output for
b860: 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   us..  */.  if( 
b870: 70 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69  pSort==0 && p->i
b880: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
b890: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b8a0: 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
b8b0: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
b8c0: 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
b8d0: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  age(v);.  }.}../
b8e0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
b8f0: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73  KeyInfo object s
b900: 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e  ufficient for an
b910: 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20   index of N key 
b920: 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58  columns and.** X
b930: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a   extra columns..
b940: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
b950: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
b960: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
b970: 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e   N, int X){.  in
b980: 74 20 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29  t nExtra = (N+X)
b990: 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
b9a0: 2a 29 2b 31 29 20 2d 20 73 69 7a 65 6f 66 28 43  *)+1) - sizeof(C
b9b0: 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49  ollSeq*);.  KeyI
b9c0: 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  nfo *p = sqlite3
b9d0: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
b9e0: 2c 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f  , sizeof(KeyInfo
b9f0: 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  ) + nExtra);.  i
ba00: 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  f( p ){.    p->a
ba10: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
ba20: 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b  )&p->aColl[N+X];
ba30: 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c  .    p->nKeyFiel
ba40: 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20  d = (u16)N;.    
ba50: 70 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28  p->nAllField = (
ba60: 75 31 36 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70  u16)(N+X);.    p
ba70: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
ba80: 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  .    p->db = db;
ba90: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31  .    p->nRef = 1
baa0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 5b  ;.    memset(&p[
bab0: 31 5d 2c 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a  1], 0, nExtra);.
bac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
bad0: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
bae0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
baf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
bb00: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
bb10: 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73  object.*/.void s
bb20: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
bb30: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
bb40: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
bb50: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
bb60: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d   );.    p->nRef-
bb70: 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  -;.    if( p->nR
bb80: 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44  ef==0 ) sqlite3D
bb90: 62 46 72 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70  bFreeNN(p->db, p
bba0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
bbb0: 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74  Make a new point
bbc0: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
bbd0: 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66  object.*/.KeyInf
bbe0: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
bbf0: 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  oRef(KeyInfo *p)
bc00: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
bc10: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
bc20: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
bc30: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  f++;.  }.  retur
bc40: 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n p;.}..#ifdef S
bc50: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
bc60: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
bc70: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
bc80: 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e  t can be change.
bc90: 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62    The KeyInfo ob
bca0: 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79  ject.** can only
bcb0: 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20 74   be changed if t
bcc0: 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73 69  his is just a si
bcd0: 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74  ngle reference t
bce0: 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  o the object..**
bcf0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
bd00: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e   is used only in
bd10: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
bd20: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
bd30: 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  int sqlite3KeyIn
bd40: 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65  foIsWriteable(Ke
bd50: 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72  yInfo *p){ retur
bd60: 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a  n p->nRef==1; }.
bd70: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
bd80: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
bd90: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
bda0: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
bdb0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
bdc0: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
bdd0: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
bde0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
bdf0: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
be00: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
be10: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
be20: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
be30: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
be40: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
be50: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
be60: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
be70: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
be80: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
be90: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
bea0: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
beb0: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
bec0: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
bed0: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
bee0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
bef0: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
bf00: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
bf10: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
bf20: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
bf30: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
bf40: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
bf50: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
bf60: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
bf70: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
bf80: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
bf90: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
bfa0: 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63  m malloc.  The c
bfb0: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
bfc0: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
bfd0: 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61  e for seeing tha
bfe0: 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
bff0: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
c000: 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  * freed..*/.stat
c010: 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49  ic KeyInfo *keyI
c020: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
c030: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c040: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
c050: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
c060: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
c070: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65       /* Form the
c080: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
c090: 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69  from this ExprLi
c0a0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  st */.  int iSta
c0b0: 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rt,          /* 
c0c0: 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20  Begin with this 
c0d0: 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20  column of pList 
c0e0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
c0f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
c100: 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61   this many extra
c110: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
c120: 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  end */.){.  int 
c130: 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f  nExpr;.  KeyInfo
c140: 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   *pInfo;.  struc
c150: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
c160: 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
c170: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
c180: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  db;.  int i;..  
c190: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
c1a0: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
c1b0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
c1c0: 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53  loc(db, nExpr-iS
c1d0: 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b  tart, nExtra+1);
c1e0: 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a  .  if( pInfo ){.
c1f0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
c200: 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
c210: 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a  eable(pInfo) );.
c220: 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74      for(i=iStart
c230: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
c240: 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72  +iStart; i<nExpr
c250: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
c260: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  .      pInfo->aC
c270: 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  oll[i-iStart] = 
c280: 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c  sqlite3ExprNNCol
c290: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
c2a0: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
c2b0: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
c2c0: 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  der[i-iStart] = 
c2d0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
c2e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
c2f0: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f  turn pInfo;.}../
c300: 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  *.** Name of the
c310: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72   connection oper
c320: 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65  ator, used for e
c330: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
c340: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
c350: 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d  har *selectOpNam
c360: 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61  e(int id){.  cha
c370: 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20  r *z;.  switch( 
c380: 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  id ){.    case T
c390: 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d  K_ALL:       z =
c3a0: 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20   "UNION ALL";   
c3b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
c3c0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20  TK_INTERSECT: z 
c3d0: 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20  = "INTERSECT";  
c3e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
c3f0: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a   TK_EXCEPT:    z
c400: 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20   = "EXCEPT";    
c410: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
c420: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
c430: 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20  z = "UNION";    
c440: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
c450: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66  return z;.}..#if
c460: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c470: 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55  _EXPLAIN./*.** U
c480: 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49  nless an "EXPLAI
c490: 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f  N QUERY PLAN" co
c4a0: 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70  mmand is being p
c4b0: 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66  rocessed, this f
c4c0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20  unction.** is a 
c4d0: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
c4e0: 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67  , it adds a sing
c4f0: 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  le row of output
c500: 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75   to the EQP resu
c510: 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  lt,.** where the
c520: 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74   caption is of t
c530: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
c540: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
c550: 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a  E FOR xxx".**.**
c560: 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e   where xxx is on
c570: 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c  e of "DISTINCT",
c580: 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22   "ORDER BY" or "
c590: 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74  GROUP BY". Exact
c5a0: 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ly which.** is d
c5b0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
c5c0: 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74   zUsage argument
c5d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c5e0: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
c5f0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
c600: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73   const char *zUs
c610: 61 67 65 29 7b 0a 20 20 45 78 70 6c 61 69 6e 51  age){.  ExplainQ
c620: 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
c630: 2c 20 30 2c 20 22 55 53 45 20 54 45 4d 50 20 42  , 0, "USE TEMP B
c640: 2d 54 52 45 45 20 46 4f 52 20 25 73 22 2c 20 7a  -TREE FOR %s", z
c650: 55 73 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Usage));.}../*.*
c660: 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65 73 73  * Assign express
c670: 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20  ion b to lvalue 
c680: 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d  a. A second, no-
c690: 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  op, version of t
c6a0: 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20  his macro.** is 
c6b0: 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51  provided when SQ
c6c0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
c6d0: 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68  N is defined. Th
c6e0: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f  is allows the co
c6f0: 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33  de.** in sqlite3
c700: 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69  Select() to assi
c710: 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72  gn values to str
c720: 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61  ucture member va
c730: 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20  riables that.** 
c740: 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53 51  only exist if SQ
c750: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
c760: 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  N is not defined
c770: 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69   without polluti
c780: 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  ng the.** code w
c790: 69 74 68 20 23 69 66 6e 64 65 66 20 64 69 72 65  ith #ifndef dire
c7a0: 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66  ctives..*/.# def
c7b0: 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  ine explainSetIn
c7c0: 74 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20  teger(a, b) a = 
c7d0: 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f  b..#else./* No-o
c7e0: 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  p versions of th
c7f0: 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66  e explainXXX() f
c800: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63  unctions and mac
c810: 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65  ros. */.# define
c820: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
c830: 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20  e(y,z).# define 
c840: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
c850: 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 0a  r(y,z).#endif...
c860: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
c870: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
c880: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
c890: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
c8a0: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
c8b0: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
c8c0: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
c8d0: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
c8e0: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
c8f0: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
c900: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
c910: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
c920: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
c930: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
c940: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
c950: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
c960: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
c970: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
c980: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72  eSortTail(.  Par
c990: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
c9a0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
c9b0: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
c9c0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
c9d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
c9e0: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
c9f0: 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72  Sort,   /* Infor
ca00: 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52  mation on the OR
ca10: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
ca20: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
ca30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ca40: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
ca50: 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
ca60: 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74  t *pDest /* Writ
ca70: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
ca80: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
ca90: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
caa0: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cac0: 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
cad0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
cae0: 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20 70 53  t addrBreak = pS
caf0: 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20  ort->labelDone; 
cb00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
cb10: 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74 20  mp here to exit 
cb20: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
cb30: 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c  drContinue = sql
cb40: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
cb50: 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68  l(v);  /* Jump h
cb60: 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63  ere for next cyc
cb70: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
cb80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cb90: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
cba0: 66 20 6f 75 74 70 75 74 20 6c 6f 6f 70 2e 20 4a  f output loop. J
cbb0: 75 6d 70 20 66 6f 72 20 4e 65 78 74 2e 20 2a 2f  ump for Next. */
cbc0: 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20  .  int addrOnce 
cbd0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
cbe0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
cbf0: 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70  derBy = pSort->p
cc00: 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65  OrderBy;.  int e
cc10: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
cc20: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
cc30: 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72   = pDest->iSDPar
cc40: 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b  m;.  int regRow;
cc50: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b  .  int regRowid;
cc60: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69  .  int iCol;.  i
cc70: 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20  nt nKey;        
cc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cc90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20  * Number of key 
cca0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 6f 72 74 65  columns in sorte
ccb0: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
ccc0: 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20  t iSortTab;     
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cce0: 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74   Sorter cursor t
ccf0: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
cd00: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53   int i;.  int bS
cd10: 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eq;             
cd20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
cd30: 65 20 69 66 20 73 6f 72 74 65 72 20 72 65 63 6f  e if sorter reco
cd40: 72 64 20 69 6e 63 6c 75 64 65 73 20 73 65 71 2e  rd includes seq.
cd50: 20 6e 6f 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   no. */.  int nR
cd60: 65 66 4b 65 79 20 3d 20 30 3b 0a 20 20 73 74 72  efKey = 0;.  str
cd70: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
cd80: 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70  m *aOutEx = p->p
cd90: 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20 20 61 73 73  EList->a;..  ass
cda0: 65 72 74 28 20 61 64 64 72 42 72 65 61 6b 3c 30  ert( addrBreak<0
cdb0: 20 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d   );.  if( pSort-
cdc0: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20  >labelBkOut ){. 
cdd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cde0: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
cdf0: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
ce00: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
ce10: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
ce20: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
ce30: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73  ddrBreak);.    s
ce40: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
ce50: 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d  eLabel(v, pSort-
ce60: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
ce70: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
ce80: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
ce90: 45 46 45 52 45 4e 43 45 53 0a 20 20 2f 2a 20 4f  EFERENCES.  /* O
cea0: 70 65 6e 20 61 6e 79 20 63 75 72 73 6f 72 73 20  pen any cursors 
ceb0: 6e 65 65 64 65 64 20 66 6f 72 20 73 6f 72 74 65  needed for sorte
cec0: 72 2d 72 65 66 65 72 65 6e 63 65 20 65 78 70 72  r-reference expr
ced0: 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72  essions */.  for
cee0: 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e  (i=0; i<pSort->n
cef0: 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  Defer; i++){.   
cf00: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
cf10: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e  Sort->aDefer[i].
cf20: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 44  pTab;.    int iD
cf30: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
cf40: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
cf50: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
cf60: 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ma);.    sqlite3
cf70: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
cf80: 2c 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b  , pSort->aDefer[
cf90: 69 5d 2e 69 43 73 72 2c 20 69 44 62 2c 20 70 54  i].iCsr, iDb, pT
cfa0: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
cfb0: 3b 0a 20 20 20 20 6e 52 65 66 4b 65 79 20 3d 20  ;.    nRefKey = 
cfc0: 4d 41 58 28 6e 52 65 66 4b 65 79 2c 20 70 53 6f  MAX(nRefKey, pSo
cfd0: 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e 4b  rt->aDefer[i].nK
cfe0: 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ey);.  }.#endif.
cff0: 0a 20 20 69 54 61 62 20 3d 20 70 53 6f 72 74 2d  .  iTab = pSort-
d000: 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  >iECursor;.  if(
d010: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
d020: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
d030: 5f 43 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44  _Coroutine || eD
d040: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a  est==SRT_Mem ){.
d050: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30      regRowid = 0
d060: 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 70  ;.    regRow = p
d070: 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 7d  Dest->iSdst;.  }
d080: 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77  else{.    regRow
d090: 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  id = sqlite3GetT
d0a0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
d0b0: 20 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c      regRow = sql
d0c0: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
d0d0: 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e  (pParse, nColumn
d0e0: 29 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20  );.  }.  nKey = 
d0f0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
d100: 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  - pSort->nOBSat;
d110: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f  .  if( pSort->so
d120: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
d130: 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  AG_UseSorter ){.
d140: 20 20 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f      int regSortO
d150: 75 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ut = ++pParse->n
d160: 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72 74 54 61  Mem;.    iSortTa
d170: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
d180: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72  ++;.    if( pSor
d190: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b  t->labelBkOut ){
d1a0: 0a 20 20 20 20 20 20 61 64 64 72 4f 6e 63 65 20  .      addrOnce 
d1b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d1c0: 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
d1d0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
d1e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
d1f0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d200: 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
d210: 69 53 6f 72 74 54 61 62 2c 20 72 65 67 53 6f 72  iSortTab, regSor
d220: 74 4f 75 74 2c 20 0a 20 20 20 20 20 20 20 20 6e  tOut, .        n
d230: 4b 65 79 2b 31 2b 6e 43 6f 6c 75 6d 6e 2b 6e 52  Key+1+nColumn+nR
d240: 65 66 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20  efKey);.    if( 
d250: 61 64 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74  addrOnce ) sqlit
d260: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
d270: 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20  , addrOnce);.   
d280: 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69   addr = 1 + sqli
d290: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d2a0: 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
d2b0: 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29  iTab, addrBreak)
d2c0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
d2d0: 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f  ge(v);.    codeO
d2e0: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
d2f0: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
d300: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
d310: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d320: 53 6f 72 74 65 72 44 61 74 61 2c 20 69 54 61 62  SorterData, iTab
d330: 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 69 53  , regSortOut, iS
d340: 6f 72 74 54 61 62 29 3b 0a 20 20 20 20 62 53 65  ortTab);.    bSe
d350: 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  q = 0;.  }else{.
d360: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
d370: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d380: 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61  (v, OP_Sort, iTa
d390: 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56  b, addrBreak); V
d3a0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
d3b0: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
d3c0: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64  , p->iOffset, ad
d3d0: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20  drContinue);.   
d3e0: 20 69 53 6f 72 74 54 61 62 20 3d 20 69 54 61 62   iSortTab = iTab
d3f0: 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 31 3b 0a  ;.    bSeq = 1;.
d400: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 69    }.  for(i=0, i
d410: 43 6f 6c 3d 6e 4b 65 79 2b 62 53 65 71 2d 31 3b  Col=nKey+bSeq-1;
d420: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
d430: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
d440: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
d450: 46 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28  FERENCES.    if(
d460: 20 61 4f 75 74 45 78 5b 69 5d 2e 62 53 6f 72 74   aOutEx[i].bSort
d470: 65 72 52 65 66 20 29 20 63 6f 6e 74 69 6e 75 65  erRef ) continue
d480: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
d490: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
d4a0: 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20  OrderByCol==0 ) 
d4b0: 69 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 23 69 66 64  iCol++;.  }.#ifd
d4c0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d4d0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
d4e0: 45 53 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  ES.  if( pSort->
d4f0: 6e 44 65 66 65 72 20 29 7b 0a 20 20 20 20 69 6e  nDefer ){.    in
d500: 74 20 69 4b 65 79 20 3d 20 69 43 6f 6c 2b 31 3b  t iKey = iCol+1;
d510: 0a 20 20 20 20 69 6e 74 20 72 65 67 4b 65 79 20  .    int regKey 
d520: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
d530: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 52  Range(pParse, nR
d540: 65 66 4b 65 79 29 3b 0a 0a 20 20 20 20 66 6f 72  efKey);..    for
d550: 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e  (i=0; i<pSort->n
d560: 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  Defer; i++){.   
d570: 20 20 20 69 6e 74 20 69 43 73 72 20 3d 20 70 53     int iCsr = pS
d580: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 69  ort->aDefer[i].i
d590: 43 73 72 3b 0a 20 20 20 20 20 20 54 61 62 6c 65  Csr;.      Table
d5a0: 20 2a 70 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e   *pTab = pSort->
d5b0: 61 44 65 66 65 72 5b 69 5d 2e 70 54 61 62 3b 0a  aDefer[i].pTab;.
d5c0: 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d        int nKey =
d5d0: 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69   pSort->aDefer[i
d5e0: 5d 2e 6e 4b 65 79 3b 0a 0a 20 20 20 20 20 20 73  ].nKey;..      s
d5f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
d600: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
d610: 69 43 73 72 29 3b 0a 20 20 20 20 20 20 69 66 28  iCsr);.      if(
d620: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
d630: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d640: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d650: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74  OP_Column, iSort
d660: 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20 72 65 67  Tab, iKey++, reg
d670: 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Key);.        sq
d680: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d690: 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
d6a0: 20 69 43 73 72 2c 20 0a 20 20 20 20 20 20 20 20   iCsr, .        
d6b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
d6c0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 2c  urrentAddr(v)+1,
d6d0: 20 72 65 67 4b 65 79 29 3b 0a 20 20 20 20 20 20   regKey);.      
d6e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
d6f0: 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e  nt k;.        in
d700: 74 20 69 4a 6d 70 3b 0a 20 20 20 20 20 20 20 20  t iJmp;.        
d710: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d720: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
d730: 54 61 62 29 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e  Tab)->nKeyCol==n
d740: 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 66  Key );.        f
d750: 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20  or(k=0; k<nKey; 
d760: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
d770: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d780: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
d790: 69 53 6f 72 74 54 61 62 2c 20 69 4b 65 79 2b 2b  iSortTab, iKey++
d7a0: 2c 20 72 65 67 4b 65 79 2b 6b 29 3b 0a 20 20 20  , regKey+k);.   
d7b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
d7c0: 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Jmp = sqlite3Vdb
d7d0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
d7e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d7f0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
d800: 20 4f 50 5f 53 65 65 6b 47 45 2c 20 69 43 73 72   OP_SeekGE, iCsr
d810: 2c 20 69 4a 6d 70 2b 32 2c 20 72 65 67 4b 65 79  , iJmp+2, regKey
d820: 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  , nKey);.       
d830: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d840: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 4c  p4Int(v, OP_IdxL
d850: 45 2c 20 69 43 73 72 2c 20 69 4a 6d 70 2b 33 2c  E, iCsr, iJmp+3,
d860: 20 72 65 67 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a   regKey, nKey);.
d870: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d880: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
d890: 4e 75 6c 6c 52 6f 77 2c 20 69 43 73 72 29 3b 0a  NullRow, iCsr);.
d8a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d8b0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
d8c0: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
d8d0: 2c 20 72 65 67 4b 65 79 2c 20 6e 52 65 66 4b 65  , regKey, nRefKe
d8e0: 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  y);.  }.#endif. 
d8f0: 20 66 6f 72 28 69 3d 6e 43 6f 6c 75 6d 6e 2d 31   for(i=nColumn-1
d900: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 23 69  ; i>=0; i--){.#i
d910: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d920: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
d930: 4e 43 45 53 0a 20 20 20 20 69 66 28 20 61 4f 75  NCES.    if( aOu
d940: 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65  tEx[i].bSorterRe
d950: 66 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  f ){.      sqlit
d960: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
d970: 65 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 70 45 78  e, aOutEx[i].pEx
d980: 70 72 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20  pr, regRow+i);. 
d990: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
d9a0: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
d9b0: 69 52 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28  iRead;.      if(
d9c0: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
d9d0: 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20  OrderByCol ){.  
d9e0: 20 20 20 20 20 20 69 52 65 61 64 20 3d 20 61 4f        iRead = aO
d9f0: 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  utEx[i].u.x.iOrd
da00: 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20 20 20 20  erByCol-1;.     
da10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
da20: 69 52 65 61 64 20 3d 20 69 43 6f 6c 2d 2d 3b 0a  iRead = iCol--;.
da30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
da40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
da50: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
da60: 6f 72 74 54 61 62 2c 20 69 52 65 61 64 2c 20 72  ortTab, iRead, r
da70: 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 20 20  egRow+i);.      
da80: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
da90: 22 25 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e  "%s", aOutEx[i].
daa0: 7a 4e 61 6d 65 3f 61 4f 75 74 45 78 5b 69 5d 2e  zName?aOutEx[i].
dab0: 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69  zName : aOutEx[i
dac0: 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 20 20 7d  ].zSpan));.    }
dad0: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65  .  }.  switch( e
dae0: 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65  Dest ){.    case
daf0: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
db00: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
db10: 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b: {.      sqlit
db20: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
db30: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
db40: 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  rm, regRowid);. 
db50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
db60: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
db70: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
db80: 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  ow, regRowid);. 
db90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dba0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
dbb0: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
dbc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
dbd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
dbe0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
dbf0: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
dc00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
dc10: 6f 6c 75 6d 6e 3d 3d 73 71 6c 69 74 65 33 53 74  olumn==sqlite3St
dc20: 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41  rlen30(pDest->zA
dc30: 66 66 53 64 73 74 29 20 29 3b 0a 20 20 20 20 20  ffSdst) );.     
dc40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dc50: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
dc60: 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f  ord, regRow, nCo
dc70: 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 2c 0a  lumn, regRowid,.
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc90: 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a          pDest->z
dca0: 41 66 66 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e  AffSdst, nColumn
dcb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
dcc0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
dcd0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
dce0: 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29  regRow, nColumn)
dcf0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
dd00: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
dd10: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
dd20: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 2c 20 72  arm, regRowid, r
dd30: 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  egRow, nColumn);
dd40: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
dd50: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
dd60: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  _Mem: {.      /*
dd70: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
dd80: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
dd90: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
dda0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
ddb0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
ddc0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
ddd0: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
dde0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
ddf0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
de00: 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74  tine ); .      t
de10: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
de20: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
de30: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
de40: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
de50: 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ne );.      if( 
de60: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
de70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
de80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
de90: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
dea0: 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43  pDest->iSdst, nC
deb0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
dec0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
ded0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
dee0: 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53  Parse, pDest->iS
def0: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
df00: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
df10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
df20: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
df30: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
df40: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
df50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
df60: 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77 69   }.  if( regRowi
df70: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 65 44 65  d ){.    if( eDe
df80: 73 74 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a 20  st==SRT_Set ){. 
df90: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
dfa0: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
dfb0: 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f  rse, regRow, nCo
dfc0: 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lumn);.    }else
dfd0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
dfe0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
dff0: 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20  arse, regRow);. 
e000: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
e010: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
e020: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29  Parse, regRowid)
e030: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62  ;.  }.  /* The b
e040: 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
e050: 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
e060: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
e070: 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  (v, addrContinue
e080: 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  );.  if( pSort->
e090: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
e0a0: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29  FLAG_UseSorter )
e0b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
e0c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
e0d0: 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20  rterNext, iTab, 
e0e0: 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72  addr); VdbeCover
e0f0: 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b  age(v);.  }else{
e100: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e110: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
e120: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20  t, iTab, addr); 
e130: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
e140: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74  .  }.  if( pSort
e150: 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73 71  ->regReturn ) sq
e160: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
e170: 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53  v, OP_Return, pS
e180: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  ort->regReturn);
e190: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
e1a0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
e1b0: 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a  drBreak);.}../*.
e1c0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
e1d0: 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
e1e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27  containing the '
e1f0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
e200: 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  ' of the.** expr
e210: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68  ession pExpr. Th
e220: 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20  e string may be 
e230: 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69  treated as stati
e240: 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  c by the caller.
e250: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20  .**.** Also try 
e260: 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
e270: 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75  size of the retu
e280: 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72  rned value and r
e290: 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65  eturn that.** re
e2a0: 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64  sult in *pEstWid
e2b0: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  th..**.** The de
e2c0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69  claration type i
e2d0: 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61  s the exact data
e2e0: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
e2f0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
e300: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43  he.** original C
e310: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
e320: 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70  ement if the exp
e330: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
e340: 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c  umn. The.** decl
e350: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
e360: 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69   a ROWID field i
e370: 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74  s INTEGER. Exact
e380: 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65  ly when an expre
e390: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73  ssion.** is cons
e3a0: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
e3b0: 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69  can be complex i
e3c0: 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  n the presence o
e3d0: 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68  f subqueries. Th
e3e0: 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20  e.** result-set 
e3f0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c  expression in al
e400: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
e410: 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ng SELECT statem
e420: 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73  ents is .** cons
e430: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
e440: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
e450: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  ..**.**   SELECT
e460: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
e470: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
e480: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
e490: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
e4a0: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
e4b0: 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  l);.**   SELECT 
e4c0: 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  abc FROM (SELECT
e4d0: 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d   col AS abc FROM
e4e0: 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68   tbl);.** .** Th
e4f0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
e500: 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65  pe for any expre
e510: 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ssion other than
e520: 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c   a column is NUL
e530: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  L..**.** This ro
e540: 75 74 69 6e 65 20 68 61 73 20 65 69 74 68 65 72  utine has either
e550: 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65   3 or 6 paramete
e560: 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  rs depending on 
e570: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
e580: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  * the SQLITE_ENA
e590: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
e5a0: 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ATA compile-time
e5b0: 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e   option is used.
e5c0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
e5d0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
e5e0: 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e  METADATA.# defin
e5f0: 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42  e columnType(A,B
e600: 2c 43 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79  ,C,D,E) columnTy
e610: 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45  peImpl(A,B,C,D,E
e620: 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21 64  ).#else /* if !d
e630: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
e640: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
e650: 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e  DATA) */.# defin
e660: 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42  e columnType(A,B
e670: 2c 43 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79  ,C,D,E) columnTy
e680: 70 65 49 6d 70 6c 28 41 2c 42 29 0a 23 65 6e 64  peImpl(A,B).#end
e690: 69 66 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  if.static const 
e6a0: 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65  char *columnType
e6b0: 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  Impl(.  NameCont
e6c0: 65 78 74 20 2a 70 4e 43 2c 20 0a 23 69 66 6e 64  ext *pNC, .#ifnd
e6d0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e6e0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
e6f0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 0a 23  .  Expr *pExpr.#
e700: 65 6c 73 65 0a 20 20 45 78 70 72 20 2a 70 45 78  else.  Expr *pEx
e710: 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pr,.  const char
e720: 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63   **pzOrigDb,.  c
e730: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
e740: 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63  igTab,.  const c
e750: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 0a  har **pzOrigCol.
e760: 23 65 6e 64 69 66 0a 29 7b 0a 20 20 63 68 61 72  #endif.){.  char
e770: 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20   const *zType = 
e780: 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 23 69 66 64  0;.  int j;.#ifd
e790: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e7a0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
e7b0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
e7c0: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 63 68  OrigDb = 0;.  ch
e7d0: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54  ar const *zOrigT
e7e0: 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  ab = 0;.  char c
e7f0: 6f 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d  onst *zOrigCol =
e800: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   0;.#endif..  as
e810: 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29  sert( pExpr!=0 )
e820: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d  ;.  assert( pNC-
e830: 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a  >pSrcList!=0 );.
e840: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
e850: 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op!=TK_AGG_COLU
e860: 4d 4e 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 72  MN );  /* This r
e870: 6f 75 74 69 6e 65 20 72 75 6e 65 73 20 62 65 66  outine runes bef
e880: 6f 72 65 20 61 67 67 72 65 67 61 74 65 73 0a 20  ore aggregates. 
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8b0: 20 20 20 20 20 20 2a 2a 20 61 72 65 20 70 72 6f        ** are pro
e8c0: 63 65 73 73 65 64 20 2a 2f 0a 20 20 73 77 69 74  cessed */.  swit
e8d0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
e8e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
e8f0: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
e900: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
e910: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61  s a column. Loca
e920: 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65  te the table the
e930: 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67   column is being
e940: 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63  .      ** extrac
e950: 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65  ted from in Name
e960: 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74  Context.pSrcList
e970: 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79  . This table may
e980: 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a   be real.      *
e990: 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  * database table
e9a0: 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
e9b0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
e9c0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
e9d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
e9e0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  ble structure co
e9f0: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
ea00: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
ea10: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20  Select *pS = 0; 
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
ea30: 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e  elect the column
ea40: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
ea50: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  om */.      int 
ea60: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
ea70: 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78  olumn;  /* Index
ea80: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54   of column in pT
ea90: 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  ab */.      whil
eaa0: 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20  e( pNC && !pTab 
eab0: 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69  ){.        SrcLi
eac0: 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
ead0: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
eae0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c        for(j=0;j<
eaf0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26  pTabList->nSrc &
eb00: 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  & pTabList->a[j]
eb10: 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d  .iCursor!=pExpr-
eb20: 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20  >iTable;j++);.  
eb30: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62        if( j<pTab
eb40: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20  List->nSrc ){.  
eb50: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
eb60: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
eb70: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ab;.          pS
eb80: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
eb90: 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ].pSelect;.     
eba0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ebb0: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
ebc0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
ebd0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
ebe0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
ebf0: 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20        /* At one 
ec00: 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68 20  time, code such 
ec10: 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78  as "SELECT new.x
ec20: 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67  " within a trigg
ec30: 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20  er would.       
ec40: 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20 63   ** cause this c
ec50: 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e  ondition to run.
ec60: 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77 65    Since then, we
ec70: 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75 72   have restructur
ec80: 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20 2a  ed how.        *
ec90: 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20 69  * trigger code i
eca0: 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64 20  s generated and 
ecb0: 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  so this conditio
ecc0: 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a  n is no longer .
ecd0: 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69          ** possi
ece0: 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 74  ble. However, it
ecf0: 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74 72   can still be tr
ed00: 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74  ue for statement
ed10: 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20 2a  s like.        *
ed20: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  * the following:
ed30: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
ed40: 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
ed50: 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54  TABLE t1(col INT
ed60: 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20 2a  EGER);.        *
ed70: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
ed80: 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20  CT t1.col) FROM 
ed90: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20  FROM t1;.       
eda0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   **.        ** w
edb0: 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29  hen columnType()
edc0: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
edd0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74 31  e expression "t1
ede0: 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20 20  .col" in the .  
edf0: 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c        ** sub-sel
ee00: 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ect. In this cas
ee10: 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75 6d  e, set the colum
ee20: 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20  n type to NULL, 
ee30: 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  even.        ** 
ee40: 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64  though it should
ee50: 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54 45   really be "INTE
ee60: 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a  GER"..        **
ee70: 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
ee80: 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65   is not a proble
ee90: 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e  m, as the column
eea0: 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c   type of "t1.col
eeb0: 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20 20  " is never.     
eec0: 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e     ** used. When
eed0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
eee0: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
eef0: 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20 20  xpression .     
ef00: 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20 74     ** "(SELECT t
ef10: 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72  1.col)", the cor
ef20: 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65 74  rect type is ret
ef30: 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20 54  urned (see the T
ef40: 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20  K_SELECT.       
ef50: 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f 77   ** branch below
ef60: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  .  */.        br
ef70: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
ef80: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
ef90: 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62 3d   && pExpr->pTab=
efa0: 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69  =pTab );.      i
efb0: 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20  f( pS ){.       
efc0: 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20   /* The "table" 
efd0: 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75  is actually a su
efe0: 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69  b-select or a vi
eff0: 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ew in the FROM c
f000: 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  lause.        **
f010: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
f020: 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e  tatement. Return
f030: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
f040: 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e   type and origin
f050: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
f060: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d   for the result-
f070: 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  set column of th
f080: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20  e sub-select..  
f090: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
f0a0: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
f0b0: 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d  iCol<pS->pEList-
f0c0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
f0d0: 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69      /* If iCol i
f0e0: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
f0f0: 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
f100: 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74  ssion requests t
f110: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
f120: 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62  rowid of the sub
f130: 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
f140: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
f150: 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a   is legal (see .
f160: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73            ** tes
f170: 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32  t case misc2.2.2
f180: 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76  ) - it always ev
f190: 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e  aluates to NULL.
f1a0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
f1b0: 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74          NameCont
f1c0: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20  ext sNC;.       
f1d0: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
f1e0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
f1f0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
f200: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
f210: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
f220: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
f230: 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   pNC;.          
f240: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
f250: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
f260: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
f270: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26  mnType(&sNC, p,&
f280: 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61  zOrigDb,&zOrigTa
f290: 62 2c 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20  b,&zOrigCol); . 
f2a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f2b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
f2c0: 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72   A real table or
f2d0: 20 61 20 43 54 45 20 74 61 62 6c 65 20 2a 2f 0a   a CTE table */.
f2e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f2f0: 21 70 53 20 29 3b 0a 23 69 66 64 65 66 20 53 51  !pS );.#ifdef SQ
f300: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
f310: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
f320: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
f330: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
f340: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Key;.        ass
f350: 65 72 74 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f  ert( iCol==XN_RO
f360: 57 49 44 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  WID || (iCol>=0 
f370: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
f380: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ol) );.        i
f390: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
f3a0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
f3b0: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20  INTEGER";.      
f3c0: 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22      zOrigCol = "
f3d0: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20  rowid";.        
f3e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
f3f0: 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62   zOrigCol = pTab
f400: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
f410: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  me;.          zT
f420: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c  ype = sqlite3Col
f430: 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d 3e 61  umnType(&pTab->a
f440: 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20  Col[iCol],0);.  
f450: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f460: 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d  zOrigTab = pTab-
f470: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
f480: 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20  if( pNC->pParse 
f490: 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  && pTab->pSchema
f4a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
f4b0: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
f4c0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43  chemaToIndex(pNC
f4d0: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  ->pParse->db, pT
f4e0: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
f4f0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20          zOrigDb 
f500: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pNC->pParse->d
f510: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
f520: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Name;.        }.
f530: 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 61 73  #else.        as
f540: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52  sert( iCol==XN_R
f550: 4f 57 49 44 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  OWID || (iCol>=0
f560: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
f570: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20  Col) );.        
f580: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
f590: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
f5a0: 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20  "INTEGER";.     
f5b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f5c0: 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69      zType = sqli
f5d0: 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70  te3ColumnType(&p
f5e0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c  Tab->aCol[iCol],
f5f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  0);.        }.#e
f600: 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
f610: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f620: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f630: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
f640: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
f650: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
f660: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
f670: 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75  sub-select. Retu
f680: 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rn the declarati
f690: 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20  on type and.    
f6a0: 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f    ** origin info
f6b0: 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20   for the single 
f6c0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
f6d0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
f6e0: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20  SELECT.      ** 
f6f0: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
f700: 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f   */.      NameCo
f710: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
f720: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45   Select *pS = pE
f730: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
f740: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
f750: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  pS->pEList->a[0]
f760: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  .pExpr;.      as
f770: 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f  sert( ExprHasPro
f780: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
f790: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
f7a0: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
f7b0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
f7c0: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
f7d0: 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50  NC;.      sNC.pP
f7e0: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
f7f0: 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20  se;.      zType 
f800: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
f810: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
f820: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
f830: 67 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72  gCol); .      br
f840: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
f850: 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  f.  }..#ifdef SQ
f860: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
f870: 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20 0a 20 20  MN_METADATA  .  
f880: 69 66 28 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a  if( pzOrigDb ){.
f890: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72      assert( pzOr
f8a0: 69 67 54 61 62 20 26 26 20 70 7a 4f 72 69 67 43  igTab && pzOrigC
f8b0: 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  ol );.    *pzOri
f8c0: 67 44 62 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20  gDb = zOrigDb;. 
f8d0: 20 20 20 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20     *pzOrigTab = 
f8e0: 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20 20 2a 70  zOrigTab;.    *p
f8f0: 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67  zOrigCol = zOrig
f900: 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  Col;.  }.#endif.
f910: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
f920: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
f930: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
f940: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
f950: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
f960: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
f970: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
f980: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
f990: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
f9a0: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
f9b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
f9c0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
f9d0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
f9e0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
f9f0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
fa00: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
fa10: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
fa20: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
fa30: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
fa40: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
fa50: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a  E_OMIT_DECLTYPE.
fa60: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
fa70: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
fa80: 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
fa90: 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72  t sNC;.  sNC.pSr
faa0: 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
fab0: 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
fac0: 20 70 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70   pParse;.  sNC.p
fad0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Next = 0;.  for(
fae0: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
faf0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
fb00: 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
fb10: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
fb20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
fb30: 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ype;.#ifdef SQLI
fb40: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
fb50: 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f  _METADATA.    co
fb60: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44  nst char *zOrigD
fb70: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
fb80: 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20   char *zOrigTab 
fb90: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
fba0: 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20  har *zOrigCol = 
fbb0: 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63  0;.    zType = c
fbc0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
fbd0: 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f  p, &zOrigDb, &zO
fbe0: 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f  rigTab, &zOrigCo
fbf0: 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  l);..    /* The 
fc00: 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69  vdbe must make i
fc10: 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74  ts own copy of t
fc20: 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61  he column-type a
fc30: 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a  nd other .    **
fc40: 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63   column specific
fc50: 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73   strings, in cas
fc60: 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  e the schema is 
fc70: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
fc80: 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  s.    ** virtual
fc90: 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65   machine is dele
fca0: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
fcb0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
fcc0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
fcd0: 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f  AME_DATABASE, zO
fce0: 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52  rigDb, SQLITE_TR
fcf0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
fd00: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
fd10: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
fd20: 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61  E_TABLE, zOrigTa
fd30: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
fd40: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
fd50: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
fd60: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f  v, i, COLNAME_CO
fd70: 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20  LUMN, zOrigCol, 
fd80: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
fd90: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79  );.#else.    zTy
fda0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
fdb0: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
fdc0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
fdd0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
fde0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
fdf0: 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70  E_DECLTYPE, zTyp
fe00: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
fe10: 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ENT);.  }.#endif
fe20: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
fe30: 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
fe40: 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E) */.}.../*.** 
fe50: 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75  Compute the colu
fe60: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 53  mn names for a S
fe70: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
fe80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  .**.** The only 
fe90: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 53  guarantee that S
fea0: 51 4c 69 74 65 20 6d 61 6b 65 73 20 61 62 6f 75  QLite makes abou
feb0: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  t column names i
fec0: 73 20 74 68 61 74 20 69 66 20 74 68 65 0a 2a 2a  s that if the.**
fed0: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20 41   column has an A
fee0: 53 20 63 6c 61 75 73 65 20 61 73 73 69 67 6e 69  S clause assigni
fef0: 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c 20 74 68  ng it a name, th
ff00: 61 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 6e  at will be the n
ff10: 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54 68 61  ame used..** Tha
ff20: 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f  t is the only do
ff30: 63 75 6d 65 6e 74 65 64 20 67 75 61 72 61 6e 74  cumented guarant
ff40: 65 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 63 6f  ee.  However, co
ff50: 75 6e 74 6c 65 73 73 20 61 70 70 6c 69 63 61 74  untless applicat
ff60: 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f 70 65  ions.** develope
ff70: 64 20 6f 76 65 72 20 74 68 65 20 79 65 61 72 73  d over the years
ff80: 20 68 61 76 65 20 6d 61 64 65 20 62 61 73 65 6c   have made basel
ff90: 65 73 73 20 61 73 73 75 6d 70 74 69 6f 6e 73 20  ess assumptions 
ffa0: 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  about column nam
ffb0: 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c 20 62  es.** and will b
ffc0: 72 65 61 6b 20 69 66 20 74 68 6f 73 65 20 61 73  reak if those as
ffd0: 73 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e 67 65  sumptions change
ffe0: 73 2e 20 20 48 65 6e 63 65 2c 20 75 73 65 20 65  s.  Hence, use e
fff0: 78 74 72 65 6d 65 20 63 61 75 74 69 6f 6e 0a 2a  xtreme caution.*
10000 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67  * when modifying
10010 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
10020 20 61 76 6f 69 64 20 62 72 65 61 6b 69 6e 67 20   avoid breaking 
10030 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65  legacy..**.** Se
10040 65 20 41 6c 73 6f 3a 20 73 71 6c 69 74 65 33 43  e Also: sqlite3C
10050 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
10060 73 74 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  st().**.** The P
10070 52 41 47 4d 41 20 73 68 6f 72 74 5f 63 6f 6c 75  RAGMA short_colu
10080 6d 6e 5f 6e 61 6d 65 73 20 61 6e 64 20 50 52 41  mn_names and PRA
10090 47 4d 41 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f  GMA full_column_
100a0 6e 61 6d 65 73 20 73 65 74 74 69 6e 67 73 20 61  names settings a
100b0 72 65 0a 2a 2a 20 64 65 70 72 65 63 61 74 65 64  re.** deprecated
100c0 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 73  .  The default s
100d0 65 74 74 69 6e 67 20 69 73 20 73 68 6f 72 74 3d  etting is short=
100e0 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 2e 20 20 39  ON, full=OFF.  9
100f0 39 2e 39 25 20 6f 66 20 61 6c 6c 0a 2a 2a 20 61  9.9% of all.** a
10100 70 70 6c 69 63 61 74 69 6f 6e 73 20 73 68 6f 75  pplications shou
10110 6c 64 20 6f 70 65 72 61 74 65 20 74 68 69 73 20  ld operate this 
10120 77 61 79 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  way.  Neverthele
10130 73 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 73  ss, we need to s
10140 75 70 70 6f 72 74 20 74 68 65 0a 2a 2a 20 6f 74  upport the.** ot
10150 68 65 72 20 6d 6f 64 65 73 20 66 6f 72 20 6c 65  her modes for le
10160 67 61 63 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73  gacy:.**.**    s
10170 68 6f 72 74 3d 4f 46 46 2c 20 66 75 6c 6c 3d 4f  hort=OFF, full=O
10180 46 46 3a 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20  FF:      Column 
10190 6e 61 6d 65 20 69 73 20 74 68 65 20 74 65 78 74  name is the text
101a0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
101b0 6f 6e 20 68 61 73 20 69 74 0a 2a 2a 20 20 20 20  on has it.**    
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101d0 20 20 20 20 20 20 20 20 20 20 6f 72 69 67 69 6e            origin
101e0 61 6c 6c 79 20 61 70 70 65 61 72 73 20 69 6e 20  ally appears in 
101f0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
10200 6d 65 6e 74 2e 20 20 49 6e 0a 2a 2a 20 20 20 20  ment.  In.**    
10210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10220 20 20 20 20 20 20 20 20 20 20 6f 74 68 65 72 20            other 
10230 77 6f 72 64 73 2c 20 74 68 65 20 7a 53 70 61 6e  words, the zSpan
10240 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 65   of the result e
10250 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
10260 20 20 20 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75      short=ON, fu
10270 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20 20 28 54  ll=OFF:       (T
10280 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
10290 6c 74 20 73 65 74 74 69 6e 67 29 2e 20 20 49 66  lt setting).  If
102a0 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20   the result.**  
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102c0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66 65              refe
102d0 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61  rs directly to a
102e0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74   table column, t
102f0 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  hen the.**      
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10310 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 63          result c
10320 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6a 75  olumn name is ju
10330 73 74 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  st the table col
10340 75 6d 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  umn.**          
10350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10360 20 20 20 20 6e 61 6d 65 3a 20 43 4f 4c 55 4d 4e      name: COLUMN
10370 2e 20 20 4f 74 68 65 72 77 69 73 65 20 75 73 65  .  Otherwise use
10380 20 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20   zSpan..**.**   
10390 20 66 75 6c 6c 3d 4f 4e 2c 20 73 68 6f 72 74 3d   full=ON, short=
103a0 41 4e 59 3a 20 20 20 20 20 20 20 49 66 20 74 68  ANY:       If th
103b0 65 20 72 65 73 75 6c 74 20 72 65 66 65 72 73 20  e result refers 
103c0 64 69 72 65 63 74 6c 79 20 74 6f 20 61 20 74 61  directly to a ta
103d0 62 6c 65 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 20  ble column,.**  
103e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103f0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 6e              then
10400 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75   the result colu
10410 6d 6e 20 6e 61 6d 65 20 77 69 74 68 20 74 68 65  mn name with the
10420 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20   table name.**  
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10440 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66              pref
10450 69 78 2c 20 65 78 3a 20 54 41 42 4c 45 2e 43 4f  ix, ex: TABLE.CO
10460 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73 65  LUMN.  Otherwise
10470 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2f 0a 73   use zSpan..*/.s
10480 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
10490 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a  ateColumnNames(.
104a0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
104b0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
104c0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
104d0 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
104e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 6c   /* Generate col
104f0 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 74 68  umn names for th
10500 69 73 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  is SELECT statem
10510 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ent */.){.  Vdbe
10520 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
10530 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
10540 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 53  Table *pTab;.  S
10550 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
10560 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
10570 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  List;.  sqlite3 
10580 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
10590 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65  ;.  int fullName
105a0 3b 20 20 20 20 2f 2a 20 54 41 42 4c 45 2e 43 4f  ;    /* TABLE.CO
105b0 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c  LUMN if no AS cl
105c0 61 75 73 65 20 61 6e 64 20 69 73 20 61 20 64 69  ause and is a di
105d0 72 65 63 74 20 74 61 62 6c 65 20 72 65 66 20 2a  rect table ref *
105e0 2f 0a 20 20 69 6e 74 20 73 72 63 4e 61 6d 65 3b  /.  int srcName;
105f0 20 20 20 20 20 2f 2a 20 43 4f 4c 55 4d 4e 20 6f       /* COLUMN o
10600 72 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69  r TABLE.COLUMN i
10610 66 20 6e 6f 20 41 53 20 63 6c 61 75 73 65 20 61  f no AS clause a
10620 6e 64 20 69 73 20 64 69 72 65 63 74 20 2a 2f 0a  nd is direct */.
10630 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10640 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f  OMIT_EXPLAIN.  /
10650 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
10660 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68  EXPLAIN, skip th
10670 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28  is step */.  if(
10680 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
10690 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
106a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
106b0 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d  ( pParse->colNam
106c0 65 73 53 65 74 20 29 20 72 65 74 75 72 6e 3b 0a  esSet ) return;.
106d0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
106e0 73 20 61 72 65 20 64 65 74 65 72 6d 69 6e 65 64  s are determined
106f0 20 62 79 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   by the left-mos
10700 74 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70  t term of a comp
10710 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a 2f 0a 20  ound select */. 
10720 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
10730 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63  >pPrior ) pSelec
10740 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  t = pSelect->pPr
10750 69 6f 72 3b 0a 20 20 53 45 4c 45 43 54 54 52 41  ior;.  SELECTTRA
10760 43 45 28 31 2c 70 50 61 72 73 65 2c 70 53 65 6c  CE(1,pParse,pSel
10770 65 63 74 2c 28 22 67 65 6e 65 72 61 74 69 6e 67  ect,("generating
10780 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 5c 6e 22   column names\n"
10790 29 29 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  ));.  pTabList =
107a0 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
107b0 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
107c0 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73  ct->pEList;.  as
107d0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
107e0 61 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74  assert( pTabList
107f0 21 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  !=0 );.  pParse-
10800 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
10810 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 20 3d 20 28  ;.  fullName = (
10820 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
10830 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
10840 21 3d 30 3b 0a 20 20 73 72 63 4e 61 6d 65 20 3d  !=0;.  srcName =
10850 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
10860 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
10870 65 73 29 21 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61  es)!=0 || fullNa
10880 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  me;.  sqlite3Vdb
10890 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70  eSetNumCols(v, p
108a0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
108b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
108c0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
108d0 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
108e0 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
108f0 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  r;..    assert( 
10900 70 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  p!=0 );.    asse
10910 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47  rt( p->op!=TK_AG
10920 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20  G_COLUMN );  /* 
10930 41 67 67 20 70 72 6f 63 65 73 73 69 6e 67 20 68  Agg processing h
10940 61 73 20 6e 6f 74 20 72 75 6e 20 79 65 74 20 2a  as not run yet *
10950 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
10960 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
10970 7c 20 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 20  | p->pTab!=0 ); 
10980 2f 2a 20 43 6f 76 65 72 69 6e 67 20 69 64 78 20  /* Covering idx 
10990 6e 6f 74 20 79 65 74 20 63 6f 64 65 64 20 2a 2f  not yet coded */
109a0 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d  .    if( pEList-
109b0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
109c0 20 20 20 20 20 2f 2a 20 41 6e 20 41 53 20 63 6c       /* An AS cl
109d0 61 75 73 65 20 61 6c 77 61 79 73 20 74 61 6b 65  ause always take
109e0 73 20 66 69 72 73 74 20 70 72 69 6f 72 69 74 79  s first priority
109f0 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
10a00 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
10a10 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[i].zName;.    
10a20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
10a30 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
10a40 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
10a50 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
10a60 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ENT);.    }else 
10a70 69 66 28 20 73 72 63 4e 61 6d 65 20 26 26 20 70  if( srcName && p
10a80 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
10a90 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
10aa0 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Col;.      int i
10ab0 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e  Col = p->iColumn
10ac0 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
10ad0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 61 73  ->pTab;.      as
10ae0 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
10af0 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
10b00 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
10b10 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
10b20 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
10b30 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
10b40 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
10b50 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
10b60 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  <0 ){.        zC
10b70 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
10b80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10b90 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     zCol = pTab->
10ba0 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
10bb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10bc0 69 66 28 20 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a  if( fullName ){.
10bd0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
10be0 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
10bf0 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
10c00 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
10c10 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
10c20 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , zCol);.       
10c30 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
10c40 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
10c50 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
10c60 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
10c70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
10c80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10c90 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
10ca0 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
10cb0 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  , zCol, SQLITE_T
10cc0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
10cd0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
10ce0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10cf0 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  z = pEList->a[i]
10d00 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20  .zSpan;.      z 
10d10 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33  = z==0 ? sqlite3
10d20 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c  MPrintf(db, "col
10d30 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73  umn%d", i+1) : s
10d40 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
10d50 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  b, z);.      sql
10d60 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
10d70 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
10d80 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45  _NAME, z, SQLITE
10d90 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
10da0 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43  .  }.  generateC
10db0 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
10dc0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
10dd0 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ist);.}../*.** G
10de0 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
10df0 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20 69  on list (which i
10e00 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73  s really the lis
10e10 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
10e20 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68  .** that form th
10e30 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
10e40 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
10e50 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72  nt) compute appr
10e60 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d  opriate.** colum
10e70 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61  n names for a ta
10e80 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68  ble that would h
10e90 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
10ea0 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  on list..**.** A
10eb0 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ll column names 
10ec0 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a  will be unique..
10ed0 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63  **.** Only the c
10ee0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20  olumn names are 
10ef0 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d  computed.  Colum
10f00 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e  n.zType, Column.
10f10 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74  zColl,.** and ot
10f20 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f  her fields of Co
10f30 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e  lumn are zeroed.
10f40 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
10f50 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
10f60 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  ss.  If a memory
10f70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
10f80 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f  r occurs,.** sto
10f90 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f  re NULL in *paCo
10fa0 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f  l and 0 in *pnCo
10fb0 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  l and return SQL
10fc0 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a  ITE_NOMEM..**.**
10fd0 20 54 68 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e   The only guaran
10fe0 74 65 65 20 74 68 61 74 20 53 51 4c 69 74 65 20  tee that SQLite 
10ff0 6d 61 6b 65 73 20 61 62 6f 75 74 20 63 6f 6c 75  makes about colu
11000 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74 68 61 74  mn names is that
11010 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   if the.** colum
11020 6e 20 68 61 73 20 61 6e 20 41 53 20 63 6c 61 75  n has an AS clau
11030 73 65 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20  se assigning it 
11040 61 20 6e 61 6d 65 2c 20 74 68 61 74 20 77 69 6c  a name, that wil
11050 6c 20 62 65 20 74 68 65 20 6e 61 6d 65 20 75 73  l be the name us
11060 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69 73 20 74  ed..** That is t
11070 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74  he only document
11080 65 64 20 67 75 61 72 61 6e 74 65 65 2e 20 20 48  ed guarantee.  H
11090 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73  owever, countles
110a0 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a  s applications.*
110b0 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f 76 65 72  * developed over
110c0 20 74 68 65 20 79 65 61 72 73 20 68 61 76 65 20   the years have 
110d0 6d 61 64 65 20 62 61 73 65 6c 65 73 73 20 61 73  made baseless as
110e0 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20  sumptions about 
110f0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20  column names.** 
11100 61 6e 64 20 77 69 6c 6c 20 62 72 65 61 6b 20 69  and will break i
11110 66 20 74 68 6f 73 65 20 61 73 73 75 6d 70 74 69  f those assumpti
11120 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20 20 48 65  ons changes.  He
11130 6e 63 65 2c 20 75 73 65 20 65 78 74 72 65 6d 65  nce, use extreme
11140 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e   caution.** when
11150 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 69 73 20   modifying this 
11160 72 6f 75 74 69 6e 65 20 74 6f 20 61 76 6f 69 64  routine to avoid
11170 20 62 72 65 61 6b 69 6e 67 20 6c 65 67 61 63 79   breaking legacy
11180 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f  ..**.** See Also
11190 3a 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  : generateColumn
111a0 4e 61 6d 65 73 28 29 0a 2a 2f 0a 69 6e 74 20 73  Names().*/.int s
111b0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
111c0 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
111d0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
111e0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
111f0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
11200 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
11210 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73       /* Expr lis
11220 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  t from which to 
11230 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61  derive column na
11240 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e  mes */.  i16 *pn
11250 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
11260 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
11270 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
11280 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  here */.  Column
11290 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20   **paCol        
112a0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
112b0 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  ew column list h
112c0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
112d0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
112e0 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62  ->db;   /* Datab
112f0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
11300 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
11310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11320 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
11330 20 2a 2f 0a 20 20 75 33 32 20 63 6e 74 3b 20 20   */.  u32 cnt;  
11340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11350 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64    /* Index added
11360 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d   to make the nam
11370 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f  e unique */.  Co
11380 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f  lumn *aCol, *pCo
11390 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  l;        /* For
113a0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65   looping over re
113b0 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
113c0 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
113e0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
113f0 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
11400 20 73 65 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a   set */.  char *
11410 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
11420 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
11430 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
11440 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
11450 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
11460 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
11470 20 2a 2f 0a 20 20 48 61 73 68 20 68 74 3b 20 20   */.  Hash ht;  
11480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11490 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
114a0 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
114b0 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 48 61 73  */..  sqlite3Has
114c0 68 49 6e 69 74 28 26 68 74 29 3b 0a 20 20 69 66  hInit(&ht);.  if
114d0 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20  ( pEList ){.    
114e0 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
114f0 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d  Expr;.    aCol =
11500 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
11510 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
11520 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a  aCol[0])*nCol);.
11530 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 43      testcase( aC
11540 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ol==0 );.    if(
11550 20 6e 43 6f 6c 3e 33 32 37 36 37 20 29 20 6e 43   nCol>32767 ) nC
11560 6f 6c 20 3d 20 33 32 37 36 37 3b 0a 20 20 7d 65  ol = 32767;.  }e
11570 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
11580 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b  0;.    aCol = 0;
11590 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
115a0 43 6f 6c 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29  Col==(i16)nCol )
115b0 3b 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f  ;.  *pnCol = nCo
115c0 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43  l;.  *paCol = aC
115d0 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ol;..  for(i=0, 
115e0 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f  pCol=aCol; i<nCo
115f0 6c 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  l && !db->malloc
11600 46 61 69 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f  Failed; i++, pCo
11610 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74  l++){.    /* Get
11620 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
11630 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c  name for the col
11640 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  umn.    */.    i
11650 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  f( (zName = pELi
11660 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21  st->a[i].zName)!
11670 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
11680 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e  f the column con
11690 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61  tains an "AS <na
116a0 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65  me>" phrase, use
116b0 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e   <name> as the n
116c0 61 6d 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ame */.    }else
116d0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
116e0 6f 6c 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  olExpr = sqlite3
116f0 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
11700 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
11710 70 72 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  pr);.      while
11720 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
11730 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
11740 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f    pColExpr = pCo
11750 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  lExpr->pRight;. 
11760 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
11770 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ColExpr!=0 );.  
11780 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
11790 72 74 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  rt( pColExpr->op
117a0 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
117b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
117c0 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  lExpr->op==TK_CO
117d0 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
117e0 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75  /* For columns u
117f0 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  se the column na
11800 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  me name */.     
11810 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43     int iCol = pC
11820 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  olExpr->iColumn;
11830 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
11840 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d  pTab = pColExpr-
11850 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61  >pTab;.        a
11860 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
11870 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
11880 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
11890 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
118a0 20 20 20 7a 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e     zName = iCol>
118b0 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  =0 ? pTab->aCol[
118c0 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72  iCol].zName : "r
118d0 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
118e0 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d  se if( pColExpr-
118f0 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
11900 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
11910 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
11920 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  ColExpr, EP_IntV
11930 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
11940 20 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 45 78 70   zName = pColExp
11950 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
11960 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11970 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69    /* Use the ori
11980 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68  ginal text of th
11990 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  e column express
119a0 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20  ion as its name 
119b0 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  */.        zName
119c0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
119d0 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  zSpan;.      }. 
119e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e 61     }.    if( zNa
119f0 6d 65 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  me ){.      zNam
11a00 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
11a10 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  Dup(db, zName);.
11a20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11a30 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
11a40 4d 50 72 69 6e 74 66 28 64 62 2c 22 63 6f 6c 75  MPrintf(db,"colu
11a50 6d 6e 25 64 22 2c 69 2b 31 29 3b 0a 20 20 20 20  mn%d",i+1);.    
11a60 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
11a70 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ure the column n
11a80 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20  ame is unique.  
11a90 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e  If the name is n
11aa0 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a  ot unique,.    *
11ab0 2a 20 61 70 70 65 6e 64 20 61 6e 20 69 6e 74 65  * append an inte
11ac0 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20  ger to the name 
11ad0 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d  so that it becom
11ae0 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a  es unique..    *
11af0 2f 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20  /.    cnt = 0;. 
11b00 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 20     while( zName 
11b10 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 46 69  && sqlite3HashFi
11b20 6e 64 28 26 68 74 2c 20 7a 4e 61 6d 65 29 21 3d  nd(&ht, zName)!=
11b30 30 20 29 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65  0 ){.      nName
11b40 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
11b50 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  30(zName);.     
11b60 20 69 66 28 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a   if( nName>0 ){.
11b70 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 6e 4e          for(j=nN
11b80 61 6d 65 2d 31 3b 20 6a 3e 30 20 26 26 20 73 71  ame-1; j>0 && sq
11b90 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61  lite3Isdigit(zNa
11ba0 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20  me[j]); j--){}. 
11bb0 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
11bc0 5b 6a 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65  [j]==':' ) nName
11bd0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = j;.      }.  
11be0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
11bf0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
11c00 25 2e 2a 7a 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c  %.*z:%u", nName,
11c10 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a   zName, ++cnt);.
11c20 20 20 20 20 20 20 69 66 28 20 63 6e 74 3e 33 20        if( cnt>3 
11c30 29 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d  ) sqlite3_random
11c40 6e 65 73 73 28 73 69 7a 65 6f 66 28 63 6e 74 29  ness(sizeof(cnt)
11c50 2c 20 26 63 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  , &cnt);.    }. 
11c60 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
11c70 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69   zName;.    sqli
11c80 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74  te3ColumnPropert
11c90 69 65 73 46 72 6f 6d 4e 61 6d 65 28 30 2c 20 70  iesFromName(0, p
11ca0 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  Col);.    if( zN
11cb0 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48 61  ame && sqlite3Ha
11cc0 73 68 49 6e 73 65 72 74 28 26 68 74 2c 20 7a 4e  shInsert(&ht, zN
11cd0 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c  ame, pCol)==pCol
11ce0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11cf0 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
11d00 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
11d10 65 33 48 61 73 68 43 6c 65 61 72 28 26 68 74 29  e3HashClear(&ht)
11d20 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
11d30 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
11d40 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  for(j=0; j<i; j+
11d50 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
11d60 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
11d70 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [j].zName);.    
11d80 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
11d90 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20  ree(db, aCol);. 
11da0 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20     *paCol = 0;. 
11db0 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20     *pnCol = 0;. 
11dc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11dd0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
11de0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11df0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
11e00 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  d type and colla
11e10 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
11e20 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73   to a column lis
11e30 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20  t based on.** a 
11e40 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11e50 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c  ..** .** The col
11e60 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61  umn list presuma
11e70 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65  bly came from se
11e80 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46  lectColumnNamesF
11e90 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a  romExprList()..*
11ea0 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
11eb0 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73  t has only names
11ec0 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63  , not types or c
11ed0 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73  ollations.  This
11ee0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  .** routine goes
11ef0 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64   through and add
11f00 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64 20  s the types and 
11f10 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  collations..**.*
11f20 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
11f30 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c  equires that all
11f40 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   identifiers in 
11f50 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  the SELECT.** st
11f60 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c  atement be resol
11f70 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ved..*/.void sql
11f80 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c  ite3SelectAddCol
11f90 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
11fa0 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
11fb0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
11fc0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73  Parsing contexts
11fd0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
11fe0 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  b,          /* A
11ff0 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69  dd column type i
12000 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
12010 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65  is table */.  Se
12020 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
12030 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73      /* SELECT us
12040 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
12050 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
12060 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ions */.){.  sql
12070 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
12080 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e  e->db;.  NameCon
12090 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75  text sNC;.  Colu
120a0 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c  mn *pCol;.  Coll
120b0 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
120c0 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a  t i;.  Expr *p;.
120d0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
120e0 74 5f 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73  t_item *a;..  as
120f0 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30  sert( pSelect!=0
12100 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
12110 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
12120 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21   & SF_Resolved)!
12130 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
12140 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c  pTab->nCol==pSel
12150 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
12160 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
12170 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
12180 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12190 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d   ) return;.  mem
121a0 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
121b0 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
121c0 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c  .pSrcList = pSel
121d0 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d  ect->pSrc;.  a =
121e0 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
121f0 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ->a;.  for(i=0, 
12200 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
12210 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
12220 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
12230 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
12240 70 65 3b 0a 20 20 20 20 69 6e 74 20 6e 2c 20 6d  pe;.    int n, m
12250 3b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70  ;.    p = a[i].p
12260 45 78 70 72 3b 0a 20 20 20 20 7a 54 79 70 65 20  Expr;.    zType 
12270 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
12280 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  C, p, 0, 0, 0);.
12290 20 20 20 20 2f 2a 20 70 43 6f 6c 2d 3e 73 7a 45      /* pCol->szE
122a0 73 74 20 3d 20 2e 2e 2e 20 2f 2f 20 43 6f 6c 75  st = ... // Colu
122b0 6d 6e 20 73 69 7a 65 20 65 73 74 20 66 6f 72 20  mn size est for 
122c0 53 45 4c 45 43 54 20 74 61 62 6c 65 73 20 6e 65  SELECT tables ne
122d0 76 65 72 20 75 73 65 64 20 2a 2f 0a 20 20 20 20  ver used */.    
122e0 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
122f0 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
12300 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28  nity(p);.    if(
12310 20 7a 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20   zType ){.      
12320 6d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  m = sqlite3Strle
12330 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20  n30(zType);.    
12340 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
12350 6c 65 6e 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  len30(pCol->zNam
12360 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e  e);.      pCol->
12370 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
12380 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64  bReallocOrFree(d
12390 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  b, pCol->zName, 
123a0 6e 2b 6d 2b 32 29 3b 0a 20 20 20 20 20 20 69 66  n+m+2);.      if
123b0 28 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b  ( pCol->zName ){
123c0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
123d0 26 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31  &pCol->zName[n+1
123e0 5d 2c 20 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a  ], zType, m+1);.
123f0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f          pCol->co
12400 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
12410 47 5f 48 41 53 54 59 50 45 3b 0a 20 20 20 20 20  G_HASTYPE;.     
12420 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
12430 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
12440 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  =0 ) pCol->affin
12450 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
12460 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c  _BLOB;.    pColl
12470 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
12480 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
12490 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
124a0 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d  && pCol->zColl==
124b0 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  0 ){.      pCol-
124c0 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >zColl = sqlite3
124d0 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f  DbStrDup(db, pCo
124e0 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
124f0 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a  }.  }.  pTab->sz
12500 54 61 62 52 6f 77 20 3d 20 31 3b 20 2f 2a 20 41  TabRow = 1; /* A
12510 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ny non-zero valu
12520 65 20 77 6f 72 6b 73 20 2a 2f 0a 7d 0a 0a 2f 2a  e works */.}../*
12530 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45  .** Given a SELE
12540 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65  CT statement, ge
12550 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73  nerate a Table s
12560 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
12570 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72  scribes.** the r
12580 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61  esult set of tha
12590 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62  t SELECT..*/.Tab
125a0 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c  le *sqlite3Resul
125b0 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72  tSetOfSelect(Par
125c0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
125d0 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
125e0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73  Table *pTab;.  s
125f0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
12600 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73  rse->db;.  int s
12610 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61  avedFlags;..  sa
12620 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66  vedFlags = db->f
12630 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  lags;.  db->flag
12640 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c  s &= ~SQLITE_Ful
12650 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d  lColNames;.  db-
12660 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
12670 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a  _ShortColNames;.
12680 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
12690 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c  rep(pParse, pSel
126a0 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ect, 0);.  if( p
126b0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
126c0 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28  turn 0;.  while(
126d0 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
126e0 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65   ) pSelect = pSe
126f0 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
12700 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65  db->flags = save
12710 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d  dFlags;.  pTab =
12720 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
12730 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
12740 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20  Table) );.  if( 
12750 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pTab==0 ){.    r
12760 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f  eturn 0;.  }.  /
12770 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52 65 73  * The sqlite3Res
12780 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
12790 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20   is only used n 
127a0 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c  contexts where l
127b0 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73  ookaside.  ** is
127c0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61   disabled */.  a
127d0 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61  ssert( db->looka
127e0 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20 29 3b  side.bDisable );
127f0 0a 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66  .  pTab->nTabRef
12800 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e   = 1;.  pTab->zN
12810 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d  ame = 0;.  pTab-
12820 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
12830 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
12840 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
12850 34 38 35 37 36 29 20 29 3b 0a 20 20 73 71 6c 69  48576) );.  sqli
12860 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
12870 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
12880 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20  Select->pEList, 
12890 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
128a0 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c  ab->aCol);.  sql
128b0 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c  ite3SelectAddCol
128c0 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
128d0 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
128e0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54  , pSelect);.  pT
128f0 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
12900 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
12910 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
12920 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
12930 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
12940 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
12950 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
12960 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45  /*.** Get a VDBE
12970 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
12980 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20  arser context.  
12990 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
129a0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
129b0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
129c0 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c  curs, return NUL
129d0 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65  L and leave a me
129e0 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
129f0 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65  .*/.Vdbe *sqlite
12a00 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a  3GetVdbe(Parse *
12a10 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
12a20 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a  Parse->pVdbe ){.
12a30 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 72 73      return pPars
12a40 65 2d 3e 70 56 64 62 65 3b 0a 20 20 7d 0a 20 20  e->pVdbe;.  }.  
12a50 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70  if( pParse->pTop
12a60 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f  level==0.   && O
12a70 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
12a80 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 53 51  ed(pParse->db,SQ
12a90 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f  LITE_FactorOutCo
12aa0 6e 73 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 50  nst).  ){.    pP
12ab0 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63  arse->okConstFac
12ac0 74 6f 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  tor = 1;.  }.  r
12ad0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
12ae0 65 43 72 65 61 74 65 28 70 50 61 72 73 65 29 3b  eCreate(pParse);
12af0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
12b00 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
12b10 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
12b20 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
12b30 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
12b40 4c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e  Limit expression
12b50 73 2e 20 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  s.  pLimit->pLef
12b60 74 20 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52  t and pLimit->pR
12b70 69 67 68 74 20 68 6f 6c 64 20 74 68 65 20 65 78  ight hold the ex
12b80 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
12b90 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
12ba0 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
12bb0 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65  tement after the
12bc0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
12bd0 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20  T.** keywords.  
12be0 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65  Or NULL if those
12bf0 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d   keywords are om
12c00 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e  itted. iLimit an
12c10 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72  d iOffset .** ar
12c20 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65  e the integer me
12c30 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75  mory register nu
12c40 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65  mbers for counte
12c50 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  rs used to compu
12c60 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74  te .** the limit
12c70 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66   and offset.  If
12c80 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d   there is no lim
12c90 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74  it and/or offset
12ca0 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69  , then .** iLimi
12cb0 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
12cc0 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  e negative..**.*
12cd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
12ce0 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65  hanges the value
12cf0 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20  s of iLimit and 
12d00 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a  iOffset only if.
12d10 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66  ** a limit or of
12d20 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20  fset is defined 
12d30 62 79 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  by pLimit->pLeft
12d40 20 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69   and pLimit->pRi
12d50 67 68 74 2e 20 20 69 4c 69 6d 69 74 0a 2a 2a 20  ght.  iLimit.** 
12d60 61 6e 64 20 69 4f 66 66 73 65 74 20 73 68 6f 75  and iOffset shou
12d70 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
12d80 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
12d90 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
12da0 73 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f  s (zero).** prio
12db0 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
12dc0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
12dd0 20 54 68 65 20 69 4f 66 66 73 65 74 20 72 65 67   The iOffset reg
12de0 69 73 74 65 72 20 28 69 66 20 69 74 20 65 78 69  ister (if it exi
12df0 73 74 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69  sts) is initiali
12e00 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  zed to the value
12e10 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45  .** of the OFFSE
12e20 54 2e 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72  T.  The iLimit r
12e30 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69  egister is initi
12e40 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e  alized to LIMIT.
12e50 20 20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f    Register.** iO
12e60 66 66 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69  ffset+1 is initi
12e70 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b  alized to LIMIT+
12e80 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  OFFSET..**.** On
12e90 6c 79 20 69 66 20 70 4c 69 6d 69 74 2d 3e 70 4c  ly if pLimit->pL
12ea0 65 66 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69  eft!=0 do the li
12eb0 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65  mit registers ge
12ec0 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20  t.** redefined. 
12ed0 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
12ee0 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69  perator uses thi
12ef0 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f  s property to fo
12f00 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65  rce.** the reuse
12f10 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d   of the same lim
12f20 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65  it and offset re
12f30 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d  gisters across m
12f40 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43  ultiple.** SELEC
12f50 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  T statements..*/
12f60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
12f70 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
12f80 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
12f90 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
12fa0 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65   iBreak){.  Vdbe
12fb0 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *v = 0;.  int i
12fc0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Limit = 0;.  int
12fd0 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20   iOffset;.  int 
12fe0 6e 3b 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  n;.  Expr *pLimi
12ff0 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a  t = p->pLimit;..
13000 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
13010 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
13020 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22  .  ** "LIMIT -1"
13030 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c   always shows al
13040 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69  l rows.  There i
13050 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74  s some.  ** cont
13060 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77 68  roversy about wh
13070 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
13080 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62  ehavior should b
13090 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72  e..  ** The curr
130a0 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
130b0 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c  on interprets "L
130c0 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a  IMIT 0" to mean.
130d0 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20    ** no rows..  
130e0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
130f0 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
13100 65 29 3b 0a 20 20 69 66 28 20 70 4c 69 6d 69 74  e);.  if( pLimit
13110 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
13120 70 4c 69 6d 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c  pLimit->op==TK_L
13130 49 4d 49 54 20 29 3b 0a 20 20 20 20 61 73 73 65  IMIT );.    asse
13140 72 74 28 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  rt( pLimit->pLef
13150 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69  t!=0 );.    p->i
13160 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d  Limit = iLimit =
13170 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
13180 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
13190 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
131a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d  .    assert( v!=
131b0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 );.    if( sql
131c0 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
131d0 72 28 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c  r(pLimit->pLeft,
131e0 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71   &n) ){.      sq
131f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13200 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e  v, OP_Integer, n
13210 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
13220 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
13230 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
13240 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d  ));.      if( n=
13250 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
13260 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
13270 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
13280 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26  }else if( n>=0 &
13290 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  & p->nSelectRow>
132a0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75  sqlite3LogEst((u
132b0 36 34 29 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  64)n) ){.       
132c0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
132d0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
132e0 75 36 34 29 6e 29 3b 0a 20 20 20 20 20 20 20 20  u64)n);.        
132f0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
13300 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a 20 20  F_FixedLimit;.  
13310 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
13320 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
13330 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
13340 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 69 4c  Limit->pLeft, iL
13350 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  imit);.      sql
13360 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
13370 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
13380 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
13390 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
133a0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
133b0 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29  "LIMIT counter")
133c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
133d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
133e0 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20  _IfNot, iLimit, 
133f0 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
13400 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
13410 20 20 20 20 69 66 28 20 70 4c 69 6d 69 74 2d 3e      if( pLimit->
13420 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
13430 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66  p->iOffset = iOf
13440 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  fset = ++pParse-
13450 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
13460 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f  rse->nMem++;   /
13470 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78  * Allocate an ex
13480 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72  tra register for
13490 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f   limit+offset */
134a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
134b0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
134c0 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2c 20 69  Limit->pRight, i
134d0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
134e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
134f0 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
13500 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65  , iOffset); Vdbe
13510 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
13520 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
13530 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74  v, "OFFSET count
13540 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  er"));.      sql
13550 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
13560 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74  , OP_OffsetLimit
13570 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65  , iLimit, iOffse
13580 74 2b 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  t+1, iOffset);. 
13590 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
135a0 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53  ((v, "LIMIT+OFFS
135b0 45 54 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ET"));.    }.  }
135c0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
135d0 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
135e0 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65  _SELECT./*.** Re
135f0 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
13600 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  iate collating s
13610 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
13620 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
13630 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  f.** the result 
13640 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  set for the comp
13650 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74  ound-select stat
13660 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75  ement "p".  Retu
13670 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68  rn NULL if.** th
13680 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20  e column has no 
13690 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
136a0 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
136b0 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
136c0 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
136d0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
136e0 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
136f0 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
13700 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65  term of the sele
13710 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  ct that has a co
13720 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
13730 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ..*/.static Coll
13740 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  Seq *multiSelect
13750 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
13760 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
13770 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43  , int iCol){.  C
13780 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20  ollSeq *pRet;.  
13790 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
137a0 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74  .    pRet = mult
137b0 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
137c0 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72  Parse, p->pPrior
137d0 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  , iCol);.  }else
137e0 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  {.    pRet = 0;.
137f0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43    }.  assert( iC
13800 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43  ol>=0 );.  /* iC
13810 6f 6c 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20  ol must be less 
13820 74 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  than p->pEList->
13830 6e 45 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73  nExpr.  Otherwis
13840 65 20 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64  e an error would
13850 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
13860 74 68 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61  thrown during na
13870 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e  me resolution an
13880 64 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68  d we would not h
13890 61 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20  ave gotten.  ** 
138a0 74 68 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66  this far */.  if
138b0 28 20 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57  ( pRet==0 && ALW
138c0 41 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69  AYS(iCol<p->pELi
138d0 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
138e0 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
138f0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
13900 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
13910 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20  [iCol].pExpr);. 
13920 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
13930 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
13940 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
13950 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
13960 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
13970 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
13980 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f  ECT.** with an O
13990 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
139a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
139b0 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75  locates and retu
139c0 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a  rns a KeyInfo.**
139d0 20 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61   structure suita
139e0 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e  ble for implemen
139f0 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
13a00 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  Y..**.** Space t
13a10 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e  o hold the KeyIn
13a20 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
13a30 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
13a40 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e  lloc. The callin
13a50 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  g.** function is
13a60 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
13a70 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74   ensuring that t
13a80 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
13a90 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
13aa0 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reed..*/.static 
13ab0 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65  KeyInfo *multiSe
13ac0 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
13ad0 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
13ae0 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
13af0 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72   nExtra){.  Expr
13b00 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
13b10 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
13b20 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  int nOrderBy = p
13b30 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
13b40 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r;.  sqlite3 *db
13b50 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
13b60 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d   KeyInfo *pRet =
13b70 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
13b80 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42  lloc(db, nOrderB
13b90 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20  y+nExtra, 1);.  
13ba0 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
13bb0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
13bc0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
13bd0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
13be0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
13bf0 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65   *pItem = &pOrde
13c00 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  rBy->a[i];.     
13c10 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70   Expr *pTerm = p
13c20 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
13c30 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
13c40 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54  l;..      if( pT
13c50 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  erm->flags & EP_
13c60 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
13c70 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
13c80 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
13c90 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20  arse, pTerm);.  
13ca0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13cb0 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69     pColl = multi
13cc0 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
13cd0 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e  arse, p, pItem->
13ce0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d  u.x.iOrderByCol-
13cf0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
13d00 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c  pColl==0 ) pColl
13d10 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
13d20 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
13d30 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  By->a[i].pExpr =
13d40 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13d50 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
13d60 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70  String(pParse, p
13d70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  Term, pColl->zNa
13d80 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
13d90 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
13da0 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
13db0 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20  able(pRet) );.  
13dc0 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b      pRet->aColl[
13dd0 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
13de0 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64    pRet->aSortOrd
13df0 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
13e00 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
13e10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
13e20 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23  eturn pRet;.}..#
13e30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13e40 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69  IT_CTE./*.** Thi
13e50 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
13e60 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f  tes VDBE code to
13e70 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e   compute the con
13e80 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52  tent of a WITH R
13e90 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72  ECURSIVE.** quer
13ea0 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  y of the form:.*
13eb0 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76  *.**   <recursiv
13ec0 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65  e-table> AS (<se
13ed0 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e  tup-query> UNION
13ee0 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76   [ALL] <recursiv
13ef0 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20  e-query>).**    
13f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f10 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
13f20 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  _/             \
13f30 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
13f40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
13f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
13f60 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20  >pPrior         
13f70 20 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a               p.*
13f80 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  *.**.** There is
13f90 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66   exactly one ref
13fa0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65  erence to the re
13fb0 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e  cursive-table in
13fc0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
13fd0 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65  .** of recursive
13fe0 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77  -query, marked w
13ff0 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d  ith the SrcList-
14000 3e 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73  >a[].fg.isRecurs
14010 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20  ive flag..**.** 
14020 54 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20  The setup-query 
14030 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e  runs once to gen
14040 65 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c  erate an initial
14050 20 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61   set of rows tha
14060 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51  t go.** into a Q
14070 75 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77  ueue table.  Row
14080 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20  s are extracted 
14090 66 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74  from the Queue t
140a0 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f  able one by.** o
140b0 6e 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78  ne.  Each row ex
140c0 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65  tracted from Que
140d0 75 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20  ue is output to 
140e0 70 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65  pDest.  Then the
140f0 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61   single.** extra
14100 63 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e  cted row (now in
14110 20 74 68 65 20 69 43 75 72 72 65 6e 74 20 74 61   the iCurrent ta
14120 62 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65  ble) becomes the
14130 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a   content of the.
14140 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61 62  ** recursive-tab
14150 6c 65 20 66 6f 72 20 61 20 72 65 63 75 72 73 69  le for a recursi
14160 76 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54  ve-query run.  T
14170 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
14180 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
14190 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61 63  .** is added bac
141a0 6b 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65  k into the Queue
141b0 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e   table.  Then an
141c0 6f 74 68 65 72 20 72 6f 77 20 69 73 20 65 78 74  other row is ext
141d0 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75  racted from Queu
141e0 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65  e.** and the ite
141f0 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ration continues
14200 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65   until the Queue
14210 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
14220 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
14230 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65  mpound query ope
14240 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74  rator is UNION t
14250 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65  hen no duplicate
14260 20 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a   rows are ever.*
14270 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
14280 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e  the Queue table.
14290 20 20 54 68 65 20 69 44 69 73 74 69 6e 63 74 20    The iDistinct 
142a0 74 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f  table keeps a co
142b0 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a  py of all rows.*
142c0 2a 20 74 68 61 74 20 68 61 76 65 20 65 76 65 72  * that have ever
142d0 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69   been inserted i
142e0 6e 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61  nto Queue and ca
142f0 75 73 65 73 20 64 75 70 6c 69 63 61 74 65 73 20  uses duplicates 
14300 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64  to be.** discard
14310 65 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72  ed.  If the oper
14320 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c  ator is UNION AL
14330 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74  L, then duplicat
14340 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  es are allowed..
14350 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75  ** .** If the qu
14360 65 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52  ery has an ORDER
14370 20 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65   BY, then entrie
14380 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 74  s in the Queue t
14390 61 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e  able are kept in
143a0 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64  .** ORDER BY ord
143b0 65 72 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  er and the first
143c0 20 65 6e 74 72 79 20 69 73 20 65 78 74 72 61 63   entry is extrac
143d0 74 65 64 20 66 6f 72 20 65 61 63 68 20 63 79 63  ted for each cyc
143e0 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20  le.  Without.** 
143f0 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  an ORDER BY, the
14400 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20   Queue table is 
14410 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a  just a FIFO..**.
14420 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c  ** If a LIMIT cl
14430 61 75 73 65 20 69 73 20 70 72 6f 76 69 64 65 64  ause is provided
14440 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61  , then the itera
14450 74 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72  tion stops after
14460 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68   LIMIT rows.** h
14470 61 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20  ave been output 
14480 74 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d  to pDest.  A LIM
14490 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73  IT of zero means
144a0 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f   to output no ro
144b0 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61  ws and a.** nega
144c0 74 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73  tive LIMIT means
144d0 20 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72   to output all r
144e0 6f 77 73 2e 20 20 49 66 20 74 68 65 72 65 20 69  ows.  If there i
144f0 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54  s also an OFFSET
14500 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20   clause.** with 
14510 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
14520 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
14530 20 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73 20   OFFSET outputs 
14540 61 72 65 20 64 69 73 63 61 72 64 65 64 20 72 61  are discarded ra
14550 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69  ther.** than bei
14560 6e 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74  ng sent to pDest
14570 2e 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75  .  The LIMIT cou
14580 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  nt does not begi
14590 6e 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46  n until after OF
145a0 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76  FSET.** rows hav
145b0 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a  e been skipped..
145c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
145d0 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72  enerateWithRecur
145e0 73 69 76 65 51 75 65 72 79 28 0a 20 20 50 61 72  siveQuery(.  Par
145f0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
14600 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
14610 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
14620 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
14630 20 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69 76   /* The recursiv
14640 65 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63  e SELECT to be c
14650 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
14660 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
14670 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
14680 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
14690 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
146a0 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
146b0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
146c0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
146d0 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79   recursive query
146e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d   */.  int nCol =
146f0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
14700 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  r;  /* Number of
14710 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
14720 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 20  recursive table 
14730 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
14740 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
14750 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
14760 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64  ed statement und
14770 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
14780 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
14790 74 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  tup = p->pPrior;
147a0 20 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20     /* The setup 
147b0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61  query */.  int a
147c0 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20  ddrTop;         
147d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
147e0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
147f0 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61   int addrCont, a
14800 64 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f  ddrBreak;      /
14810 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42  * CONTINUE and B
14820 52 45 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a  REAK addresses *
14830 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74  /.  int iCurrent
14840 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
14850 20 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74    /* The Current
14860 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
14870 72 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20  regCurrent;     
14880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
14890 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75  ister holding Cu
148a0 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  rrent table */. 
148b0 20 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20   int iQueue;    
148c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
148d0 2a 20 54 68 65 20 51 75 65 75 65 20 74 61 62 6c  * The Queue tabl
148e0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74  e */.  int iDist
148f0 69 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20  inct = 0;       
14900 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72       /* To ensur
14910 65 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73  e unique results
14920 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69   if UNION */.  i
14930 6e 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46  nt eDest = SRT_F
14940 69 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ifo;         /* 
14950 48 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20  How to write to 
14960 51 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63  Queue */.  Selec
14970 74 44 65 73 74 20 64 65 73 74 51 75 65 75 65 3b  tDest destQueue;
14980 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
14990 63 74 44 65 73 74 20 74 61 72 67 65 74 74 69 6e  ctDest targettin
149a0 67 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  g the Queue tabl
149b0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149d0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
149e0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
149f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14a00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
14a10 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72  t code */.  Expr
14a20 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
14a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14a40 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
14a50 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d   */.  Expr *pLim
14a60 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
14a70 20 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d      /* Saved LIM
14a80 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f  IT and OFFSET */
14a90 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c  .  int regLimit,
14aa0 20 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20   regOffset;     
14ab0 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75 73   /* Registers us
14ac0 65 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20  ed by LIMIT and 
14ad0 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20  OFFSET */..  /* 
14ae0 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61  Obtain authoriza
14af0 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63  tion to do a rec
14b00 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
14b10 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
14b20 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
14b30 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c  QLITE_RECURSIVE,
14b40 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
14b50 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73  rn;..  /* Proces
14b60 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  s the LIMIT and 
14b70 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20  OFFSET clauses, 
14b80 69 66 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f  if they exist */
14b90 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73  .  addrBreak = s
14ba0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
14bb0 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65  bel(v);.  p->nSe
14bc0 6c 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20  lectRow = 320;  
14bd0 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77  /* 4 billion row
14be0 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69  s */.  computeLi
14bf0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
14c00 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61  rse, p, addrBrea
14c10 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70  k);.  pLimit = p
14c20 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4c  ->pLimit;.  regL
14c30 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
14c40 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20  ;.  regOffset = 
14c50 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d  p->iOffset;.  p-
14c60 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >pLimit = 0;.  p
14c70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f  ->iLimit = p->iO
14c80 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72  ffset = 0;.  pOr
14c90 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
14ca0 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  rBy;..  /* Locat
14cb0 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  e the cursor num
14cc0 62 65 72 20 6f 66 20 74 68 65 20 43 75 72 72 65  ber of the Curre
14cd0 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f  nt table */.  fo
14ce0 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c  r(i=0; ALWAYS(i<
14cf0 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b  pSrc->nSrc); i++
14d00 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  ){.    if( pSrc-
14d10 3e 61 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75 72  >a[i].fg.isRecur
14d20 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43  sive ){.      iC
14d30 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61  urrent = pSrc->a
14d40 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20  [i].iCursor;.   
14d50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14d60 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
14d70 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65  te cursors numbe
14d80 72 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64  rs for Queue and
14d90 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20   Distinct.  The 
14da0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
14db0 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69  r.  ** the Disti
14dc0 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62  nct table must b
14dd0 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72  e exactly one gr
14de0 65 61 74 65 72 20 74 68 61 6e 20 51 75 65 75 65  eater than Queue
14df0 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66   in order.  ** f
14e00 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73 74 46  or the SRT_DistF
14e10 69 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74  ifo and SRT_Dist
14e20 51 75 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f  Queue destinatio
14e30 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20  ns to work. */. 
14e40 20 69 51 75 65 75 65 20 3d 20 70 50 61 72 73 65   iQueue = pParse
14e50 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20  ->nTab++;.  if( 
14e60 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
14e70 29 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70  ){.    eDest = p
14e80 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69  OrderBy ? SRT_Di
14e90 73 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69  stQueue : SRT_Di
14ea0 73 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73  stFifo;.    iDis
14eb0 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
14ec0 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  nTab++;.  }else{
14ed0 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72  .    eDest = pOr
14ee0 64 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75  derBy ? SRT_Queu
14ef0 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20  e : SRT_Fifo;.  
14f00 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  }.  sqlite3Selec
14f10 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 51  tDestInit(&destQ
14f20 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75  ueue, eDest, iQu
14f30 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  eue);..  /* Allo
14f40 63 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72  cate cursors for
14f50 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c   Current, Queue,
14f60 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a   and Distinct. *
14f70 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d  /.  regCurrent =
14f80 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
14f90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14fa0 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
14fb0 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c  seudo, iCurrent,
14fc0 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f   regCurrent, nCo
14fd0 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72  l);.  if( pOrder
14fe0 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  By ){.    KeyInf
14ff0 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75  o *pKeyInfo = mu
15000 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
15010 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
15020 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, 1);.    sqlit
15030 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
15040 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
15050 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72  , iQueue, pOrder
15060 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a  By->nExpr+2, 0,.
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15080 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
15090 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
150a0 4f 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75  O);.    destQueu
150b0 65 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  e.pOrderBy = pOr
150c0 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a  derBy;.  }else{.
150d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
150e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
150f0 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75  Ephemeral, iQueu
15100 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20  e, nCol);.  }.  
15110 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
15120 22 51 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b  "Queue table"));
15130 0a 20 20 69 66 28 20 69 44 69 73 74 69 6e 63 74  .  if( iDistinct
15140 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f   ){.    p->addrO
15150 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c  penEphm[0] = sql
15160 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15170 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
15180 61 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30  al, iDistinct, 0
15190 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  );.    p->selFla
151a0 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
151b0 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f  emeral;.  }..  /
151c0 2a 20 44 65 74 61 63 68 20 74 68 65 20 4f 52 44  * Detach the ORD
151d0 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f  ER BY clause fro
151e0 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53  m the compound S
151f0 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f  ELECT */.  p->pO
15200 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f  rderBy = 0;..  /
15210 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
15220 6c 74 73 20 6f 66 20 74 68 65 20 73 65 74 75 70  lts of the setup
15230 2d 71 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e  -query in Queue.
15240 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e   */.  pSetup->pN
15250 65 78 74 20 3d 20 30 3b 0a 20 20 45 78 70 6c 61  ext = 0;.  Expla
15260 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
15270 72 73 65 2c 20 31 2c 20 22 53 45 54 55 50 22 29  rse, 1, "SETUP")
15280 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
15290 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
152a0 70 53 65 74 75 70 2c 20 26 64 65 73 74 51 75 65  pSetup, &destQue
152b0 75 65 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70  ue);.  pSetup->p
152c0 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69 66 28 20  Next = p;.  if( 
152d0 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66  rc ) goto end_of
152e0 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79  _recursive_query
152f0 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ;..  /* Find the
15300 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65   next row in the
15310 20 51 75 65 75 65 20 61 6e 64 20 6f 75 74 70 75   Queue and outpu
15320 74 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20  t that row */.  
15330 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
15340 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15350 50 5f 52 65 77 69 6e 64 2c 20 69 51 75 65 75 65  P_Rewind, iQueue
15360 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64  , addrBreak); Vd
15370 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
15380 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68    /* Transfer th
15390 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 51 75  e next row in Qu
153a0 65 75 65 20 6f 76 65 72 20 74 6f 20 43 75 72 72  eue over to Curr
153b0 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ent */.  sqlite3
153c0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
153d0 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65  _NullRow, iCurre
153e0 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74  nt); /* To reset
153f0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f   column cache */
15400 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
15410 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
15420 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
15430 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70  olumn, iQueue, p
15440 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31  OrderBy->nExpr+1
15450 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20  , regCurrent);. 
15460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
15470 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15480 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 51 75   OP_RowData, iQu
15490 65 75 65 2c 20 72 65 67 43 75 72 72 65 6e 74 29  eue, regCurrent)
154a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
154b0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
154c0 44 65 6c 65 74 65 2c 20 69 51 75 65 75 65 29 3b  Delete, iQueue);
154d0 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68  ..  /* Output th
154e0 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20  e single row in 
154f0 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64  Current */.  add
15500 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  rCont = sqlite3V
15510 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
15520 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c  .  codeOffset(v,
15530 20 72 65 67 4f 66 66 73 65 74 2c 20 61 64 64 72   regOffset, addr
15540 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74 49  Cont);.  selectI
15550 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
15560 20 70 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20   p, iCurrent,.  
15570 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c      0, 0, pDest,
15580 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
15590 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67  reak);.  if( reg
155a0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
155b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
155c0 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
155d0 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64  o, regLimit, add
155e0 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
155f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15600 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
15610 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
15620 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20  ddrCont);..  /* 
15630 45 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75  Execute the recu
15640 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b  rsive SELECT tak
15650 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72  ing the single r
15660 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73  ow in Current as
15670 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
15680 66 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76  for the recursiv
15690 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74  e-table. Store t
156a0 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
156b0 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20  e Queue..  */.  
156c0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
156d0 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  & SF_Aggregate )
156e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
156f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
15700 65 63 75 72 73 69 76 65 20 61 67 67 72 65 67 61  ecursive aggrega
15710 74 65 20 71 75 65 72 69 65 73 20 6e 6f 74 20 73  te queries not s
15720 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65  upported");.  }e
15730 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69  lse{.    p->pPri
15740 6f 72 20 3d 20 30 3b 0a 20 20 20 20 45 78 70 6c  or = 0;.    Expl
15750 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
15760 61 72 73 65 2c 20 31 2c 20 22 52 45 43 55 52 53  arse, 1, "RECURS
15770 49 56 45 20 53 54 45 50 22 29 29 3b 0a 20 20 20  IVE STEP"));.   
15780 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15790 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51  Parse, p, &destQ
157a0 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72  ueue);.    asser
157b0 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
157c0 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  );.    p->pPrior
157d0 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a   = pSetup;.  }..
157e0 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e    /* Keep runnin
157f0 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c  g the loop until
15800 20 74 68 65 20 51 75 65 75 65 20 69 73 20 65 6d   the Queue is em
15810 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  pty */.  sqlite3
15820 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
15830 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Top);.  sqlite3V
15840 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15850 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a  v, addrBreak);..
15860 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65  end_of_recursive
15870 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65  _query:.  sqlite
15880 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
15890 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
158a0 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70  OrderBy);.  p->p
158b0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
158c0 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  By;.  p->pLimit 
158d0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 72 65 74 75  = pLimit;.  retu
158e0 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
158f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20  SQLITE_OMIT_CTE 
15900 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  */../* Forward r
15910 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61  eferences */.sta
15920 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
15930 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
15940 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
15950 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
15960 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
15970 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
15980 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
15990 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
159a0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
159b0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
159c0 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
159d0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
159e0 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a  esults */.);../*
159f0 0a 2a 2a 20 48 61 6e 64 6c 65 20 74 68 65 20 73  .** Handle the s
15a00 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61  pecial case of a
15a10 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
15a20 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
15a30 20 66 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45   from a.** VALUE
15a40 53 20 63 6c 61 75 73 65 2e 20 20 42 79 20 68 61  S clause.  By ha
15a50 6e 64 6c 69 6e 67 20 74 68 69 73 20 61 73 20 61  ndling this as a
15a60 20 73 70 65 63 69 61 6c 20 63 61 73 65 2c 20 77   special case, w
15a70 65 20 61 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20  e avoid deep.** 
15a80 72 65 63 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74  recursion, and t
15a90 68 75 73 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20  hus do not need 
15aa0 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 65 20 53  to enforce the S
15ab0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
15ac0 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f  OUND_SELECT.** o
15ad0 6e 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73  n a VALUES claus
15ae0 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65  e..**.** Because
15af0 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65   the Select obje
15b00 63 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  ct originates fr
15b10 6f 6d 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75  om a VALUES clau
15b20 73 65 3a 0a 2a 2a 20 20 20 28 31 29 20 54 68 65  se:.**   (1) The
15b30 72 65 20 69 73 20 6e 6f 20 4c 49 4d 49 54 20 6f  re is no LIMIT o
15b40 72 20 4f 46 46 53 45 54 20 6f 72 20 65 6c 73 65  r OFFSET or else
15b50 20 74 68 65 72 65 20 69 73 20 61 20 4c 49 4d 49   there is a LIMI
15b60 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 0a 2a  T of exactly 1.*
15b70 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d  *   (2) All term
15b80 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a  s are UNION ALL.
15b90 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65 20 69  **   (3) There i
15ba0 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
15bb0 61 75 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  ause.**.** The "
15bc0 4c 49 4d 49 54 20 6f 66 20 65 78 61 63 74 6c 79  LIMIT of exactly
15bd0 20 31 22 20 63 61 73 65 20 6f 66 20 63 6f 6e 64   1" case of cond
15be0 69 74 69 6f 6e 20 28 31 29 20 63 6f 6d 65 73 20  ition (1) comes 
15bf0 61 62 6f 75 74 20 77 68 65 6e 20 61 20 56 41 4c  about when a VAL
15c00 55 45 53 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 63  UES.** clause oc
15c10 63 75 72 73 20 77 69 74 68 69 6e 20 73 63 61 6c  curs within scal
15c20 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65  ar expression (e
15c30 78 3a 20 22 53 45 4c 45 43 54 20 28 56 41 4c 55  x: "SELECT (VALU
15c40 45 53 28 31 29 2c 28 32 29 2c 28 33 29 29 22 29  ES(1),(2),(3))")
15c50 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  ..** The sqlite3
15c60 43 6f 64 65 53 75 62 73 65 6c 65 63 74 20 77 69  CodeSubselect wi
15c70 6c 6c 20 68 61 76 65 20 61 64 64 65 64 20 74 68  ll have added th
15c80 65 20 4c 49 4d 49 54 20 31 20 63 6c 61 75 73 65  e LIMIT 1 clause
15c90 20 69 6e 20 74 68 74 20 63 61 73 65 2e 0a 2a 2a   in tht case..**
15ca0 20 53 69 6e 63 65 20 74 68 65 20 6c 69 6d 69 74   Since the limit
15cb0 20 69 73 20 65 78 61 63 74 6c 79 20 31 2c 20 77   is exactly 1, w
15cc0 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 65  e only need to e
15cd0 76 61 6c 75 74 65 73 20 74 68 65 20 6c 65 66 74  valutes the left
15ce0 2d 6d 6f 73 74 20 56 41 4c 55 45 53 2e 0a 2a 2f  -most VALUES..*/
15cf0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
15d00 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 0a 20  iSelectValues(. 
15d10 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
15d20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
15d30 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
15d40 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
15d50 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
15d60 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
15d70 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
15d80 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
15d90 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
15da0 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
15db0 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
15dc0 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a    int nRow = 1;.
15dd0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
15de0 69 6e 74 20 62 53 68 6f 77 41 6c 6c 20 3d 20 70  int bShowAll = p
15df0 2d 3e 70 4c 69 6d 69 74 3d 3d 30 3b 0a 20 20 61  ->pLimit==0;.  a
15e00 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61  ssert( p->selFla
15e10 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c  gs & SF_MultiVal
15e20 75 65 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  ue );.  do{.    
15e30 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
15e40 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20  ags & SF_Values 
15e50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15e60 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
15e70 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  (p->op==TK_SELEC
15e80 54 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  T && p->pPrior==
15e90 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
15ea0 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c  ( p->pNext==0 ||
15eb0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
15ec0 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c  r==p->pNext->pEL
15ed0 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
15ee0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d    if( p->pPrior=
15ef0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
15f00 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f  assert( p->pPrio
15f10 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20  r->pNext==p );. 
15f20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72     p = p->pPrior
15f30 3b 0a 20 20 20 20 6e 52 6f 77 20 2b 3d 20 62 53  ;.    nRow += bS
15f40 68 6f 77 41 6c 6c 3b 0a 20 20 7d 77 68 69 6c 65  howAll;.  }while
15f50 28 31 29 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75  (1);.  ExplainQu
15f60 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
15f70 20 30 2c 20 22 53 43 41 4e 20 25 64 20 43 4f 4e   0, "SCAN %d CON
15f80 53 54 41 4e 54 20 52 4f 57 25 73 22 2c 20 6e 52  STANT ROW%s", nR
15f90 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
15fa0 20 20 20 20 20 20 20 20 6e 52 6f 77 3d 3d 31 20          nRow==1 
15fb0 3f 20 22 22 20 3a 20 22 53 22 29 29 3b 0a 20 20  ? "" : "S"));.  
15fc0 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
15fd0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
15fe0 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30  pParse, p, -1, 0
15ff0 2c 20 30 2c 20 70 44 65 73 74 2c 20 31 2c 20 31  , 0, pDest, 1, 1
16000 29 3b 0a 20 20 20 20 69 66 28 20 21 62 53 68 6f  );.    if( !bSho
16010 77 41 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20  wAll ) break;.  
16020 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
16030 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20  = nRow;.    p = 
16040 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
16050 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16060 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16070 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
16080 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ocess a compound
16090 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d   query form from
160a0 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  .** two or more 
160b0 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73  separate queries
160c0 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e   using UNION, UN
160d0 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c  ION ALL, EXCEPT,
160e0 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54   or.** INTERSECT
160f0 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
16100 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
16110 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
16120 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65  ueries.  the que
16130 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66  ry on the.** lef
16140 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20  t is p->pPrior. 
16150 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20   The left query 
16160 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20  could also be a 
16170 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a  compound query.*
16180 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  * in which case 
16190 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
161a0 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75  l be called recu
161b0 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20  rsively. .**.** 
161c0 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  The results of t
161d0 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61  he total query a
161e0 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  re to be written
161f0 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74   into a destinat
16200 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65  ion.** of type e
16210 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
16220 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ter iParm..**.**
16230 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e   Example 1:  Con
16240 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61  sider a three-wa
16250 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73  y compound SQL s
16260 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
16270 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
16280 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
16290 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
162a0 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20  N SELECT c FROM 
162b0 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74  t3.**.** This st
162c0 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
162d0 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d up as follows:
162e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
162f0 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20  T c FROM t3.**  
16300 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d      |.**      `-
16310 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20  ---->  SELECT b 
16320 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20  FROM t2.**      
16330 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d                `-
16350 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61  ----->  SELECT a
16360 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54   FROM t1.**.** T
16370 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65  he arrows in the
16380 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72   diagram above r
16390 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c  epresent the Sel
163a0 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74  ect.pPrior point
163b0 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69  er..** So if thi
163c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
163d0 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c  led with p equal
163e0 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79   to the t3 query
163f0 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72  , then.** pPrior
16400 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20   will be the t2 
16410 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69  query.  p->op wi
16420 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69  ll be TK_UNION i
16430 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
16440 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62  ** Notice that b
16450 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
16460 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  y SQLite parses 
16470 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
16480 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  , the.** individ
16490 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61  ual selects alwa
164a0 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65  ys group from le
164b0 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a  ft to right..*/.
164c0 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
164d0 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
164e0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
164f0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
16500 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
16510 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
16520 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
16530 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
16540 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
16550 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
16560 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
16570 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
16580 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ts */.){.  int r
16590 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
165a0 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
165b0 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
165c0 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
165d0 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
165e0 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
165f0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
16600 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
16610 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
16620 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
16630 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
16640 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
16650 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41   dest;      /* A
16660 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20  lternative data 
16670 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
16680 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65   Select *pDelete
16690 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20   = 0;  /* Chain 
166a0 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  of simple select
166b0 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
166c0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
166d0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
166e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
166f0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
16700 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
16710 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
16720 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
16730 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
16740 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
16750 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
16760 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
16770 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
16780 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
16790 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
167a0 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
167b0 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
167c0 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
167d0 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73  is much */.  ass
167e0 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
167f0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
16800 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  )==0 || p->op==T
16810 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  K_ALL || p->op==
16820 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62  TK_UNION );.  db
16830 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
16840 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
16850 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70  ior;.  dest = *p
16860 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69  Dest;.  if( pPri
16870 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20  or->pOrderBy || 
16880 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
16890 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
168a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73  orMsg(pParse,"%s
168b0 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
168c0 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
168d0 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
168e0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
168f0 21 3d 30 20 3f 20 22 4f 52 44 45 52 20 42 59 22  !=0 ? "ORDER BY"
16900 20 3a 20 22 4c 49 4d 49 54 22 2c 20 73 65 6c 65   : "LIMIT", sele
16910 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
16920 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
16930 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
16940 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
16950 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
16960 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
16970 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f  sert( v!=0 );  /
16980 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61  * The VDBE alrea
16990 64 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61  dy created by ca
169a0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
169b0 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  /..  /* Create t
169c0 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
169d0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
169e0 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f  f necessary.  */
169f0 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73  .  if( dest.eDes
16a00 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
16a10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16a20 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
16a30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16a40 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
16a50 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50  meral, dest.iSDP
16a60 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  arm, p->pEList->
16a70 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74  nExpr);.    dest
16a80 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62  .eDest = SRT_Tab
16a90 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  le;.  }..  /* Sp
16aa0 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66  ecial handling f
16ab0 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  or a compound-se
16ac0 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e  lect that origin
16ad0 61 74 65 73 20 61 73 20 61 20 56 41 4c 55 45 53  ates as a VALUES
16ae0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
16af0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
16b00 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
16b10 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  ){.    rc = mult
16b20 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70 50  iSelectValues(pP
16b30 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
16b40 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
16b50 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
16b60 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
16b70 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74  all SELECTs in t
16b80 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76  he statement hav
16b90 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
16ba0 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20  r of elements.  
16bb0 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75  ** in their resu
16bc0 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20  lt sets..  */.  
16bd0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
16be0 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c  t && pPrior->pEL
16bf0 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ist );.  assert(
16c00 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
16c10 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r==pPrior->pELis
16c20 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66  t->nExpr );..#if
16c30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16c40 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65  _CTE.  if( p->se
16c50 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
16c60 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e  rsive ){.    gen
16c70 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
16c80 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c 20  veQuery(pParse, 
16c90 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c  p, &dest);.  }el
16ca0 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  se.#endif..  /* 
16cb0 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  Compound SELECTs
16cc0 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52   that have an OR
16cd0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
16ce0 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61  e handled separa
16cf0 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
16d00 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
16d10 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
16d20 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50  SelectOrderBy(pP
16d30 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
16d40 0a 20 20 7d 65 6c 73 65 7b 0a 0a 23 69 66 6e 64  .  }else{..#ifnd
16d50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
16d60 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70  XPLAIN.    if( p
16d70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30  Prior->pPrior==0
16d80 20 29 7b 0a 20 20 20 20 20 20 45 78 70 6c 61 69   ){.      Explai
16d90 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
16da0 73 65 2c 20 31 2c 20 22 43 4f 4d 50 4f 55 4e 44  se, 1, "COMPOUND
16db0 20 51 55 45 52 59 22 29 29 3b 0a 20 20 20 20 20   QUERY"));.     
16dc0 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
16dd0 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4c  n((pParse, 1, "L
16de0 45 46 54 2d 4d 4f 53 54 20 53 55 42 51 55 45 52  EFT-MOST SUBQUER
16df0 59 22 29 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Y"));.    }.#end
16e00 69 66 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  if..    /* Gener
16e10 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
16e20 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
16e30 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
16e40 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 77  s..    */.    sw
16e50 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
16e60 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c       case TK_ALL
16e70 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  : {.        int 
16e80 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
16e90 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20    int nLimit;.  
16ea0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
16eb0 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b  Prior->pLimit );
16ec0 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d  .        pPrior-
16ed0 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  >iLimit = p->iLi
16ee0 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72  mit;.        pPr
16ef0 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70  ior->iOffset = p
16f00 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
16f10 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69     pPrior->pLimi
16f20 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
16f30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16f40 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
16f50 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29  , pPrior, &dest)
16f60 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69  ;.        p->pLi
16f70 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
16f80 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
16f90 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
16fa0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
16fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
16fc0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
16fd0 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
16fe0 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b   pPrior->iLimit;
16ff0 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  .        p->iOff
17000 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f  set = pPrior->iO
17010 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69  ffset;.        i
17020 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
17030 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d            addr =
17040 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17050 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
17060 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  p->iLimit); Vdbe
17070 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
17080 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
17090 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65  nt((v, "Jump ahe
170a0 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63  ad if LIMIT reac
170b0 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20  hed"));.        
170c0 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74    if( p->iOffset
170d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
170e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
170f0 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69  3(v, OP_OffsetLi
17100 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mit,.           
17110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17120 20 20 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d     p->iLimit, p-
17130 3e 69 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69  >iOffset+1, p->i
17140 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
17150 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
17160 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75         ExplainQu
17170 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
17180 20 31 2c 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 29   1, "UNION ALL")
17190 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
171a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
171b0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
171c0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
171d0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
171e0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c   );.        pDel
171f0 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
17200 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69  .        p->pPri
17210 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
17220 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
17230 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
17240 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74  stAdd(p->nSelect
17250 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65  Row, pPrior->nSe
17260 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  lectRow);.      
17270 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
17280 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20 26 26  imit.         &&
17290 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
172a0 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c  teger(pPrior->pL
172b0 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c  imit->pLeft, &nL
172c0 69 6d 69 74 29 0a 20 20 20 20 20 20 20 20 20 26  imit).         &
172d0 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d  & nLimit>0 && p-
172e0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 73 71  >nSelectRow > sq
172f0 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
17300 29 6e 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20  )nLimit) .      
17310 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
17320 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
17330 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
17340 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  4)nLimit);.     
17350 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
17360 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20   addr ){.       
17370 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
17380 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
17390 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
173a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
173b0 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  }.      case TK_
173c0 45 58 43 45 50 54 3a 0a 20 20 20 20 20 20 63 61  EXCEPT:.      ca
173d0 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
173e0 20 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e         int union
173f0 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f  Tab;    /* Curso
17400 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
17410 74 65 6d 70 20 74 61 62 6c 65 20 68 6f 6c 64 69  temp table holdi
17420 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
17430 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20       u8 op = 0; 
17440 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
17450 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
17460 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
17470 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 20 20  self */.        
17480 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20  int priorOp;    
17490 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65   /* The SRT_ ope
174a0 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20  ration to apply 
174b0 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73  to prior selects
174c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
174d0 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20   *pLimit;    /* 
174e0 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
174f0 70 2d 3e 6e 4c 69 6d 69 74 20 20 2a 2f 0a 20 20  p->nLimit  */.  
17500 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
17510 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65          SelectDe
17520 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 20 20  st uniondest;.  
17530 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
17540 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43  e( p->op==TK_EXC
17550 45 50 54 20 29 3b 0a 20 20 20 20 20 20 20 20 74  EPT );.        t
17560 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
17570 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
17580 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52      priorOp = SR
17590 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 20  T_Union;.       
175a0 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
175b0 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
175c0 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20        /* We can 
175d0 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72  reuse a temporar
175e0 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  y table generate
175f0 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f  d by a SELECT to
17600 20 6f 75 72 0a 20 20 20 20 20 20 20 20 20 20 2a   our.          *
17610 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
17620 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
17630 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69  assert( p->pLimi
17640 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  t==0 );      /* 
17650 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
17660 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
17670 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e   */.          un
17680 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53  ionTab = dest.iS
17690 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 7d  DParm;.        }
176a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
176b0 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20  /* We will need 
176c0 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77  to create our ow
176d0 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
176e0 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20  e to hold the.  
176f0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
17700 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
17710 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
17720 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
17730 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
17740 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  +;.          ass
17750 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
17760 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
17770 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
17780 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17790 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75  OpenEphemeral, u
177a0 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
177b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
177c0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
177d0 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
177e0 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
177f0 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
17800 20 20 20 20 20 20 20 20 20 20 66 69 6e 64 52 69            findRi
17810 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46  ghtmost(p)->selF
17820 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
17830 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
17840 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
17850 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20  EList );.       
17860 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a   }.  .        /*
17870 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
17880 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
17890 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20  ur left.        
178a0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
178b0 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64  t( !pPrior->pOrd
178c0 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 20 20  erBy );.        
178d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
178e0 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74  tInit(&uniondest
178f0 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e  , priorOp, union
17900 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 72 63  Tab);.        rc
17910 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
17920 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
17930 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
17940 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
17950 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
17960 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
17970 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
17980 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
17990 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
179a0 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
179b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
179c0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45  ( p->op==TK_EXCE
179d0 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  PT ){.          
179e0 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
179f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
17a00 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17a10 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
17a20 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  N );.          o
17a30 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
17a40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17a50 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
17a60 20 20 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d          pLimit =
17a70 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
17a80 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
17a90 30 3b 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  0;.        union
17aa0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b  dest.eDest = op;
17ab0 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e  .        Explain
17ac0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
17ad0 65 2c 20 31 2c 20 22 25 73 20 55 53 49 4e 47 20  e, 1, "%s USING 
17ae0 54 45 4d 50 20 42 2d 54 52 45 45 22 2c 0a 20 20  TEMP B-TREE",.  
17af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b00 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70          selectOp
17b10 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20  Name(p->op)));. 
17b20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17b30 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
17b40 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  , p, &uniondest)
17b50 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
17b60 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
17b70 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K );.        /* 
17b80 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  Query flattening
17b90 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
17ba0 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c  t() might refill
17bb0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20   p->pOrderBy..  
17bc0 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
17bd0 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
17be0 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
17bf0 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
17c00 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
17c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17c20 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
17c30 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
17c40 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
17c50 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
17c60 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
17c70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70  Prior;.        p
17c80 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
17c90 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f          if( p->o
17ca0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
17cb0 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c           p->nSel
17cc0 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
17cd0 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
17ce0 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
17cf0 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
17d00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17d10 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
17d20 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
17d30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69  ;.        p->pLi
17d40 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
17d50 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
17d60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
17d70 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 0a  iOffset = 0;.  .
17d80 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65          /* Conve
17d90 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
17da0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
17db0 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
17dc0 20 66 6f 72 6d 0a 20 20 20 20 20 20 20 20 2a 2a   form.        **
17dd0 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63   it is that we c
17de0 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20  urrently need.. 
17df0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17e00 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54    assert( unionT
17e10 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d  ab==dest.iSDParm
17e20 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d   || dest.eDest!=
17e30 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20  priorOp );.     
17e40 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
17e50 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20  t!=priorOp ){.  
17e60 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
17e70 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
17e80 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  t;.          ass
17e90 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
17ea0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 42 72 65  ;.          iBre
17eb0 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
17ec0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
17ed0 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20          iCont = 
17ee0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
17ef0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
17f00 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
17f10 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
17f20 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
17f30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17f40 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
17f50 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
17f60 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
17f70 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
17f80 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
17f90 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
17fa0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
17fb0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
17fc0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 75 6e  op(pParse, p, un
17fd0 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ionTab,.        
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ff0 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69    0, 0, &dest, i
18000 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
18010 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18020 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18030 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
18040 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18050 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
18060 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
18070 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72  tart); VdbeCover
18080 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
18090 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
180a0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
180b0 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eak);.          
180c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
180d0 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  2(v, OP_Close, u
180e0 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
180f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
18100 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
18110 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
18120 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ert( p->op==TK_I
18130 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20  NTERSECT ); {.  
18140 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20        int tab1, 
18150 74 61 62 32 3b 0a 20 20 20 20 20 20 20 20 69 6e  tab2;.        in
18160 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
18170 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   iStart;.       
18180 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 0a 20   Expr *pLimit;. 
18190 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b         int addr;
181a0 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44  .        SelectD
181b0 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
181c0 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  t;.        int r
181d0 31 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a  1;.  .        /*
181e0 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
181f0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
18200 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
18210 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
18220 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
18230 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
18240 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
18250 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
18260 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f        ** by allo
18270 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65  cating the table
18280 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a  s we will need..
18290 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
182a0 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65     tab1 = pParse
182b0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
182c0 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
182d0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
182e0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
182f0 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  erBy==0 );.  .  
18300 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
18310 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18320 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
18330 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
18340 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
18350 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
18360 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
18370 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
18380 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
18390 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f       findRightmo
183a0 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20  st(p)->selFlags 
183b0 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
183c0 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ral;.        ass
183d0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
183e0 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  ;.  .        /* 
183f0 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73  Code the SELECTs
18400 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74   to our left int
18410 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
18420 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20  e "tab1"..      
18430 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
18440 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
18450 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73  it(&intersectdes
18460 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  t, SRT_Union, ta
18470 62 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  b1);.        rc 
18480 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
18490 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
184a0 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
184b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
184c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
184d0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
184e0 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
184f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  .        /* Code
18500 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
18510 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  ECT into tempora
18520 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a  ry table "tab2".
18530 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
18540 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
18550 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18560 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
18570 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
18580 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
18590 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
185a0 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70   -1 );.        p
185b0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
185c0 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
185d0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
185e0 0a 20 20 20 20 20 20 20 20 70 4c 69 6d 69 74 20  .        pLimit 
185f0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
18600 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
18610 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 65   0;.        inte
18620 72 73 65 63 74 64 65 73 74 2e 69 53 44 50 61 72  rsectdest.iSDPar
18630 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20  m = tab2;.      
18640 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
18650 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
18660 25 73 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  %s USING TEMP B-
18670 54 52 45 45 22 2c 0a 20 20 20 20 20 20 20 20 20  TREE",.         
18680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18690 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
186a0 3e 6f 70 29 29 29 3b 0a 20 20 20 20 20 20 20 20  >op)));.        
186b0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
186c0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69  ct(pParse, p, &i
186d0 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20  ntersectdest);. 
186e0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
186f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18700 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c 65 74  ;.        pDelet
18710 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
18720 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
18730 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
18740 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
18750 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65  tRow>pPrior->nSe
18760 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20  lectRow ){.     
18770 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
18780 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
18790 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 20  lectRow;.       
187a0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
187b0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
187c0 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
187d0 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
187e0 20 70 4c 69 6d 69 74 3b 0a 20 20 0a 20 20 20 20   pLimit;.  .    
187f0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
18800 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65  code to take the
18810 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
18820 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61   the two tempora
18830 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  ry.        ** ta
18840 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bles..        */
18850 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18860 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
18870 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
18880 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
18890 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
188a0 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
188b0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
188c0 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65  .        compute
188d0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
188e0 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b  Parse, p, iBreak
188f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18900 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18910 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
18920 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
18930 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
18940 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
18950 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
18960 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
18970 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
18980 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44  ddOp2(v, OP_RowD
18990 61 74 61 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a  ata, tab1, r1);.
189a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
189b0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
189c0 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62  OP_NotFound, tab
189d0 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29  2, iCont, r1, 0)
189e0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
189f0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
18a00 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
18a10 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
18a20 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 65   r1);.        se
18a30 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
18a40 61 72 73 65 2c 20 70 2c 20 74 61 62 31 2c 0a 20  arse, p, tab1,. 
18a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a60 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
18a70 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
18a80 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
18a90 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
18aa0 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
18ab0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18ac0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
18ad0 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72  ext, tab1, iStar
18ae0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
18af0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
18b00 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
18b10 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
18b20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18b30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18b40 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29  _Close, tab2, 0)
18b50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18b60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18b70 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30  P_Close, tab1, 0
18b80 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
18b90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18ba0 20 20 0a 20 20 23 69 66 6e 64 65 66 20 53 51 4c    .  #ifndef SQL
18bb0 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
18bc0 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  .    if( p->pNex
18bd0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  t==0 ){.      Ex
18be0 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f  plainQueryPlanPo
18bf0 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  p(pParse);.    }
18c00 0a 20 20 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  .  #endif.  }.  
18c10 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f  .  /* Compute co
18c20 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
18c30 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  s used by .  ** 
18c40 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
18c50 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65   needed to imple
18c60 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e  ment the compoun
18c70 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41  d select..  ** A
18c80 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66  ttach the KeyInf
18c90 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61  o structure to a
18ca0 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ll temporary tab
18cb0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
18cc0 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72  his section is r
18cd0 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d  un by the right-
18ce0 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
18cf0 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a  ement only..  **
18d00 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
18d10 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  ts to the left a
18d20 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20  lways skip this 
18d30 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74  part.  The right
18d40 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43  -most.  ** SELEC
18d50 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69  T might also ski
18d60 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69  p this part if i
18d70 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42  t has no ORDER B
18d80 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a  Y clause and.  *
18d90 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73  * no temp tables
18da0 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20   are required.. 
18db0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
18dc0 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45  Flags & SF_UsesE
18dd0 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20  phemeral ){.    
18de0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
18df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18e00 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
18e10 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
18e20 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyInfo;         
18e30 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
18e40 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
18e50 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
18e60 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
18e70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18e80 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
18e90 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73  through SELECT s
18ea0 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  tatements */.   
18eb0 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c   CollSeq **apCol
18ec0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
18ed0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
18ee0 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e  rough pKeyInfo->
18ef0 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69  aColl[] */.    i
18f00 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
18f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18f20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
18f30 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20  s in result set 
18f40 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
18f50 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20  p->pNext==0 );. 
18f60 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c     nCol = p->pEL
18f70 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
18f80 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
18f90 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
18fa0 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20  b, nCol, 1);.   
18fb0 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29   if( !pKeyInfo )
18fc0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
18fd0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
18fe0 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
18ff0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
19000 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20   }.    for(i=0, 
19010 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d  apColl=pKeyInfo-
19020 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  >aColl; i<nCol; 
19030 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a  i++, apColl++){.
19040 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
19050 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
19060 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
19070 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a  ;.      if( 0==*
19080 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  apColl ){.      
19090 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e    *apColl = db->
190a0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
190b0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
190c0 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
190d0 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
190e0 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f  Prior){.      fo
190f0 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
19100 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
19110 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  dr = pLoop->addr
19120 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20  OpenEphm[i];.   
19130 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20       if( addr<0 
19140 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
19150 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  If [0] is unused
19160 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73   then [1] is als
19170 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65  o unused.  So we
19180 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a   can.          *
19190 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20  * always safely 
191a0 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73  abort as soon as
191b0 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65   the first unuse
191c0 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20  d slot is found 
191d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
191e0 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  ert( pLoop->addr
191f0 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b  OpenEphm[1]<0 );
19200 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
19210 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19220 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
19230 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
19240 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
19250 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
19260 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP4(v, addr, (ch
19270 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
19280 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
19290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
192a0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
192b0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
192c0 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65    pLoop->addrOpe
192d0 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20  nEphm[i] = -1;. 
192e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
192f0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
19300 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  nref(pKeyInfo);.
19310 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63    }..multi_selec
19320 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e  t_end:.  pDest->
19330 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64  iSdst = dest.iSd
19340 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64  st;.  pDest->nSd
19350 73 74 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b  st = dest.nSdst;
19360 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
19370 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65  Delete(db, pDele
19380 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  te);.  return rc
19390 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
193a0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
193b0 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
193c0 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67  .** Error messag
193d0 65 20 66 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f  e for when two o
193e0 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20  r more terms of 
193f0 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
19400 74 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74  t have different
19410 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c 74 20  .** size result 
19420 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  sets..*/.void sq
19430 6c 69 74 65 33 53 65 6c 65 63 74 57 72 6f 6e 67  lite3SelectWrong
19440 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 50 61  NumTermsError(Pa
19450 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
19460 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ect *p){.  if( p
19470 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
19480 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 73 71  Values ){.    sq
19490 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
194a0 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45  arse, "all VALUE
194b0 53 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20  S must have the 
194c0 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  same number of t
194d0 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  erms");.  }else{
194e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
194f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
19500 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
19510 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
19520 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  s".      " do no
19530 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
19540 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
19550 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
19560 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
19570 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
19580 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62  de an output sub
19590 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f  routine for a co
195a0 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
195b0 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53  tation of a.** S
195c0 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a  ELECT statment..
195d0 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74  **.** The data t
195e0 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20 63  o be output is c
195f0 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d  ontained in pIn-
19600 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65 20 61  >iSdst.  There a
19610 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74  re.** pIn->nSdst
19620 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f   columns to be o
19630 75 74 70 75 74 2e 20 20 70 44 65 73 74 20 69 73  utput.  pDest is
19640 20 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 75   where the outpu
19650 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
19660 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65  ent..**.** regRe
19670 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  turn is the numb
19680 65 72 20 6f 66 20 74 68 65 20 72 65 67 69 73 74  er of the regist
19690 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  er holding the s
196a0 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  ubroutine.** ret
196b0 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a  urn address..**.
196c0 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  ** If regPrev>0 
196d0 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 66  then it is the f
196e0 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
196f0 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a   a vector that.*
19700 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72  * records the pr
19710 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20  evious output.  
19720 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20  mem[regPrev] is 
19730 61 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66  a flag that is f
19740 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65  alse.** if there
19750 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65   has been no pre
19760 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49  vious output.  I
19770 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
19780 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65   code is.** gene
19790 72 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73  rated to suppres
197a0 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70  s duplicates.  p
197b0 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20  KeyInfo is used 
197c0 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a  for comparing.**
197d0 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   keys..**.** If 
197e0 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20  the LIMIT found 
197f0 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20  in p->iLimit is 
19800 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d  reached, jump im
19810 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20  mediately to.** 
19820 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69  iBreak..*/.stati
19830 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75  c int generateOu
19840 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a  tputSubroutine(.
19850 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
19860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
19870 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
19880 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
19890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
198a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
198b0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  t */.  SelectDes
198c0 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f  t *pIn,        /
198d0 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70  * Coroutine supp
198e0 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  lying data */.  
198f0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
19900 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  t,      /* Where
19910 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74   to send the dat
19920 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  a */.  int regRe
19930 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  turn,          /
19940 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64  * The return add
19950 72 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f  ress register */
19960 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20  .  int regPrev, 
19970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
19980 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65  evious result re
19990 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71  gister.  No uniq
199a0 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20  ueness if 0 */. 
199b0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
199c0 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  fo,      /* For 
199d0 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70  comparing with p
199e0 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f  revious entry */
199f0 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
19a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
19a10 6d 70 20 68 65 72 65 20 69 66 20 77 65 20 68 69  mp here if we hi
19a20 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29  t the LIMIT */.)
19a30 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
19a40 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
19a50 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  nt iContinue;.  
19a60 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64  int addr;..  add
19a70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
19a80 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
19a90 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
19aa0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
19ab0 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  l(v);..  /* Supp
19ac0 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 20  ress duplicates 
19ad0 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  for UNION, EXCEP
19ae0 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
19af0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67   .  */.  if( reg
19b00 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20  Prev ){.    int 
19b10 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20  addr1, addr2;.  
19b20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
19b30 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
19b40 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76  P_IfNot, regPrev
19b50 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
19b60 76 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  v);.    addr2 = 
19b70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19b80 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
19b90 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
19ba0 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
19bb0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
19bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bd0 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
19be0 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
19bf0 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
19c00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19c10 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
19c20 75 6d 70 2c 20 61 64 64 72 32 2b 32 2c 20 69 43  ump, addr2+2, iC
19c30 6f 6e 74 69 6e 75 65 2c 20 61 64 64 72 32 2b 32  ontinue, addr2+2
19c40 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
19c50 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
19c60 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
19c70 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddr1);.    sqlit
19c80 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
19c90 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53  OP_Copy, pIn->iS
19ca0 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  dst, regPrev+1, 
19cb0 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20  pIn->nSdst-1);. 
19cc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19cd0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
19ce0 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b  er, 1, regPrev);
19cf0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
19d00 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
19d10 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
19d20 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74  .  /* Suppress t
19d30 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20  he first OFFSET 
19d40 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72 65  entries if there
19d50 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c   is an OFFSET cl
19d60 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65  ause.  */.  code
19d70 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
19d80 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
19d90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 65  ;..  assert( pDe
19da0 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 45  st->eDest!=SRT_E
19db0 78 69 73 74 73 20 29 3b 0a 20 20 61 73 73 65 72  xists );.  asser
19dc0 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  t( pDest->eDest!
19dd0 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
19de0 73 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65  switch( pDest->e
19df0 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53  Dest ){.    /* S
19e00 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
19e10 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
19e20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
19e30 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
19e40 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
19e50 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
19e60 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
19e70 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  rse);.      int 
19e80 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
19e90 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
19ea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19eb0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
19ec0 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69  keRecord, pIn->i
19ed0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
19ee0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
19ef0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19f00 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70  , OP_NewRowid, p
19f10 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
19f20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
19f30 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19f40 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  P_Insert, pDest-
19f50 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72 32  >iSDParm, r1, r2
19f60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19f70 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
19f80 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
19f90 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
19fa0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
19fb0 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  se, r2);.      s
19fc0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
19fd0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
19fe0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
19ff0 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
1a000 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1a010 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
1a020 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
1a030 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
1a040 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
1a050 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1a060 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
1a070 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
1a080 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e   testcase( pIn->
1a090 6e 53 64 73 74 3e 31 20 29 3b 0a 20 20 20 20 20  nSdst>1 );.     
1a0a0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
1a0b0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1a0c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a0d0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
1a0e0 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
1a0f0 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
1a100 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 72 31  t, .          r1
1a110 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  , pDest->zAffSds
1a120 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
1a130 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a140 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
1a150 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
1a160 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
1a170 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
1a180 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1a190 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
1a1a0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
1a1b0 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , r1,.          
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1d0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
1a1e0 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
1a1f0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1a200 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
1a210 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a220 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1a230 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
1a240 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
1a250 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
1a260 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
1a270 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
1a280 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
1a290 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
1a2a0 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
1a2b0 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
1a2c0 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
1a2d0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
1a2e0 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
1a2f0 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d  ert( pIn->nSdst=
1a300 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =1 || pParse->nE
1a310 72 72 3e 30 20 29 3b 20 20 74 65 73 74 63 61 73  rr>0 );  testcas
1a320 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 21 3d 31  e( pIn->nSdst!=1
1a330 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1a340 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
1a350 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
1a360 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
1a370 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
1a380 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
1a390 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
1a3a0 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
1a3b0 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
1a3c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1a3d0 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
1a3e0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
1a3f0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ..    /* The res
1a400 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
1a410 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
1a420 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
1a430 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44  * starting at pD
1a440 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  est->iSdst.  The
1a450 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
1a460 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a   yields..    */.
1a470 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
1a480 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  outine: {.      
1a490 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74  if( pDest->iSdst
1a4a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
1a4b0 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71  Dest->iSdst = sq
1a4c0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
1a4d0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e  e(pParse, pIn->n
1a4e0 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Sdst);.        p
1a4f0 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49  Dest->nSdst = pI
1a500 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20  n->nSdst;.      
1a510 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
1a520 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
1a530 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
1a540 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 49  pDest->iSdst, pI
1a550 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
1a560 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a570 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
1a580 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
1a590 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a5a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1a5b0 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65  one of the above
1a5c0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
1a5d0 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75  t destination mu
1a5e0 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54  st be.    ** SRT
1a5f0 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72  _Output.  This r
1a600 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
1a610 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20  called with any 
1a620 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73  other.    ** des
1a630 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74  tination other t
1a640 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e  han the ones han
1a650 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52  dled above or SR
1a660 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a  T_Output..    **
1a670 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f  .    ** For SRT_
1a680 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20  Output, results 
1a690 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
1a6a0 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
1a6b0 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20  sters.  .    ** 
1a6c0 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75  Then the OP_Resu
1a6d0 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20  ltRow opcode is 
1a6e0 75 73 65 64 20 74 6f 20 63 61 75 73 65 20 73 71  used to cause sq
1a6f0 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a  lite3_step() to.
1a700 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68      ** return th
1a710 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65  e next row of re
1a720 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sult..    */.   
1a730 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
1a740 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
1a750 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
1a760 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ut );.      sqli
1a770 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a780 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
1a790 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
1a7a0 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
1a7b0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
1a7c0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
1a7d0 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
1a7e0 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
1a7f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a800 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
1a810 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1a820 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
1a830 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a  MIT is reached..
1a840 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
1a850 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
1a860 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a870 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
1a880 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
1a890 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
1a8a0 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
1a8b0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75   Generate the su
1a8c0 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a  broutine return.
1a8d0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1a8e0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1a8f0 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
1a900 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a910 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
1a920 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72  regReturn);..  r
1a930 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
1a940 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65  *.** Alternative
1a950 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1a960 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
1a970 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74  for cases when t
1a980 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52  here.** is an OR
1a990 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
1a9a0 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61  *.** We assume a
1a9b0 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
1a9c0 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
1a9d0 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74  .**      <select
1a9e0 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20  A>  <operator>  
1a9f0 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52  <selectB>  ORDER
1aa00 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74   BY <orderbylist
1aa10 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  >.**.** <operato
1aa20 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49  r> is one of UNI
1aa30 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45  ON ALL, UNION, E
1aa40 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
1aa50 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a  ECT.  The idea.*
1aa60 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74  * is to code bot
1aa70 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20  h <selectA> and 
1aa80 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74  <selectB> with t
1aa90 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1aaa0 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74  se as.** co-rout
1aab0 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20  ines.  Then run 
1aac0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20  the co-routines 
1aad0 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20  in parallel and 
1aae0 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74  merge the result
1aaf0 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75  s.** into the ou
1ab00 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69  tput.  In additi
1ab10 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f  on to the two co
1ab20 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64  routines (called
1ab30 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20   selectA and.** 
1ab40 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61  selectB) there a
1ab50 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73  re 7 subroutines
1ab60 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a  :.**.**    outA:
1ab70 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
1ab80 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
1ab90 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tA coroutine int
1aba0 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
1abb0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
1abc0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
1abd0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42  y..**.**    outB
1abe0 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
1abf0 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
1ac00 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctB coroutine in
1ac10 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
1ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
1ac30 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
1ac40 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72  ry.  (Only gener
1ac50 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61  ated for UNION a
1ac60 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
1ac70 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58    UNION ALL.  EX
1ac80 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53  CEPT and INSERTS
1ac90 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74  ECT never output
1aca0 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20   a row that.**  
1acb0 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61             appea
1acc0 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a  rs only in B.).*
1acd0 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20  *.**    AltB:   
1ace0 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
1acf0 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
1ad00 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
1ad10 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A<B..**.**  
1ad20 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65    AeqB:    Calle
1ad30 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
1ad40 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
1ad50 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d  oroutines and A=
1ad60 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74  =B..**.**    Agt
1ad70 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
1ad80 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
1ad90 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
1ada0 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a  ines and A>B..**
1adb0 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20  .**    EofA:    
1adc0 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
1add0 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
1ade0 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a  om selectA..**.*
1adf0 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61  *    EofB:    Ca
1ae00 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
1ae10 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
1ae20 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20   selectB..**.** 
1ae30 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
1ae40 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72  on of the latter
1ae50 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65   five subroutine
1ae60 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63  s depend on whic
1ae70 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  h .** <operator>
1ae80 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a   is used:.**.**.
1ae90 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
1aea0 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20  NION ALL        
1aeb0 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20   UNION          
1aec0 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20    EXCEPT        
1aed0 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20    INTERSECT.**  
1aee0 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
1aef0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
1af00 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
1af10 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
1af20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
1af30 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AltB:   outA, n
1af40 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
1af50 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
1af60 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
1af70 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65  nextA.**.**   Ae
1af80 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  qB:   outA, next
1af90 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20  A         nextA 
1afa0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
1afb0 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20  A         outA, 
1afc0 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67  nextA.**.**   Ag
1afd0 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  tB:   outB, next
1afe0 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
1aff0 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  tB          next
1b000 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  B            nex
1b010 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a  tB.**.**   EofA:
1b020 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
1b030 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
1b040 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20           halt   
1b050 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a            halt.*
1b060 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f  *.**   EofB:   o
1b070 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
1b080 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
1b090 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1b0a0 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
1b0b0 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65   In the AltB, Ae
1b0c0 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62  qB, and AgtB sub
1b0d0 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46  routines, an EOF
1b0e0 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20   on A following 
1b0f0 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20  nextA.** causes 
1b100 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
1b110 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e  p to EofA and an
1b120 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77   EOF on B follow
1b130 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73  ing nextB causes
1b140 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  .** an immediate
1b150 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20   jump to EofB.  
1b160 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20  Within EofA and 
1b170 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e  EofB, and EOF on
1b180 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c   entry or.** fol
1b190 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75  lowing nextX cau
1b1a0 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68  ses a jump to th
1b1b0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c  e end of the sel
1b1c0 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  ect processing..
1b1d0 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20  **.** Duplicate 
1b1e0 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55  removal in the U
1b1f0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
1b200 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65  d INTERSECT case
1b210 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20  s is handled.** 
1b220 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75  within the outpu
1b230 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
1b240 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73  he regPrev regis
1b250 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68  ter set holds th
1b260 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  e previously.** 
1b270 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41  output value.  A
1b280 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   comparison is m
1b290 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73  ade against this
1b2a0 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f   value and the o
1b2b0 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70  utput.** is skip
1b2c0 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20  ped if the next 
1b2d0 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65  results would be
1b2e0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1b2f0 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a   previous..**.**
1b300 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
1b310 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69  ion plan is to i
1b320 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f  mplement the two
1b330 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
1b340 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74  seven.** subrout
1b350 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e  ines first, then
1b360 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c   put the control
1b370 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f   logic at the bo
1b380 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73  ttom.  Like this
1b390 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1b3a0 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20   goto Init.**   
1b3b0 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65    coA: coroutine
1b3c0 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20   for left query 
1b3d0 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20  (A).**     coB: 
1b3e0 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
1b3f0 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a  ght query (B).**
1b400 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74      outA: output
1b410 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a   one row of A.**
1b420 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74      outB: output
1b430 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55   one row of B (U
1b440 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41  NION and UNION A
1b450 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45  LL only).**    E
1b460 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45  ofA: ....**    E
1b470 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ofB: ....**    A
1b480 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ltB: ....**    A
1b490 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  eqB: ....**    A
1b4a0 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49  gtB: ....**    I
1b4b0 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20  nit: initialize 
1b4c0 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  coroutine regist
1b4d0 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ers.**          
1b4e0 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20  yield coA.**    
1b4f0 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20        if eof(A) 
1b500 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20  goto EofA.**    
1b510 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a        yield coB.
1b520 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
1b530 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a  of(B) goto EofB.
1b540 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70  **    Cmpr: Comp
1b550 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20  are A, B.**     
1b560 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20       Jump AltB, 
1b570 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20  AeqB, AgtB.**   
1b580 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a    End: ....**.**
1b590 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41   We call AltB, A
1b5a0 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c  eqB, AgtB, EofA,
1b5b0 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f   and EofB "subro
1b5c0 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79  utines" but they
1b5d0 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75   are not.** actu
1b5e0 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e  ally called usin
1b5f0 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79  g Gosub and they
1b600 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20   do not Return. 
1b610 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c   EofA and EofB l
1b620 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c  oop.** until all
1b630 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
1b640 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ed then jump to 
1b650 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20  the "end" labe. 
1b660 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20   AltB, AeqB,.** 
1b670 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f  and AgtB jump to
1b680 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f   either L2 or to
1b690 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20   one of EofA or 
1b6a0 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  EofB..*/.#ifndef
1b6b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
1b6c0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61  POUND_SELECT.sta
1b6d0 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
1b6e0 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
1b6f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1b700 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1b710 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
1b720 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1b730 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
1b740 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
1b750 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
1b760 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
1b770 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
1b780 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
1b790 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
1b7a0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
1b7b0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1b7c0 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63  nters */.  Selec
1b7d0 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
1b7e0 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
1b7f0 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
1b800 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
1b810 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
1b820 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
1b830 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
1b840 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
1b850 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f  est destA;     /
1b860 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
1b870 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f  r coroutine A */
1b880 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
1b890 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stB;     /* Dest
1b8a0 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
1b8b0 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74  utine B */.  int
1b8c0 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20   regAddrA;      
1b8d0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
1b8e0 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
1b8f0 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
1b900 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b  .  int regAddrB;
1b910 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1b920 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
1b930 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
1b940 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1b950 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f  rSelectA;      /
1b960 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1b970 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
1b980 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1b990 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f  rSelectB;      /
1b9a0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1b9b0 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
1b9c0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
1b9d0 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f  OutA;          /
1b9e0 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
1b9f0 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
1ba00 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
1ba10 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b  /.  int regOutB;
1ba20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1ba30 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
1ba40 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  r the output-B s
1ba50 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1ba60 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20  nt addrOutA;    
1ba70 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1ba80 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  of the output-A 
1ba90 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1baa0 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30  int addrOutB = 0
1bab0 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
1bac0 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42   of the output-B
1bad0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1bae0 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20   int addrEofA;  
1baf0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1bb00 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
1bb10 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  A-exhausted subr
1bb20 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1bb30 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20  addrEofA_noB;   
1bb40 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20 61    /* Alternate a
1bb50 64 64 72 45 6f 66 41 20 69 66 20 42 20 69 73 20  ddrEofA if B is 
1bb60 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  uninitialized */
1bb70 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b  .  int addrEofB;
1bb80 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1bb90 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
1bba0 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-B-exhausted su
1bbb0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
1bbc0 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20  t addrAltB;     
1bbd0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1bbe0 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75  f the A<B subrou
1bbf0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1bc00 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20  drAeqB;         
1bc10 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1bc20 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e  e A==B subroutin
1bc30 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
1bc40 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  gtB;         /* 
1bc50 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
1bc60 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  >B subroutine */
1bc70 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41  .  int regLimitA
1bc80 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
1bc90 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
1bca0 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
1bcb0 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20   regLimitB;     
1bcc0 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
1bcd0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
1bce0 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  A */.  int regPr
1bcf0 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev;          /* 
1bd00 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  A range of regis
1bd10 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65  ters to hold pre
1bd20 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a  vious output */.
1bd30 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74    int savedLimit
1bd40 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
1bd50 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69   value of p->iLi
1bd60 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  mit */.  int sav
1bd70 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  edOffset;      /
1bd80 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
1bd90 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20   p->iOffset */. 
1bda0 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20   int labelCmpr; 
1bdb0 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
1bdc0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
1bdd0 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72   the merge algor
1bde0 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  ithm */.  int la
1bdf0 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20  belEnd;         
1be00 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
1be10 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   end of the over
1be20 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20  all SELECT stmt 
1be30 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20  */.  int addr1; 
1be40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
1be50 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
1be60 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65  that get retarge
1be70 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tted */.  int op
1be80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1be90 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c  /* One of TK_ALL
1bea0 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  , TK_UNION, TK_E
1beb0 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53  XCEPT, TK_INTERS
1bec0 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ECT */.  KeyInfo
1bed0 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f   *pKeyDup = 0; /
1bee0 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
1bef0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  ormation for dup
1bf00 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a  licate removal *
1bf10 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
1bf20 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d  yMerge;   /* Com
1bf30 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
1bf40 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20  ion for merging 
1bf50 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rows */.  sqlite
1bf60 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
1bf70 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
1bf80 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
1bf90 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
1bfa0 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
1bfb0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
1bfc0 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
1bfd0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1bfe0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
1bff0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
1c000 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65  .  int *aPermute
1c010 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70  ;        /* Mapp
1c020 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42  ing from ORDER B
1c030 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c  Y terms to resul
1c040 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  t set columns */
1c050 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
1c060 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
1c070 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d  assert( pKeyDup=
1c080 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65  =0 ); /* "Manage
1c090 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68  d" code needs th
1c0a0 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38  is.  Ticket #338
1c0b0 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  2. */.  db = pPa
1c0c0 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70  rse->db;.  v = p
1c0d0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1c0e0 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
1c0f0 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79        /* Already
1c100 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f   thrown the erro
1c110 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20  r if VDBE alloc 
1c120 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65  failed */.  labe
1c130 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  lEnd = sqlite3Vd
1c140 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1c150 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71    labelCmpr = sq
1c160 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1c170 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61  el(v);...  /* Pa
1c180 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45 52  tch up the ORDER
1c190 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a   BY clause.  */.
1c1a0 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a    op = p->op;  .
1c1b0 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
1c1c0 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rior;.  assert( 
1c1d0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
1c1e0 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42  ==0 );.  pOrderB
1c1f0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
1c200 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
1c210 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42  rBy );.  nOrderB
1c220 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y = pOrderBy->nE
1c230 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f  xpr;..  /* For o
1c240 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74  perators other t
1c250 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65  han UNION ALL we
1c260 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75   have to make su
1c270 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  re that.  ** the
1c280 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c290 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74 65   covers every te
1c2a0 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rm of the result
1c2b0 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20   set.  Add.  ** 
1c2c0 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44  terms to the ORD
1c2d0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 20  ER BY clause as 
1c2e0 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
1c2f0 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c    if( op!=TK_ALL
1c300 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
1c310 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1c320 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45  d==0 && i<=p->pE
1c330 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1c340 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1c350 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1c360 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Item;.      for(
1c370 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  j=0, pItem=pOrde
1c380 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72  rBy->a; j<nOrder
1c390 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b  By; j++, pItem++
1c3a0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1c3b0 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
1c3c0 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20  rderByCol>0 );. 
1c3d0 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
1c3e0 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
1c3f0 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==i ) break;.  
1c400 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c410 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  j==nOrderBy ){. 
1c420 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65         Expr *pNe
1c430 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  w = sqlite3Expr(
1c440 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  db, TK_INTEGER, 
1c450 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
1c460 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
1c470 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1c480 50 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  PT;.        pNew
1c490 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e  ->flags |= EP_In
1c4a0 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20  tValue;.        
1c4b0 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d  pNew->u.iValue =
1c4c0 20 69 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   i;.        p->p
1c4d0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
1c4e0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
1c4f0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
1c500 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65  e, pOrderBy, pNe
1c510 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  w);.        if( 
1c520 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64 65  pOrderBy ) pOrde
1c530 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b  rBy->a[nOrderBy+
1c540 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  +].u.x.iOrderByC
1c550 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20  ol = (u16)i;.   
1c560 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1c570 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
1c580 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d   comparison perm
1c590 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69  utation and keyi
1c5a0 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65 64  nfo that is used
1c5b0 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70   with.  ** the p
1c5c0 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20  ermutation used 
1c5d0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
1c5e0 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f  the next.  ** ro
1c5f0 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d  w of results com
1c600 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20  es from selectA 
1c610 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73  or selectB.  Als
1c620 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20  o add explicit. 
1c630 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74   ** collations t
1c640 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
1c650 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74  lause terms so t
1c660 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75 62  hat when the sub
1c670 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20  queries.  ** to 
1c680 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74 68  the right and th
1c690 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75  e left are evalu
1c6a0 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20 74  ated, they use t
1c6b0 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20  he correct.  ** 
1c6c0 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  collation..  */.
1c6d0 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c    aPermute = sql
1c6e0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
1c6f0 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74  N(db, sizeof(int
1c700 29 2a 28 6e 4f 72 64 65 72 42 79 20 2b 20 31 29  )*(nOrderBy + 1)
1c710 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74  );.  if( aPermut
1c720 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  e ){.    struct 
1c730 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1c740 49 74 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75  Item;.    aPermu
1c750 74 65 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79  te[0] = nOrderBy
1c760 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70  ;.    for(i=1, p
1c770 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Item=pOrderBy->a
1c780 3b 20 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69  ; i<=nOrderBy; i
1c790 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1c7a0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1c7b0 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
1c7c0 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  ol>0 );.      as
1c7d0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78  sert( pItem->u.x
1c7e0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d  .iOrderByCol<=p-
1c7f0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
1c800 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65  ;.      aPermute
1c810 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78  [i] = pItem->u.x
1c820 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31  .iOrderByCol - 1
1c830 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79  ;.    }.    pKey
1c840 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c  Merge = multiSel
1c850 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
1c860 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b  o(pParse, p, 1);
1c870 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b  .  }else{.    pK
1c880 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d  eyMerge = 0;.  }
1c890 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20  ..  /* Reattach 
1c8a0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1c8b0 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79  use to the query
1c8c0 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ..  */.  p->pOrd
1c8d0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
1c8e0 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  .  pPrior->pOrde
1c8f0 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
1c900 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d  rListDup(pParse-
1c910 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30  >db, pOrderBy, 0
1c920 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
1c930 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d  e a range of tem
1c940 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
1c950 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f   and the KeyInfo
1c960 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72   needed.  ** for
1c970 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
1c980 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74  removes duplicat
1c990 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68  e result rows wh
1c9a0 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72  en the.  ** oper
1c9b0 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45  ator is UNION, E
1c9c0 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
1c9d0 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49  ECT (but not UNI
1c9e0 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20  ON ALL)..  */.  
1c9f0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
1ca00 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  {.    regPrev = 
1ca10 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1ca20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70  int nExpr = p->p
1ca30 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
1ca40 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72    assert( nOrder
1ca50 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d  By>=nExpr || db-
1ca60 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1ca70 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70  .    regPrev = p
1ca80 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
1ca90 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
1caa0 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20  += nExpr+1;.    
1cab0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cac0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1cad0 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   0, regPrev);.  
1cae0 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69    pKeyDup = sqli
1caf0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
1cb00 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20  db, nExpr, 1);. 
1cb10 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29     if( pKeyDup )
1cb20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1cb30 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
1cb40 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75  Writeable(pKeyDu
1cb50 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  p) );.      for(
1cb60 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  i=0; i<nExpr; i+
1cb70 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  +){.        pKey
1cb80 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Dup->aColl[i] = 
1cb90 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
1cba0 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
1cbb0 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75  ;.        pKeyDu
1cbc0 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  p->aSortOrder[i]
1cbd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1cbe0 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53    }.  }. .  /* S
1cbf0 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74  eparate the left
1cc00 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71   and the right q
1cc10 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e  uery from one an
1cc20 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e  other.  */.  p->
1cc30 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50  pPrior = 0;.  pP
1cc40 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  rior->pNext = 0;
1cc50 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
1cc60 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
1cc70 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  arse, p, p->pOrd
1cc80 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
1cc90 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50    if( pPrior->pP
1cca0 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rior==0 ){.    s
1ccb0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
1ccc0 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
1ccd0 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72  , pPrior, pPrior
1cce0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
1ccf0 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ER");.  }..  /* 
1cd00 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69  Compute the limi
1cd10 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  t registers */. 
1cd20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
1cd30 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
1cd40 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69  , labelEnd);.  i
1cd50 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20  f( p->iLimit && 
1cd60 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
1cd70 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b    regLimitA = ++
1cd80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1cd90 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b    regLimitB = ++
1cda0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1cdb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cdc0 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
1cdd0 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e  p->iOffset ? p->
1cde0 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69  iOffset+1 : p->i
1cdf0 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20  Limit,.         
1ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce10 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69           regLimi
1ce20 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
1ce30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ce40 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41  _Copy, regLimitA
1ce50 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20  , regLimitB);.  
1ce60 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69  }else{.    regLi
1ce70 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42  mitA = regLimitB
1ce80 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
1ce90 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1cea0 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
1ceb0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a  p->pLimit = 0;..
1cec0 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70    regAddrA = ++p
1ced0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
1cee0 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72  egAddrB = ++pPar
1cef0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
1cf00 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utA = ++pParse->
1cf10 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20  nMem;.  regOutB 
1cf20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1cf30 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1cf40 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41  tDestInit(&destA
1cf50 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
1cf60 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
1cf70 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
1cf80 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f  nit(&destB, SRT_
1cf90 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
1cfa0 64 72 42 29 3b 0a 0a 20 20 45 78 70 6c 61 69 6e  drB);..  Explain
1cfb0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
1cfc0 65 2c 20 31 2c 20 22 4d 45 52 47 45 20 28 25 73  e, 1, "MERGE (%s
1cfd0 29 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  )", selectOpName
1cfe0 28 70 2d 3e 6f 70 29 29 29 3b 0a 0a 20 20 2f 2a  (p->op)));..  /*
1cff0 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f   Generate a coro
1d000 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74  utine to evaluat
1d010 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
1d020 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20  tement to the.  
1d030 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63  ** left of the c
1d040 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72  ompound operator
1d050 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63   - the "A" selec
1d060 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65  t..  */.  addrSe
1d070 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56  lectA = sqlite3V
1d080 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1d090 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d  ) + 1;.  addr1 =
1d0a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d0b0 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
1d0c0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
1d0d0 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41  , 0, addrSelectA
1d0e0 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
1d0f0 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43  ((v, "left SELEC
1d100 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  T"));.  pPrior->
1d110 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
1d120 74 41 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65  tA;.  ExplainQue
1d130 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
1d140 31 2c 20 22 4c 45 46 54 22 29 29 3b 0a 20 20 73  1, "LEFT"));.  s
1d150 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1d160 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
1d170 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  stA);.  sqlite3V
1d180 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
1d190 76 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  v, regAddrA);.  
1d1a0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1d1b0 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
1d1c0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1d1d0 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
1d1e0 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
1d1f0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20   statement on . 
1d200 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20   ** the right - 
1d210 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20  the "B" select. 
1d220 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
1d230 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
1d240 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
1d250 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  1;.  addr1 = sql
1d260 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1d270 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
1d280 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c  ne, regAddrB, 0,
1d290 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20   addrSelectB);. 
1d2a0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1d2b0 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29   "right SELECT")
1d2c0 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20  );.  savedLimit 
1d2d0 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73  = p->iLimit;.  s
1d2e0 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e  avedOffset = p->
1d2f0 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c  iOffset;.  p->iL
1d300 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42  imit = regLimitB
1d310 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
1d320 20 30 3b 20 20 0a 20 20 45 78 70 6c 61 69 6e 51   0;  .  ExplainQ
1d330 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
1d340 2c 20 31 2c 20 22 52 49 47 48 54 22 29 29 3b 0a  , 1, "RIGHT"));.
1d350 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
1d360 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
1d370 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  B);.  p->iLimit 
1d380 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20  = savedLimit;.  
1d390 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76  p->iOffset = sav
1d3a0 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69  edOffset;.  sqli
1d3b0 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
1d3c0 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72 42 29  ine(v, regAddrB)
1d3d0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1d3e0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
1d3f0 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
1d400 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
1d410 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e A.  ** select 
1d420 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
1d430 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
1d440 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
1d450 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
1d460 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
1d470 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22  t routine for A"
1d480 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d  ));.  addrOutA =
1d490 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
1d4a0 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
1d4b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d4c0 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44     p, &destA, pD
1d4d0 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20  est, regOutA,.  
1d4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1d4f0 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
1d500 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20   labelEnd);.  . 
1d510 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1d520 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
1d530 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
1d540 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a  nt row of the B.
1d550 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
1d560 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
1d570 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
1d580 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
1d590 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1d5a0 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
1d5b0 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70   ){.    VdbeNoop
1d5c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
1d5d0 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
1d5e0 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75  B"));.    addrOu
1d5f0 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tB = generateOut
1d600 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
1d610 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
1d620 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42         p, &destB
1d630 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42  , pDest, regOutB
1d640 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d650 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
1d660 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  Dup, labelEnd);.
1d670 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79    }.  sqlite3Key
1d680 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75  InfoUnref(pKeyDu
1d690 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  p);..  /* Genera
1d6a0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1d6b0 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
1d6c0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
1d6d0 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65  ect A.  ** are e
1d6e0 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
1d6f0 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
1d700 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   B remains..  */
1d710 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58  .  if( op==TK_EX
1d720 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  CEPT || op==TK_I
1d730 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
1d740 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61  addrEofA_noB = a
1d750 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45  ddrEofA = labelE
1d760 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  nd;.  }else{  . 
1d770 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1d780 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75  nt((v, "eof-A su
1d790 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
1d7a0 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69   addrEofA = sqli
1d7b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d7c0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1d7d0 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
1d7e0 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20     addrEofA_noB 
1d7f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1d800 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1d810 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c   regAddrB, label
1d820 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  End);.          
1d830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d840 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
1d850 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1d860 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1d870 76 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  v, addrEofA);.  
1d880 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
1d890 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
1d8a0 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
1d8b0 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
1d8c0 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  tRow);.  }..  /*
1d8d0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1d8e0 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
1d8f0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
1d900 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a  rom select B.  *
1d910 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
1d920 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
1d930 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e   select A remain
1d940 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  s..  */.  if( op
1d950 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
1d960 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  {.    addrEofB =
1d970 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69   addrEofA;.    i
1d980 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
1d990 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   > pPrior->nSele
1d9a0 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
1d9b0 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
1d9c0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65  nSelectRow;.  }e
1d9d0 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
1d9e0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1d9f0 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  eof-B subroutine
1da00 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
1da10 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
1da20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1da30 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
1da40 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  OutA);.    sqlit
1da50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1da60 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1da70 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56  rA, labelEnd); V
1da80 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1da90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1daa0 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 42 29  oto(v, addrEofB)
1dab0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
1dac0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
1dad0 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
1dae0 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A<B.  */.  VdbeN
1daf0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1db00 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-lt-B subroutin
1db10 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42  e"));.  addrAltB
1db20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1db30 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1db40 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
1db50 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  utA);.  sqlite3V
1db60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1db70 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1db80 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65   addrEofA); Vdbe
1db90 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
1dba0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1dbb0 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
1dbc0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1dbd0 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1dbe0 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a  case of A==B.  *
1dbf0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
1dc00 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65  LL ){.    addrAe
1dc10 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20  qB = addrAltB;. 
1dc20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
1dc30 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
1dc40 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
1dc50 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72  drAltB;.    addr
1dc60 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  AltB++;.  }else{
1dc70 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1dc80 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42  ment((v, "A-eq-B
1dc90 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1dca0 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20      addrAeqB =. 
1dcb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1dcc0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1dcd0 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1dce0 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72  EofA); VdbeCover
1dcf0 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1dd00 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1dd10 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a  abelCmpr);.  }..
1dd20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1dd30 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
1dd40 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a   case of A>B.  *
1dd50 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
1dd60 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20  ent((v, "A-gt-B 
1dd70 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1dd80 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69   addrAgtB = sqli
1dd90 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1dda0 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d  dr(v);.  if( op=
1ddb0 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54  =TK_ALL || op==T
1ddc0 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73  K_UNION ){.    s
1ddd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1dde0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1ddf0 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
1de00 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
1de10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1de20 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
1de30 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65   addrEofB); Vdbe
1de40 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
1de50 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1de60 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
1de70 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75   /* This code ru
1de80 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69  ns once to initi
1de90 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67  alize everything
1dea0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1deb0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
1dec0 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  addr1);.  sqlite
1ded0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1dee0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1def0 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29  A, addrEofA_noB)
1df00 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1df10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1df20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1df30 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ld, regAddrB, ad
1df40 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76  drEofB); VdbeCov
1df50 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
1df60 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61  Implement the ma
1df70 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20  in merge loop.  
1df80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1df90 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1dfa0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71  labelCmpr);.  sq
1dfb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1dfc0 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f  v, OP_Permutatio
1dfd0 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  n, 0, 0, 0, (cha
1dfe0 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f  r*)aPermute, P4_
1dff0 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c  INTARRAY);.  sql
1e000 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1e010 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65  , OP_Compare, de
1e020 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42  stA.iSdst, destB
1e030 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79  .iSdst, nOrderBy
1e040 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e050 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1e060 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f  *)pKeyMerge, P4_
1e070 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69  KEYINFO);.  sqli
1e080 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1e090 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54  v, OPFLAG_PERMUT
1e0a0 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  E);.  sqlite3Vdb
1e0b0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
1e0c0 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64  mp, addrAltB, ad
1e0d0 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42  drAeqB, addrAgtB
1e0e0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1e0f0 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  v);..  /* Jump t
1e100 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74  o the this point
1e110 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72   in order to ter
1e120 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79  minate the query
1e130 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1e140 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1e150 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a  (v, labelEnd);..
1e160 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20    /* Reassembly 
1e170 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
1e180 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ry so that it wi
1e190 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72 72  ll be freed corr
1e1a0 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68  ectly.  ** by th
1e1b0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1e1c0 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  on */.  if( p->p
1e1d0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  Prior ){.    sql
1e1e0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
1e1f0 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b  (db, p->pPrior);
1e200 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72  .  }.  p->pPrior
1e210 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72   = pPrior;.  pPr
1e220 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  ior->pNext = p;.
1e230 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e  .  /*** TBD:  In
1e240 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20  sert subroutine 
1e250 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63  calls to close c
1e260 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70  ursors on incomp
1e270 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71  lete.  **** subq
1e280 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 45  ueries ****/.  E
1e290 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50  xplainQueryPlanP
1e2a0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65  op(pParse);.  re
1e2b0 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72  turn pParse->nEr
1e2c0 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  r!=0;.}.#endif..
1e2d0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1e2e0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1e2f0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1e300 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1e310 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  ../* An instance
1e320 20 6f 66 20 74 68 65 20 53 75 62 73 74 43 6f 6e   of the SubstCon
1e330 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65 73 63  text object desc
1e340 72 69 62 65 73 20 61 6e 20 73 75 62 73 74 69 74  ribes an substit
1e350 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74 6f  ution edit.** to
1e360 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   be performed on
1e370 20 61 20 70 61 72 73 65 20 74 72 65 65 2e 0a 2a   a parse tree..*
1e380 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65 6e  *.** All referen
1e390 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
1e3a0 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20 61  n table iTable a
1e3b0 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  re to be replace
1e3c0 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e 64 69  d by correspondi
1e3d0 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  ng.** expression
1e3e0 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a  s in pEList..*/.
1e3f0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
1e400 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20 20  ubstContext {.  
1e410 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
1e420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e430 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
1e440 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1e450 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e460 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66 65 72  /* Replace refer
1e470 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61  ences to this ta
1e480 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65  ble */.  int iNe
1e490 77 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  wTable;         
1e4a0 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65 20     /* New table 
1e4b0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
1e4c0 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20 20  isLeftJoin;     
1e4d0 20 20 20 20 20 20 2f 2a 20 41 64 64 20 54 4b 5f        /* Add TK_
1e4e0 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f  IF_NULL_ROW opco
1e4f0 64 65 73 20 6f 6e 20 65 61 63 68 20 72 65 70 6c  des on each repl
1e500 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  acement */.  Exp
1e510 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
1e520 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63         /* Replac
1e530 65 6d 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  ement expression
1e540 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f 6e 74  s */.} SubstCont
1e550 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  ext;../* Forward
1e560 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   Declarations */
1e570 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1e580 73 74 45 78 70 72 4c 69 73 74 28 53 75 62 73 74  stExprList(Subst
1e590 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72 4c 69  Context*, ExprLi
1e5a0 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  st*);.static voi
1e5b0 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 75  d substSelect(Su
1e5c0 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53 65 6c  bstContext*, Sel
1e5d0 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  ect*, int);../*.
1e5e0 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
1e5f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
1e600 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
1e610 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
1e620 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
1e630 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
1e640 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
1e650 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d   of the iColumn-
1e660 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  th.** entry in p
1e670 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
1e680 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
1e690 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
1e6a0 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
1e6b0 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ).**.** This rou
1e6c0 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20  tine is part of 
1e6d0 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70  the flattening p
1e6e0 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62  rocedure.  A sub
1e6f0 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72  query.** whose r
1e700 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66  esult set is def
1e710 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61  ined by pEList a
1e720 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20  ppears as entry 
1e730 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  in the.** FROM c
1e740 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
1e750 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  T such that the 
1e760 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69  VDBE cursor assi
1e770 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20  gned to that.** 
1e780 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FORM clause entr
1e790 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68  y is iTable.  Th
1e7a0 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  is routine makes
1e7b0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a   the necessary .
1e7c0 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45  ** changes to pE
1e7d0 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72  xpr so that it r
1e7e0 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
1e7f0 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  o the source tab
1e800 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62  le.** of the sub
1e810 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65  query rather the
1e820 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
1e830 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  he subquery..*/.
1e840 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62  static Expr *sub
1e850 73 74 45 78 70 72 28 0a 20 20 53 75 62 73 74 43  stExpr(.  SubstC
1e860 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20  ontext *pSubst, 
1e870 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1e880 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75 74  of the substitut
1e890 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ion */.  Expr *p
1e8a0 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
1e8b0 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68  /* Expr in which
1e8c0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63   substitution oc
1e8d0 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  curs */.){.  if(
1e8e0 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
1e8f0 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72  rn 0;.  if( Expr
1e900 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1e910 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
1e920 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 52 69     && pExpr->iRi
1e930 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53  ghtJoinTable==pS
1e940 75 62 73 74 2d 3e 69 54 61 62 6c 65 0a 20 20 29  ubst->iTable.  )
1e950 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 52 69  {.    pExpr->iRi
1e960 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70  ghtJoinTable = p
1e970 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65  Subst->iNewTable
1e980 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70  ;.  }.  if( pExp
1e990 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
1e9a0 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
1e9b0 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c  e==pSubst->iTabl
1e9c0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
1e9d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
1e9e0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
1e9f0 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
1ea00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
1ea10 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45  r *pNew;.      E
1ea20 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 70 53 75  xpr *pCopy = pSu
1ea30 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70  bst->pEList->a[p
1ea40 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  Expr->iColumn].p
1ea50 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72  Expr;.      Expr
1ea60 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20   ifNullRow;.    
1ea70 20 20 61 73 73 65 72 74 28 20 70 53 75 62 73 74    assert( pSubst
1ea80 2d 3e 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ->pEList!=0 && p
1ea90 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53  Expr->iColumn<pS
1eaa0 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  ubst->pEList->nE
1eab0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  xpr );.      ass
1eac0 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
1ead0 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
1eae0 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
1eaf0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1eb00 72 49 73 56 65 63 74 6f 72 28 70 43 6f 70 79 29  rIsVector(pCopy)
1eb10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1eb20 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73  te3VectorErrorMs
1eb30 67 28 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65  g(pSubst->pParse
1eb40 2c 20 70 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , pCopy);.      
1eb50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1eb60 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 53 75  qlite3 *db = pSu
1eb70 62 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  bst->pParse->db;
1eb80 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75  .        if( pSu
1eb90 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20  bst->isLeftJoin 
1eba0 26 26 20 70 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b  && pCopy->op!=TK
1ebb0 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
1ebc0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 69 66 4e       memset(&ifN
1ebd0 75 6c 6c 52 6f 77 2c 20 30 2c 20 73 69 7a 65 6f  ullRow, 0, sizeo
1ebe0 66 28 69 66 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20  f(ifNullRow));. 
1ebf0 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52           ifNullR
1ec00 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f 4e 55  ow.op = TK_IF_NU
1ec10 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20 20  LL_ROW;.        
1ec20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66    ifNullRow.pLef
1ec30 74 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20  t = pCopy;.     
1ec40 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 69       ifNullRow.i
1ec50 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e  Table = pSubst->
1ec60 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 20  iNewTable;.     
1ec70 20 20 20 20 20 70 43 6f 70 79 20 3d 20 26 69 66       pCopy = &if
1ec80 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 20  NullRow;.       
1ec90 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20   }.        pNew 
1eca0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
1ecb0 28 64 62 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a  (db, pCopy, 0);.
1ecc0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1ecd0 20 26 26 20 70 53 75 62 73 74 2d 3e 69 73 4c 65   && pSubst->isLe
1ece0 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
1ecf0 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
1ed00 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e  rty(pNew, EP_Can
1ed10 42 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  BeNull);.       
1ed20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
1ed30 4e 65 77 20 26 26 20 45 78 70 72 48 61 73 50 72  New && ExprHasPr
1ed40 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
1ed50 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
1ed60 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 52 69         pNew->iRi
1ed70 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70  ghtJoinTable = p
1ed80 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
1ed90 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
1eda0 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
1edb0 28 70 4e 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f  (pNew, EP_FromJo
1edc0 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  in);.        }. 
1edd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ede0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
1edf0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  pr);.        pEx
1ee00 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  pr = pNew;.     
1ee10 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
1ee20 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1ee30 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  >op==TK_IF_NULL_
1ee40 52 4f 57 20 26 26 20 70 45 78 70 72 2d 3e 69 54  ROW && pExpr->iT
1ee50 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54  able==pSubst->iT
1ee60 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 45  able ){.      pE
1ee70 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53  xpr->iTable = pS
1ee80 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b  ubst->iNewTable;
1ee90 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 78 70 72  .    }.    pExpr
1eea0 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45  ->pLeft = substE
1eeb0 78 70 72 28 70 53 75 62 73 74 2c 20 70 45 78 70  xpr(pSubst, pExp
1eec0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70  r->pLeft);.    p
1eed0 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73  Expr->pRight = s
1eee0 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1eef0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
1ef00 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
1ef10 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1ef20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
1ef30 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1ef40 63 74 28 70 53 75 62 73 74 2c 20 70 45 78 70 72  ct(pSubst, pExpr
1ef50 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b  ->x.pSelect, 1);
1ef60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ef70 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1ef80 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78  pSubst, pExpr->x
1ef90 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
1efa0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
1efb0 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  r;.}.static void
1efc0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a   substExprList(.
1efd0 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a    SubstContext *
1efe0 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72  pSubst, /* Descr
1eff0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  iption of the su
1f000 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20  bstitution */.  
1f010 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
1f020 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
1f030 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69   scan and in whi
1f040 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
1f050 69 74 75 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  itutes */.){.  i
1f060 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1f070 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1f080 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1f090 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1f0a0 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
1f0b0 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78 70  pExpr = substExp
1f0c0 72 28 70 53 75 62 73 74 2c 20 70 4c 69 73 74 2d  r(pSubst, pList-
1f0d0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1f0e0 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1f0f0 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 53  substSelect(.  S
1f100 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75  ubstContext *pSu
1f110 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74  bst, /* Descript
1f120 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1f130 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  itution */.  Sel
1f140 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1f150 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
1f160 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20  tement in which 
1f170 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1f180 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64  tions */.  int d
1f190 6f 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  oPrior          
1f1a0 20 2f 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74   /* Do substitut
1f1b0 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20  es on p->pPrior 
1f1c0 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  too */.){.  SrcL
1f1d0 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72  ist *pSrc;.  str
1f1e0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1f1f0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
1f200 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
1f210 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73  urn;.  do{.    s
1f220 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1f230 62 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  bst, p->pEList);
1f240 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1f250 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 47  st(pSubst, p->pG
1f260 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 75 62  roupBy);.    sub
1f270 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1f280 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  t, p->pOrderBy);
1f290 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
1f2a0 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62  = substExpr(pSub
1f2b0 73 74 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  st, p->pHaving);
1f2c0 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
1f2d0 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73   substExpr(pSubs
1f2e0 74 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  t, p->pWhere);. 
1f2f0 20 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72     pSrc = p->pSr
1f300 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
1f310 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  Src!=0 );.    fo
1f320 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20  r(i=pSrc->nSrc, 
1f330 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69  pItem=pSrc->a; i
1f340 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
1f350 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1f360 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70 49 74  lect(pSubst, pIt
1f370 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b  em->pSelect, 1);
1f380 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1f390 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
1f3a0 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73 74 45  {.        substE
1f3b0 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1f3c0 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  pItem->u1.pFuncA
1f3d0 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
1f3e0 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50   }.  }while( doP
1f3f0 72 69 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e  rior && (p = p->
1f400 70 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a  pPrior)!=0 );.}.
1f410 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
1f420 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1f430 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1f440 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1f450 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21  _VIEW) */..#if !
1f460 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1f470 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1f480 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1f490 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a  _OMIT_VIEW)./*.*
1f4a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1f4b0 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
1f4c0 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 73  en subqueries as
1f4d0 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f   a performance o
1f4e0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20  ptimization..** 
1f4f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1f500 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b  urns 1 if it mak
1f510 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30  es changes and 0
1f520 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e   if no flattenin
1f530 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  g occurs..**.** 
1f540 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  To understand th
1f550 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61  e concept of fla
1f560 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65  ttening, conside
1f570 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  r the following.
1f580 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  ** query:.**.** 
1f590 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
1f5a0 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53  M (SELECT x+y AS
1f5b0 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
1f5c0 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e   z<100) WHERE a>
1f5d0 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  5.**.** The defa
1f5e0 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65  ult way of imple
1f5f0 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65  menting this que
1f600 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65  ry is to execute
1f610 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79   the.** subquery
1f620 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65   first and store
1f630 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
1f640 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
1f650 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74  e, then.** run t
1f660 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f  he outer query o
1f670 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
1f680 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65   table.  This re
1f690 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61  quires two.** pa
1f6a0 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61  sses over the da
1f6b0 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65  ta.  Furthermore
1f6c0 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65  , because the te
1f6d0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a  mporary table.**
1f6e0 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c   has no indices,
1f6f0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1f700 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e on the outer q
1f710 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  uery cannot be.*
1f720 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a  * optimized..**.
1f730 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f740 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72  attempts to rewr
1f750 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68  ite queries such
1f760 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e   as the above in
1f770 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66  to.** a single f
1f780 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65  lat select, like
1f790 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1f7a0 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61   SELECT x+y AS a
1f7b0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
1f7c0 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a  <100 AND a>5.**.
1f7d0 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
1f7e0 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73  rated for this s
1f7f0 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69  implification gi
1f800 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73  ves the same res
1f810 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20  ult.** but only 
1f820 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20  has to scan the 
1f830 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20  data once.  And 
1f840 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20  because indices 
1f850 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20  might .** exist 
1f860 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c  on the table t1,
1f870 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e   a complete scan
1f880 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67   of the data mig
1f890 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64  ht be.** avoided
1f8a0 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69  ..**.** Flatteni
1f8b0 6e 67 20 69 73 20 73 75 62 6a 65 63 74 20 74 6f  ng is subject to
1f8c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
1f8d0 6f 6e 73 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a  onstraints:.**.*
1f8e0 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c  *  (**)  We no l
1f8f0 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f  onger attempt to
1f900 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61   flatten aggrega
1f910 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 57  te subqueries. W
1f920 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  as:.**        Th
1f930 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
1f940 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63  he outer query c
1f950 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 61 67  annot both be ag
1f960 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1f970 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e   (**)  We no lon
1f980 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66  ger attempt to f
1f990 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65  latten aggregate
1f9a0 20 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73   subqueries. Was
1f9b0 3a 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 29 20  :.**        (2) 
1f9c0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1f9d0 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
1f9e0 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28  then.**        (
1f9f0 32 61 29 20 74 68 65 20 6f 75 74 65 72 20 71 75  2a) the outer qu
1fa00 65 72 79 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ery must not be 
1fa10 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20  a join and.**   
1fa20 20 20 20 20 20 28 32 62 29 20 74 68 65 20 6f 75       (2b) the ou
1fa30 74 65 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e  ter query must n
1fa40 6f 74 20 75 73 65 20 73 75 62 71 75 65 72 69 65  ot use subquerie
1fa50 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
1fa60 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
1fa70 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  one FROM-clause 
1fa80 73 75 62 71 75 65 72 79 20 74 68 61 74 20 69 73  subquery that is
1fa90 20 61 20 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20   a candidate.** 
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
1fab0 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28 54 68  flattening.  (Th
1fac0 69 73 20 69 73 20 64 75 65 20 74 6f 20 74 69 63  is is due to tic
1fad0 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33 62 66  ket [2f7170d73bf
1fae0 39 61 62 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20  9abf80].**      
1faf0 20 20 20 20 20 20 20 66 72 6f 6d 20 32 30 31 35         from 2015
1fb00 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20  -02-09.).**.**  
1fb10 20 28 33 29 20 20 49 66 20 74 68 65 20 73 75 62   (3)  If the sub
1fb20 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
1fb30 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
1fb40 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a  LEFT JOIN then.*
1fb50 2a 20 20 20 20 20 20 20 20 28 33 61 29 20 74 68  *        (3a) th
1fb60 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
1fb70 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64  ot be a join and
1fb80 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 62 29 20  .**        (3b) 
1fb90 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1fba0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1fbb0 6d 61 79 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  may not contain 
1fbc0 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20  a virtual.**    
1fbd0 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 61           table a
1fbe0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 63  nd.**        (3c
1fbf0 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1fc00 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20  y may not be an 
1fc10 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a  aggregate..**.**
1fc20 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
1fc30 75 65 72 79 20 63 61 6e 20 6e 6f 74 20 62 65 20  uery can not be 
1fc40 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1fc50 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f   (**)  At one po
1fc60 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  int restrictions
1fc70 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66   (4) and (5) def
1fc80 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66  ined a subset of
1fc90 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20   DISTINCT.**    
1fca0 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20      sub-queries 
1fcb0 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64  that were exclud
1fcc0 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74  ed from this opt
1fcd0 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72  imization. Restr
1fce0 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20  iction .**      
1fcf0 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20    (4) has since 
1fd00 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f  been expanded to
1fd10 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53   exclude all DIS
1fd20 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73  TINCT subqueries
1fd30 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57  ..**.**  (**)  W
1fd40 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65  e no longer atte
1fd50 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61  mpt to flatten a
1fd60 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
1fd70 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20  ies.  Was:.**   
1fd80 20 20 20 20 20 49 66 20 74 68 65 20 73 75 62 71       If the subq
1fd90 75 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74  uery is aggregat
1fda0 65 2c 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  e, the outer que
1fdb0 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 44 49  ry may not be DI
1fdc0 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
1fdd0 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
1fde0 79 20 6d 75 73 74 20 68 61 76 65 20 61 20 46 52  y must have a FR
1fdf0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f  OM clause.  TODO
1fe00 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72 69 65  :  For subquerie
1fe10 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20  s without.**    
1fe20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73      A FROM claus
1fe30 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69  e, consider addi
1fe40 6e 67 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  ng a FROM clause
1fe50 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
1fe60 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c  l.**        tabl
1fe70 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68  e sqlite_once th
1fe80 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  at consists of a
1fe90 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74   single row cont
1fea0 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  aining a.**     
1feb0 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a     single NULL..
1fec0 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 49 66 20  **.**   (8)  If 
1fed0 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1fee0 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
1fef0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1ff00 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a   not be a join..
1ff10 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 49 66 20  **.**   (9)  If 
1ff20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1ff30 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
1ff40 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1ff50 20 6e 6f 74 20 62 65 20 61 67 67 72 65 67 61 74   not be aggregat
1ff60 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  e..**.**  (**)  
1ff70 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29  Restriction (10)
1ff80 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f   was removed fro
1ff90 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30  m the code on 20
1ffa0 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a  05-02-05 but we.
1ffb0 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69 64 65  **        accide
1ffc0 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74 68 65  ntly carried the
1ffd0 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64   comment forward
1ffe0 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31   until 2014-09-1
1fff0 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20  5.  Original.** 
20000 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e         constrain
20010 74 3a 20 22 49 66 20 74 68 65 20 73 75 62 71 75  t: "If the subqu
20020 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65  ery is aggregate
20030 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
20040 71 75 65 72 79 20 0a 2a 2a 20 20 20 20 20 20 20  query .**       
20050 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d   may not use LIM
20060 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29  IT.".**.**  (11)
20070 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
20080 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
20090 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20  ry may not both 
200a0 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c  have ORDER BY cl
200b0 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  auses..**.**  (*
200c0 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e  *)  Not implemen
200d0 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69  ted.  Subsumed i
200e0 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20  nto restriction 
200f0 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f  (3).  Was previo
20100 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61  usly.**        a
20110 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72 69   separate restri
20120 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66  ction deriving f
20130 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e  rom ticket #350.
20140 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68  .**.**  (13)  Th
20150 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f  e subquery and o
20160 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
20170 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49  ot both use LIMI
20180 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20  T..**.**  (14)  
20190 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  The subquery may
201a0 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e   not use OFFSET.
201b0 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 49 66  .**.**  (15)  If
201c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
201d0 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 63 6f   is part of a co
201e0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
201f0 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  hen the.**      
20200 20 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e    subquery may n
20210 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a  ot use LIMIT..**
20220 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63          (See tic
20230 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69  ket #2339 and ti
20240 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34  cket [02a8e81d44
20250 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20  ])..**.**  (16) 
20260 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   If the outer qu
20270 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65  ery is aggregate
20280 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 71 75  , then the subqu
20290 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20  ery may not.**  
202a0 20 20 20 20 20 20 75 73 65 20 4f 52 44 45 52 20        use ORDER 
202b0 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39  BY.  (Ticket #29
202c0 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74  42)  This used t
202d0 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20  o not matter.** 
202e0 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20         until we 
202f0 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67  introduced the g
20300 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75  roup_concat() fu
20310 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20  nction.  .**.** 
20320 20 28 31 37 29 20 20 49 66 20 74 68 65 20 73 75   (17)  If the su
20330 62 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  bquery is a comp
20340 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
20350 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 61  n.**        (17a
20360 29 20 61 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f  ) all compound o
20370 70 65 72 61 74 6f 72 73 20 6d 75 73 74 20 62 65  perators must be
20380 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e   a UNION ALL, an
20390 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 62  d.**        (17b
203a0 29 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 69  ) no terms withi
203b0 6e 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63  n the subquery c
203c0 6f 6d 70 6f 75 6e 64 20 6d 61 79 20 62 65 20 61  ompound may be a
203d0 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 20 20  ggregate.**     
203e0 20 20 20 20 20 20 20 20 20 6f 72 20 44 49 53 54           or DIST
203f0 49 4e 43 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  INCT, and.**    
20400 20 20 20 20 28 31 37 63 29 20 65 76 65 72 79 20      (17c) every 
20410 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20  term within the 
20420 73 75 62 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e  subquery compoun
20430 64 20 6d 75 73 74 20 68 61 76 65 20 61 20 46 52  d must have a FR
20440 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20  OM clause.**    
20450 20 20 20 20 28 31 37 64 29 20 74 68 65 20 6f 75      (17d) the ou
20460 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
20470 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  t be.**         
20480 20 20 20 20 20 28 31 37 64 31 29 20 61 67 67 72       (17d1) aggr
20490 65 67 61 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20  egate, or.**    
204a0 20 20 20 20 20 20 20 20 20 20 28 31 37 64 32 29            (17d2)
204b0 20 44 49 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a   DISTINCT, or.**
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31                (1
204d0 37 64 33 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a  7d3) a join..**.
204e0 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61  **        The pa
204f0 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65  rent and sub-que
20500 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57  ry may contain W
20510 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75  HERE clauses. Su
20520 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20  bject to.**     
20530 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28     rules (11), (
20540 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68  13) and (14), th
20550 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  ey may also cont
20560 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a  ain ORDER BY,.**
20570 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e          LIMIT an
20580 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
20590 2e 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  .  The subquery 
205a0 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63  cannot use any c
205b0 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
205c0 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72    operator other
205d0 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20   than UNION ALL 
205e0 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20  because all the 
205f0 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a  other compound.*
20600 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f  *        operato
20610 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69  rs have an impli
20620 65 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63  ed DISTINCT whic
20630 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20  h is disallowed 
20640 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73  by.**        res
20650 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a  triction (4)..**
20660 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c  .**        Also,
20670 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20   each component 
20680 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
20690 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   must return the
206a0 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   same number.** 
206b0 20 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74         of result
206c0 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69   columns. This i
206d0 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71  s actually a req
206e0 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79  uirement for any
206f0 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
20700 20 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65      SELECT state
20710 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68  ment, but all th
20720 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73  e code here does
20730 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68   is make sure th
20740 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20  at no.**        
20750 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73  such (illegal) s
20760 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74  ub-query is flat
20770 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  tened. The calle
20780 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68  r will detect th
20790 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74  e.**        synt
207a0 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74  ax error and ret
207b0 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d  urn a detailed m
207c0 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  essage..**.**  (
207d0 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  18)  If the sub-
207e0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
207f0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
20800 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
20810 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45  e.**        ORDE
20820 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 74  R BY clause of t
20830 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62  he parent must b
20840 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e  e simple referen
20850 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20  ces to .**      
20860 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65    columns of the
20870 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a   sub-query..**.*
20880 2a 20 20 28 31 39 29 20 20 49 66 20 74 68 65 20  *  (19)  If the 
20890 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49  subquery uses LI
208a0 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74  MIT then the out
208b0 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
208c0 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20  .**        have 
208d0 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  a WHERE clause..
208e0 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20  **.**  (20)  If 
208f0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
20900 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
20910 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  ct, then it must
20920 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
20930 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63     an ORDER BY c
20940 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23  lause.  Ticket #
20950 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20  3773.  We could 
20960 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74  relax this const
20970 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  raint.**        
20980 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79 69  somewhat by sayi
20990 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72 6d  ng that the term
209a0 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
209b0 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a  Y clause must.**
209c0 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20 61          appear a
209d0 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73  s unmodified res
209e0 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ult columns in t
209f0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
20a00 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20   But we.**      
20a10 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74    have other opt
20a20 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69  imizations in mi
20a30 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  nd to deal with 
20a40 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  that case..**.**
20a50 20 20 28 32 31 29 20 20 49 66 20 74 68 65 20 73    (21)  If the s
20a60 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d  ubquery uses LIM
20a70 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65  IT then the oute
20a80 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
20a90 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  be.**        DIS
20aa0 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63  TINCT.  (See tic
20ab0 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d  ket [752e1646fc]
20ac0 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20  )..**.**  (22)  
20ad0 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  The subquery may
20ae0 20 6e 6f 74 20 62 65 20 61 20 72 65 63 75 72 73   not be a recurs
20af0 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20  ive CTE..**.**  
20b00 28 2a 2a 29 20 20 53 75 62 73 75 6d 65 64 20 69  (**)  Subsumed i
20b10 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20  nto restriction 
20b20 28 31 37 64 33 29 2e 20 20 57 61 73 3a 20 49 66  (17d3).  Was: If
20b30 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20b40 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 61 20   is.**        a 
20b50 72 65 63 75 72 73 69 76 65 20 43 54 45 2c 20 74  recursive CTE, t
20b60 68 65 6e 20 74 68 65 20 73 75 62 2d 71 75 65 72  hen the sub-quer
20b70 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63  y may not be a c
20b80 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a  ompound query..*
20b90 2a 20 20 20 20 20 20 20 20 54 68 69 73 20 72 65  *        This re
20ba0 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63  striction is bec
20bb0 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e  ause transformin
20bc0 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  g the.**        
20bd0 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70  parent to a comp
20be0 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75  ound query confu
20bf0 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68 61  ses the code tha
20c00 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20  t handles.**    
20c10 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71 75      recursive qu
20c20 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65  eries in multiSe
20c30 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  lect()..**.**  (
20c40 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65  **)  We no longe
20c50 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61  r attempt to fla
20c60 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73  tten aggregate s
20c70 75 62 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a  ubqueries.  Was:
20c80 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 73  .**        The s
20c90 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
20ca0 62 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  be an aggregate 
20cb0 74 68 61 74 20 75 73 65 73 20 74 68 65 20 62 75  that uses the bu
20cc0 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20  ilt-in min() or 
20cd0 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61  .**        or ma
20ce0 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  x() functions.  
20cf0 28 57 69 74 68 6f 75 74 20 74 68 69 73 20 72 65  (Without this re
20d00 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65  striction, a que
20d10 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20  ry like:.**     
20d20 20 20 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f     "SELECT x FRO
20d30 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29  M (SELECT max(y)
20d40 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f  , x FROM t1)" wo
20d50 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  uld not necessar
20d60 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65  ily.**        re
20d70 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58  turn the value X
20d80 20 66 6f 72 20 77 68 69 63 68 20 59 20 77 61 73   for which Y was
20d90 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a   maximal.).**.**
20da0 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
20db0 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
20dc0 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
20dd0 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
20de0 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
20df0 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
20e00 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
20e10 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
20e20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
20e30 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
20e40 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
20e50 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
20e60 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
20e70 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
20e80 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
20e90 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
20ea0 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
20eb0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
20ec0 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
20ed0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
20ee0 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
20ef0 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
20f00 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
20f10 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
20f20 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
20f30 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
20f40 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
20f50 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
20f60 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
20f70 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
20f80 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
20f90 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
20fa0 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72  /* The parent or
20fb0 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74   outer SELECT st
20fc0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
20fd0 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
20fe0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d    /* Index in p-
20ff0 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68  >pSrc->a[] of th
21000 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79  e inner subquery
21010 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 20   */.  int isAgg 
21020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
21030 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45  ue if outer SELE
21040 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74  CT uses aggregat
21050 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
21060 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
21070 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
21080 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
21090 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65  hContext;.  Sele
210a0 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20  ct *pParent;    
210b0 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e  /* Current UNION
210c0 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65   ALL term of the
210d0 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a   other query */.
210e0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
210f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
21100 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
21110 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65  query" */.  Sele
21120 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20  ct *pSub1;      
21130 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
21140 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65  e rightmost sele
21150 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20  ct in sub-query 
21160 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
21170 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
21180 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
21190 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
211a0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75  /.  SrcList *pSu
211b0 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  bSrc;   /* The F
211c0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
211d0 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
211e0 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
211f0 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
21200 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
21210 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
21220 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
21230 20 69 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20   int iNewParent 
21240 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d  = -1;/* Replacem
21250 65 6e 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50  ent table for iP
21260 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  arent */.  int i
21270 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f  sLeftJoin = 0; /
21280 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 20 69  * True if pSub i
21290 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
212a0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
212b0 2a 2f 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20  */    .  int i; 
212c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
212d0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
212e0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21300 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
21310 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
21320 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
21330 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
21340 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
21350 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
21360 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
21370 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
21380 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
21390 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
213a0 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
213b0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
213c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
213d0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20  >pPrior==0 );.  
213e0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
213f0 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
21400 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
21410 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  er) ) return 0;.
21420 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
21430 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
21440 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
21450 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
21460 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
21470 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
21480 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  ;.  iParent = pS
21490 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ubitem->iCursor;
214a0 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
214b0 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
214c0 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
214d0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 6e  ;..  if( p->pWin
214e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
214f0 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
21500 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
21510 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20  pSubSrc );.  /* 
21520 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e  Prior to version
21530 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d   3.1.2, when LIM
21540 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61  IT and OFFSET ha
21550 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63  d to be simple c
21560 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e  onstants,.  ** n
21570 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70  ot arbitrary exp
21580 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c  ressions, we all
21590 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e  owed some combin
215a0 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64  ing of LIMIT and
215b0 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
215c0 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20  ause they could 
215d0 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63  be computed at c
215e0 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75  ompile-time.  Bu
215f0 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  t when LIMIT and
21600 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
21610 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78  ame arbitrary ex
21620 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65  pressions, we we
21630 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64  re forced to add
21640 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31   restrictions (1
21650 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29  3).  ** and (14)
21660 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  . */.  if( pSub-
21670 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c  >pLimit && p->pL
21680 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
21690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
216a0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33   Restriction (13
216b0 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
216c0 3e 70 4c 69 6d 69 74 20 26 26 20 70 53 75 62 2d  >pLimit && pSub-
216d0 3e 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20  >pLimit->pRight 
216e0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a  ) return 0;   /*
216f0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34   Restriction (14
21700 29 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73  ) */.  if( (p->s
21710 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d  elFlags & SF_Com
21720 70 6f 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75  pound)!=0 && pSu
21730 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
21740 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
21750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21770 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
21780 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d  tion (15) */.  }
21790 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
217a0 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  nSrc==0 ) return
217b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
217c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
217d0 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f  triction (7)  */
217e0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
217f0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
21800 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  nct ) return 0; 
21810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
21820 74 72 69 63 74 69 6f 6e 20 28 34 29 20 20 2a 2f  triction (4)  */
21830 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
21840 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53  mit && (pSrc->nS
21850 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
21860 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
21870 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
21880 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20  rictions (8)(9) 
21890 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  */.  }.  if( p->
218a0 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62  pOrderBy && pSub
218b0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
218c0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
218d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218f0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
21900 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20  ction (11) */.  
21910 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  }.  if( isAgg &&
21920 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
21930 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
21940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21950 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a  striction (16) *
21960 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
21970 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72  imit && p->pWher
21980 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
21990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
219a0 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a  striction (19) *
219b0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
219c0 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  imit && (p->selF
219d0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
219e0 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72  ct)!=0 ){.     r
219f0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
21a00 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
21a10 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (21) */.  }.  if
21a20 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
21a30 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76 65   & (SF_Recursive
21a40 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
21a50 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  0; /* Restrictio
21a60 6e 73 20 28 32 32 29 20 2a 2f 0a 20 20 7d 0a 0a  ns (22) */.  }..
21a70 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    /*.  ** If the
21a80 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
21a90 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
21aa0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74  f a LEFT JOIN, t
21ab0 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  hen the.  ** sub
21ac0 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
21ad0 20 61 20 6a 6f 69 6e 20 69 74 73 65 6c 66 20 28   a join itself (
21ae0 33 61 29 2e 20 45 78 61 6d 70 6c 65 20 6f 66 20  3a). Example of 
21af0 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 0a  why this is not.
21b00 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 3a 0a 20 20    ** allowed:.  
21b10 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
21b20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
21b30 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a  IN (t2 JOIN t3).
21b40 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
21b50 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
21b60 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
21b70 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
21b80 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
21b90 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74   JOIN t2) JOIN t
21ba0 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63  3.  **.  ** whic
21bb0 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20  h is not at all 
21bc0 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a  the same thing..
21bd0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
21be0 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
21bf0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
21c00 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74  f a LEFT JOIN, t
21c10 68 65 6e 20 74 68 65 20 6f 75 74 65 72 0a 20 20  hen the outer.  
21c20 2a 2a 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  ** query cannot 
21c30 62 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  be an aggregate.
21c40 20 28 33 63 29 20 20 54 68 69 73 20 69 73 20 61   (3c)  This is a
21c50 6e 20 61 72 74 69 66 61 63 74 20 6f 66 20 74 68  n artifact of th
21c60 65 20 77 61 79 0a 20 20 2a 2a 20 61 67 67 72 65  e way.  ** aggre
21c70 67 61 74 65 73 20 61 72 65 20 70 72 6f 63 65 73  gates are proces
21c80 73 65 64 20 2d 20 74 68 65 72 65 20 69 73 20 6e  sed - there is n
21c90 6f 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 20 64  o mechanism to d
21ca0 65 74 65 72 6d 69 6e 65 20 69 66 0a 20 20 2a 2a  etermine if.  **
21cb0 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20 74   the LEFT JOIN t
21cc0 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 61  able should be a
21cd0 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20  ll-NULL..  **.  
21ce0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 69 63 6b  ** See also tick
21cf0 65 74 73 20 23 33 30 36 2c 20 23 33 35 30 2c 20  ets #306, #350, 
21d00 61 6e 64 20 23 33 33 30 30 2e 0a 20 20 2a 2f 0a  and #3300..  */.
21d10 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d    if( (pSubitem-
21d20 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
21d30 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20  T_OUTER)!=0 ){. 
21d40 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20     isLeftJoin = 
21d50 31 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 53  1;.    if( pSubS
21d60 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73  rc->nSrc>1 || is
21d70 41 67 67 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  Agg || IsVirtual
21d80 28 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70  (pSubSrc->a[0].p
21d90 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Tab) ){.      /*
21da0 20 20 28 33 61 29 20 20 20 20 20 20 20 20 20 20    (3a)          
21db0 20 20 20 28 33 63 29 20 20 20 20 20 28 33 62 29     (3c)     (3b)
21dc0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
21dd0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69   0;.    }.  }.#i
21de0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52  fdef SQLITE_EXTR
21df0 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a 20 20 65 6c  A_IFNULLROW.  el
21e00 73 65 20 69 66 28 20 69 46 72 6f 6d 3e 30 20 26  se if( iFrom>0 &
21e10 26 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20  & !isAgg ){.    
21e20 2f 2a 20 53 65 74 74 69 6e 67 20 69 73 4c 65 66  /* Setting isLef
21e30 74 4a 6f 69 6e 20 74 6f 20 2d 31 20 63 61 75 73  tJoin to -1 caus
21e40 65 73 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20  es OP_IfNullRow 
21e50 6f 70 63 6f 64 65 73 20 74 6f 20 62 65 20 67 65  opcodes to be ge
21e60 6e 65 72 61 74 65 64 20 66 6f 72 0a 20 20 20 20  nerated for.    
21e70 2a 2a 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ** every referen
21e80 63 65 20 74 6f 20 61 6e 79 20 72 65 73 75 6c 74  ce to any result
21e90 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 73 75 62   column from sub
21ea0 71 75 65 72 79 20 69 6e 20 61 20 6a 6f 69 6e 2c  query in a join,
21eb0 20 65 76 65 6e 0a 20 20 20 20 2a 2a 20 74 68 6f   even.    ** tho
21ec0 75 67 68 20 74 68 65 79 20 61 72 65 20 6e 6f 74  ugh they are not
21ed0 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 69   necessary.  Thi
21ee0 73 20 77 69 6c 6c 20 73 74 72 65 73 73 2d 74 65  s will stress-te
21ef0 73 74 20 74 68 65 20 4f 50 5f 49 66 4e 75 6c 6c  st the OP_IfNull
21f00 52 6f 77 20 0a 20 20 20 20 2a 2a 20 6f 70 63 6f  Row .    ** opco
21f10 64 65 2e 20 2a 2f 0a 20 20 20 20 69 73 4c 65 66  de. */.    isLef
21f20 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a 20 20 7d 0a  tJoin = -1;.  }.
21f30 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 73  #endif..  /* Res
21f40 74 72 69 63 74 69 6f 6e 20 28 31 37 29 3a 20 49  triction (17): I
21f50 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
21f60 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
21f70 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75  LECT, then it mu
21f80 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79  st.  ** use only
21f90 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   the UNION ALL o
21fa0 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e  perator. And non
21fb0 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20  e of the simple 
21fc0 73 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20  select queries. 
21fd0 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70   ** that make up
21fe0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
21ff0 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64  LECT are allowed
22000 20 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65   to be aggregate
22010 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a   or distinct.  *
22020 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a  * queries..  */.
22030 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69    if( pSub->pPri
22040 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  or ){.    if( pS
22050 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
22060 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
22070 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
22080 28 32 30 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  (20) */.    }.  
22090 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28    if( isAgg || (
220a0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
220b0 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c  _Distinct)!=0 ||
220c0 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
220d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
220e0 3b 20 2f 2a 20 28 31 37 64 31 29 2c 20 28 31 37  ; /* (17d1), (17
220f0 64 32 29 2c 20 6f 72 20 28 31 37 64 33 29 20 2a  d2), or (17d3) *
22100 2f 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  /.    }.    for(
22110 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62  pSub1=pSub; pSub
22120 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e  1; pSub1=pSub1->
22130 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74  pPrior){.      t
22140 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
22150 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
22160 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
22170 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
22180 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65  inct );.      te
22190 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
221a0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
221b0 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
221c0 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
221d0 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73  gate );.      as
221e0 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63  sert( pSub->pSrc
221f0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
22200 65 72 74 28 20 70 53 75 62 2d 3e 70 45 4c 69 73  ert( pSub->pELis
22210 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75 62 31 2d  t->nExpr==pSub1-
22220 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
22230 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75  ;.      if( (pSu
22240 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
22250 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
22260 67 67 72 65 67 61 74 65 29 29 21 3d 30 20 20 20  ggregate))!=0   
22270 20 2f 2a 20 28 31 37 62 29 20 2a 2f 0a 20 20 20   /* (17b) */.   
22280 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70      || (pSub1->p
22290 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e  Prior && pSub1->
222a0 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 20 20 20 20  op!=TK_ALL)     
222b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
222c0 31 37 61 29 20 2a 2f 0a 20 20 20 20 20 20 20 7c  17a) */.       |
222d0 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  | pSub1->pSrc->n
222e0 53 72 63 3c 31 20 20 20 20 20 20 20 20 20 20 20  Src<1           
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22300 20 20 20 20 20 20 20 2f 2a 20 28 31 37 63 29 20         /* (17c) 
22310 2a 2f 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  */.      ){.    
22320 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
22330 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
22340 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72  case( pSub1->pSr
22350 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20  c->nSrc>1 );.   
22360 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72   }..    /* Restr
22370 69 63 74 69 6f 6e 20 28 31 38 29 2e 20 2a 2f 0a  iction (18). */.
22380 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
22390 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  rBy ){.      int
223a0 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
223b0 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65  i=0; ii<p->pOrde
223c0 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  rBy->nExpr; ii++
223d0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
223e0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69  ->pOrderBy->a[ii
223f0 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
22400 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
22410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
22420 20 7d 0a 0a 20 20 2f 2a 20 45 78 2d 72 65 73 74   }..  /* Ex-rest
22430 72 69 63 74 69 6f 6e 20 28 32 33 29 3a 0a 20 20  riction (23):.  
22440 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 20  ** The only way 
22450 74 68 61 74 20 74 68 65 20 72 65 63 75 72 73 69  that the recursi
22460 76 65 20 70 61 72 74 20 6f 66 20 61 20 43 54 45  ve part of a CTE
22470 20 63 61 6e 20 63 6f 6e 74 61 69 6e 20 61 20 63   can contain a c
22480 6f 6d 70 6f 75 6e 64 0a 20 20 2a 2a 20 73 75 62  ompound.  ** sub
22490 71 75 65 72 79 20 69 73 20 66 6f 72 20 74 68 65  query is for the
224a0 20 73 75 62 71 75 65 72 79 20 74 6f 20 62 65 20   subquery to be 
224b0 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61 20 6a 6f  one term of a jo
224c0 69 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65 0a  in.  But if the.
224d0 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73    ** subquery is
224e0 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68   a join, then th
224f0 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 68 61 73  e flattening has
22500 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74   already been st
22510 6f 70 70 65 64 20 62 79 0a 20 20 2a 2a 20 72 65  opped by.  ** re
22520 73 74 72 69 63 74 69 6f 6e 20 28 31 37 64 33 29  striction (17d3)
22530 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
22540 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
22550 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20  F_Recursive)==0 
22560 7c 7c 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d  || pSub->pPrior=
22570 3d 30 20 29 3b 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20  =0 );..  /***** 
22580 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
22590 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69   point, flatteni
225a0 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
225b0 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54   *****/.  SELECT
225c0 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
225d0 2c 28 22 66 6c 61 74 74 65 6e 20 25 73 2e 25 70  ,("flatten %s.%p
225e0 20 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22   from term %d\n"
225f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22600 20 20 20 20 20 70 53 75 62 2d 3e 7a 53 65 6c 4e       pSub->zSelN
22610 61 6d 65 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d  ame, pSub, iFrom
22620 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72  ));..  /* Author
22630 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ize the subquery
22640 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41   */.  pParse->zA
22650 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75  uthContext = pSu
22660 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  bitem->zName;.  
22670 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71  TESTONLY(i =) sq
22680 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
22690 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
226a0 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  LECT, 0, 0, 0);.
226b0 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53    testcase( i==S
226c0 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20  QLITE_DENY );.  
226d0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
226e0 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
226f0 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20  hContext;..  /* 
22700 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
22710 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
22720 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
22730 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69   then (by restri
22740 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61  ctions.  ** 17 a
22750 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20  nd 18 above) it 
22760 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20  must be a UNION 
22770 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65  ALL and the pare
22780 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20  nt query must . 
22790 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f   ** be of the fo
227a0 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
227b0 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c    SELECT <expr-l
227c0 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d  ist> FROM (<sub-
227d0 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63  query>) <where-c
227e0 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a  lause> .  **.  *
227f0 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e  * followed by an
22800 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
22810 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20  T and/or OFFSET 
22820 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c  clauses. This bl
22830 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73  ock.  ** creates
22840 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74   N-1 copies of t
22850 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
22860 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45  without any ORDE
22870 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a  R BY, LIMIT or .
22880 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75    ** OFFSET clau
22890 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68  ses and joins th
228a0 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68  em to the left-h
228b0 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20  and-side of the 
228c0 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73  original.  ** us
228d0 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  ing UNION ALL op
228e0 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73  erators. In this
228f0 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e   case N is the n
22900 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a  umber of simple.
22910 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74    ** select stat
22920 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
22930 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
22940 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
22950 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
22960 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52     SELECT a+1 FR
22970 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20  OM (.  **       
22980 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
22990 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
229a0 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
229b0 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52       SELECT y FR
229c0 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
229d0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
229e0 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
229f0 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61  abs(z*2) FROM ta
22a00 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48  b2.  **     ) WH
22a10 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42  ERE a!=5 ORDER B
22a20 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72  Y 1.  **.  ** Tr
22a30 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a  ansformed into:.
22a40 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
22a50 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61  LECT x+1 FROM ta
22a60 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20  b WHERE x+1!=5. 
22a70 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
22a80 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
22a90 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T y+1 FROM tab W
22aa0 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a  HERE y+1!=5.  **
22ab0 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
22ac0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
22ad0 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74  bs(z*2)+1 FROM t
22ae0 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a  ab2 WHERE abs(z*
22af0 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20  2)+1!=5.  **    
22b00 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
22b10 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68  .  ** We call th
22b20 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64  is the "compound
22b30 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
22b40 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ning"..  */.  fo
22b50 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  r(pSub=pSub->pPr
22b60 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ior; pSub; pSub=
22b70 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
22b80 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b     Select *pNew;
22b90 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
22ba0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
22bb0 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20  derBy;.    Expr 
22bc0 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  *pLimit = p->pLi
22bd0 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  mit;.    Select 
22be0 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72  *pPrior = p->pPr
22bf0 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  ior;.    p->pOrd
22c00 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
22c10 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70  >pSrc = 0;.    p
22c20 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
22c30 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
22c40 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
22c50 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
22c60 20 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   p, 0);.    sqli
22c70 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65  te3SelectSetName
22c80 28 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a 53 65  (pNew, pSub->zSe
22c90 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70  lName);.    p->p
22ca0 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
22cb0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
22cc0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
22cd0 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
22ce0 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41      p->op = TK_A
22cf0 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  LL;.    if( pNew
22d00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
22d10 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
22d20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22d30 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
22d40 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
22d50 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69  f( pPrior ) pPri
22d60 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77  or->pNext = pNew
22d70 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e  ;.      pNew->pN
22d80 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ext = p;.      p
22d90 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b  ->pPrior = pNew;
22da0 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
22db0 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c 28 22  CE(2,pParse,p,("
22dc0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
22dd0 79 20 66 6c 61 74 74 65 6e 65 72 22 0a 20 20 20  y flattener".   
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22df0 20 20 20 20 20 20 20 20 20 20 20 22 20 63 72 65             " cre
22e00 61 74 65 73 20 25 73 2e 25 70 20 61 73 20 70 65  ates %s.%p as pe
22e10 65 72 5c 6e 22 2c 70 4e 65 77 2d 3e 7a 53 65 6c  er\n",pNew->zSel
22e20 4e 61 6d 65 2c 20 70 4e 65 77 29 29 3b 0a 20 20  Name, pNew));.  
22e30 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
22e40 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
22e50 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
22e60 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e  /* Begin flatten
22e70 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68  ing the iFrom-th
22e80 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
22e90 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20  OM clause .  ** 
22ea0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
22eb0 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20  ry..  */.  pSub 
22ec0 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62 69 74  = pSub1 = pSubit
22ed0 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20  em->pSelect;..  
22ee0 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74 72  /* Delete the tr
22ef0 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74  ansient table st
22f00 72 75 63 74 75 72 65 20 61 73 73 6f 63 69 61 74  ructure associat
22f10 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
22f20 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20   subquery.  */. 
22f30 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
22f40 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  b, pSubitem->zDa
22f50 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74  tabase);.  sqlit
22f60 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
22f70 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  bitem->zName);. 
22f80 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
22f90 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  b, pSubitem->zAl
22fa0 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d  ias);.  pSubitem
22fb0 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b  ->zDatabase = 0;
22fc0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  .  pSubitem->zNa
22fd0 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  me = 0;.  pSubit
22fe0 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a  em->zAlias = 0;.
22ff0 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c    pSubitem->pSel
23000 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44  ect = 0;..  /* D
23010 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68  efer deleting th
23020 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61  e Table object a
23030 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
23040 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
23050 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65   until code gene
23060 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  ration is.  ** c
23070 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74  omplete, since t
23080 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65  here may still e
23090 78 69 73 74 20 45 78 70 72 2e 70 54 61 62 20 65  xist Expr.pTab e
230a0 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a  ntries that.  **
230b0 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 73 75   refer to the su
230c0 62 71 75 65 72 79 20 65 76 65 6e 20 61 66 74 65  bquery even afte
230d0 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54  r flattening.  T
230e0 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a  icket #3346..  *
230f0 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d  *.  ** pSubitem-
23100 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79 73 20  >pTab is always 
23110 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74  non-NULL by test
23120 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e   restrictions an
23130 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20  d tests above.. 
23140 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
23150 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21  (pSubitem->pTab!
23160 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  =0) ){.    Table
23170 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53   *pTabToDel = pS
23180 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ubitem->pTab;.  
23190 20 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d    if( pTabToDel-
231a0 3e 6e 54 61 62 52 65 66 3d 3d 31 20 29 7b 0a 20  >nTabRef==1 ){. 
231b0 20 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70       Parse *pTop
231c0 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
231d0 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
231e0 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rse);.      pTab
231f0 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62  ToDel->pNextZomb
23200 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  ie = pToplevel->
23210 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20  pZombieTab;.    
23220 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f    pToplevel->pZo
23230 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f  mbieTab = pTabTo
23240 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Del;.    }else{.
23250 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d        pTabToDel-
23260 3e 6e 54 61 62 52 65 66 2d 2d 3b 0a 20 20 20 20  >nTabRef--;.    
23270 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e  }.    pSubitem->
23280 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  pTab = 0;.  }.. 
23290 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
232a0 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65  g loop runs once
232b0 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   for each term i
232c0 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
232d0 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74  query.  ** flatt
232e0 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69  ening (as descri
232f0 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20  bed above).  If 
23300 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64  we are doing a d
23310 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20  ifferent kind.  
23320 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** of flattening
23330 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20   - a flattening 
23340 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d  other than a com
23350 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
23360 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a  lattening -.  **
23370 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20   then this loop 
23380 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a  only runs once..
23390 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
233a0 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66  oop moves all of
233b0 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e   the FROM elemen
233c0 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ts of the subque
233d0 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ry into the.  **
233e0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
233f0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
23400 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69  ery.  Before doi
23410 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65  ng this, remembe
23420 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  r.  ** the curso
23430 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
23440 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20   original outer 
23450 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65  query FROM eleme
23460 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65  nt in.  ** iPare
23470 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74  nt.  The iParent
23480 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76   cursor will nev
23490 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62  er be used.  Sub
234a0 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a  sequent code.  *
234b0 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72  * will scan expr
234c0 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20  essions looking 
234d0 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65  for iParent refe
234e0 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61  rences and repla
234f0 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65  ce.  ** those re
23500 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78  ferences with ex
23510 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
23520 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75  esolve to the su
23530 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a  bquery FROM.  **
23540 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65   elements we are
23550 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e   now copying in.
23560 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72  .  */.  for(pPar
23570 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20  ent=p; pParent; 
23580 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d  pParent=pParent-
23590 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53  >pPrior, pSub=pS
235a0 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
235b0 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20   int nSubSrc;.  
235c0 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20    u8 jointype = 
235d0 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d  0;.    pSubSrc =
235e0 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20   pSub->pSrc;    
235f0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
23600 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  of subquery */. 
23610 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75     nSubSrc = pSu
23620 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20  bSrc->nSrc;  /* 
23630 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
23640 69 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  in subquery FROM
23650 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70   clause */.    p
23660 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  Src = pParent->p
23670 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
23680 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
23690 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20  uter query */.. 
236a0 20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20     if( pSrc ){. 
236b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
236c0 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46  rent==p );  /* F
236d0 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67  irst time throug
236e0 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
236f0 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70      jointype = p
23700 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e  Subitem->fg.join
23710 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  type;.    }else{
23720 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
23730 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a  Parent!=p );  /*
23740 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
23750 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67  ent times throug
23760 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
23770 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
23780 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  nt->pSrc = sqlit
23790 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
237a0 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  db, 0, 0, 0);.  
237b0 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20      if( pSrc==0 
237c0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
237d0 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
237e0 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62  led );.        b
237f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
23800 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
23810 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20  subquery uses a 
23820 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74  single slot of t
23830 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
23840 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20  f the outer.    
23850 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68  ** query.  If th
23860 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d  e subquery has m
23870 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65  ore than one ele
23880 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d  ment in its FROM
23890 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20   clause,.    ** 
238a0 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20  then expand the 
238b0 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d  outer query to m
238c0 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74  ake space for it
238d0 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65   to hold all ele
238e0 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20  ments.    ** of 
238f0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
23900 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
23910 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
23920 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
23930 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43  ROM tabA, (SELEC
23940 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73  T * FROM sub1, s
23950 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20  ub2), tabB;.    
23960 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75  **.    ** The ou
23970 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20  ter query has 3 
23980 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f  slots in its FRO
23990 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73  M clause.  One s
239a0 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  lot of the.    *
239b0 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74  * outer query (t
239c0 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20  he middle slot) 
239d0 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  is used by the s
239e0 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65  ubquery.  The ne
239f0 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  xt.    ** block 
23a00 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70  of code will exp
23a10 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
23a20 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
23a30 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20  to 4 slots..    
23a40 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65 20 73 6c  ** The middle sl
23a50 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74  ot is expanded t
23a60 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f  o two slots in o
23a70 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61  rder to make spa
23a80 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  ce.    ** for th
23a90 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  e two elements i
23aa0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
23ab0 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
23ac0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
23ad0 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
23ae0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53       pParent->pS
23af0 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69  rc = pSrc = sqli
23b00 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
23b10 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62  e(db, pSrc, nSub
23b20 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a  Src-1,iFrom+1);.
23b30 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
23b40 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
23b50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23b60 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
23b70 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
23b80 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
23b90 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75  s from the subqu
23ba0 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ery into the.   
23bb0 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e   ** outer query.
23bc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
23bd0 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
23be0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
23bf0 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
23c00 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46  db, pSrc->a[i+iF
23c10 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20  rom].pUsing);.  
23c20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
23c30 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e  ->a[i+iFrom].fg.
23c40 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a  isTabFunc==0 );.
23c50 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b        pSrc->a[i+
23c60 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63  iFrom] = pSubSrc
23c70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 4e  ->a[i];.      iN
23c80 65 77 50 61 72 65 6e 74 20 3d 20 70 53 75 62 53  ewParent = pSubS
23c90 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
23ca0 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
23cb0 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30  pSubSrc->a[i], 0
23cc0 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63  , sizeof(pSubSrc
23cd0 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a  ->a[i]));.    }.
23ce0 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f      pSrc->a[iFro
23cf0 6d 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d  m].fg.jointype =
23d00 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20   jointype;.  .  
23d10 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73    /* Now begin s
23d20 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71  ubstituting subq
23d30 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20  uery result set 
23d40 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20  expressions for 
23d50 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
23d60 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
23d70 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
23d80 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  uery..    ** .  
23d90 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
23da0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
23db0 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46  LECT a+5, b*10 F
23dc0 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20  ROM (SELECT x*3 
23dd0 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20  AS a, y+10 AS b 
23de0 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61  FROM t1) WHERE a
23df0 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20  >b;.    **   \  
23e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e10 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
23e20 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
23e30 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
23e40 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f  /.    **    \___
23e50 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23e60 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
23e70 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23e80 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20  _____________/. 
23e90 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20     **.    ** We 
23ea0 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
23eb0 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
23ec0 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
23ed0 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
23ee0 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65  ee.    ** "a" we
23ef0 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33   substitute "x*3
23f00 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  " and every plac
23f10 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20  e we see "b" we 
23f20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30  substitute "y+10
23f30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  "..    */.    if
23f40 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
23f50 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 74 20   ){.      /* At 
23f60 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 6e 79 20  this point, any 
23f70 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64 65 72 42  non-zero iOrderB
23f80 79 43 6f 6c 20 76 61 6c 75 65 73 20 69 6e 64 69  yCol values indi
23f90 63 61 74 65 20 74 68 61 74 20 74 68 65 0a 20 20  cate that the.  
23fa0 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
23fb0 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
23fc0 6e 20 69 73 20 69 64 65 6e 74 69 63 61 6c 20 74  n is identical t
23fd0 6f 20 74 68 65 20 69 4f 72 64 65 72 42 79 43 6f  o the iOrderByCo
23fe0 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a 20 65 78  l'th.      ** ex
23ff0 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65  pression returne
24000 64 20 62 79 20 53 45 4c 45 43 54 20 73 74 61 74  d by SELECT stat
24010 65 6d 65 6e 74 20 70 53 75 62 2e 20 53 69 6e 63  ement pSub. Sinc
24020 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 0a 20  e these values. 
24030 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e       ** do not n
24040 65 63 65 73 73 61 72 69 6c 79 20 63 6f 72 72 65  ecessarily corre
24050 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e 73  spond to columns
24060 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65   in SELECT state
24070 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c 0a 20 20  ment pParent,.  
24080 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 6d      ** zero them
24090 20 62 65 66 6f 72 65 20 74 72 61 6e 73 66 65 72   before transfer
240a0 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
240b0 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 2a   clause..      *
240c0 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 20 64  *.      ** Not d
240d0 6f 69 6e 67 20 74 68 69 73 20 6d 61 79 20 63 61  oing this may ca
240e0 75 73 65 20 61 6e 20 65 72 72 6f 72 20 69 66 20  use an error if 
240f0 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  a subsequent cal
24100 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20  l to this.      
24110 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  ** function atte
24120 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
24130 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71  a compound sub-q
24140 75 65 72 79 20 69 6e 74 6f 20 70 50 61 72 65 6e  uery into pParen
24150 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20  t.      ** (the 
24160 6f 6e 6c 79 20 77 61 79 20 74 68 69 73 20 63 61  only way this ca
24170 6e 20 68 61 70 70 65 6e 20 69 73 20 69 66 20 74  n happen is if t
24180 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d  he compound sub-
24190 71 75 65 72 79 20 69 73 0a 20 20 20 20 20 20 2a  query is.      *
241a0 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 61 72 74  * currently part
241b0 20 6f 66 20 70 53 75 62 2d 3e 70 53 72 63 29 2e   of pSub->pSrc).
241c0 20 53 65 65 20 74 69 63 6b 65 74 20 5b 64 31 31   See ticket [d11
241d0 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f 0a 20 20  a6e908f].  */.  
241e0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f      ExprList *pO
241f0 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70  rderBy = pSub->p
24200 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 66  OrderBy;.      f
24210 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
24220 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
24230 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
24240 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  y->a[i].u.x.iOrd
24250 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  erByCol = 0;.   
24260 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
24270 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  t( pParent->pOrd
24280 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
24290 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
242a0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
242b0 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65       pSub->pOrde
242c0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  rBy = 0;.    }. 
242d0 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69     pWhere = sqli
242e0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
242f0 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b  Sub->pWhere, 0);
24300 0a 20 20 20 20 69 66 28 20 69 73 4c 65 66 74 4a  .    if( isLeftJ
24310 6f 69 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  oin>0 ){.      s
24320 65 74 4a 6f 69 6e 45 78 70 72 28 70 57 68 65 72  etJoinExpr(pWher
24330 65 2c 20 69 4e 65 77 50 61 72 65 6e 74 29 3b 0a  e, iNewParent);.
24340 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 65 6e      }.    pParen
24350 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  t->pWhere = sqli
24360 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
24370 57 68 65 72 65 2c 20 70 50 61 72 65 6e 74 2d 3e  Where, pParent->
24380 70 57 68 65 72 65 29 3b 0a 20 20 20 20 69 66 28  pWhere);.    if(
24390 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
243a0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 75  d==0 ){.      Su
243b0 62 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a 20 20  bstContext x;.  
243c0 20 20 20 20 78 2e 70 50 61 72 73 65 20 3d 20 70      x.pParse = p
243d0 50 61 72 73 65 3b 0a 20 20 20 20 20 20 78 2e 69  Parse;.      x.i
243e0 54 61 62 6c 65 20 3d 20 69 50 61 72 65 6e 74 3b  Table = iParent;
243f0 0a 20 20 20 20 20 20 78 2e 69 4e 65 77 54 61 62  .      x.iNewTab
24400 6c 65 20 3d 20 69 4e 65 77 50 61 72 65 6e 74 3b  le = iNewParent;
24410 0a 20 20 20 20 20 20 78 2e 69 73 4c 65 66 74 4a  .      x.isLeftJ
24420 6f 69 6e 20 3d 20 69 73 4c 65 66 74 4a 6f 69 6e  oin = isLeftJoin
24430 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c 69 73 74  ;.      x.pEList
24440 20 3d 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 3b   = pSub->pEList;
24450 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
24460 63 74 28 26 78 2c 20 70 50 61 72 65 6e 74 2c 20  ct(&x, pParent, 
24470 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  0);.    }.  .   
24480 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65   /* The flattene
24490 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  d query is disti
244a0 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68  nct if either th
244b0 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20  e inner or the. 
244c0 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
244d0 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a  y is distinct. .
244e0 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65      */.    pPare
244f0 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  nt->selFlags |= 
24500 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
24510 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20   SF_Distinct;.  
24520 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
24530 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28  ELECT ... FROM (
24540 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54  SELECT ... LIMIT
24550 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d   a OFFSET b) LIM
24560 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20  IT x OFFSET y;. 
24570 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65     **.    ** One
24580 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74   is tempted to t
24590 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20  ry to add a and 
245a0 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65  b to combine the
245b0 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68   limits.  But th
245c0 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e  is.    ** does n
245d0 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65  ot work if eithe
245e0 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74  r limit is negat
245f0 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ive..    */.    
24600 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
24610 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
24620 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62  t->pLimit = pSub
24630 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
24640 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pSub->pLimit = 0
24650 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
24660 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65  * Finially, dele
24670 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20  te what is left 
24680 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
24690 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  and return.  ** 
246a0 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  success..  */.  
246b0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
246c0 65 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a  ete(db, pSub1);.
246d0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
246e0 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
246f0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
24700 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
24710 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
24720 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
24730 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c  ter flattening:\
24740 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
24750 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
24760 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
24770 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 31  ndif..  return 1
24780 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
24790 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
247a0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
247b0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
247c0 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 0a  OMIT_VIEW) */...
247d0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
247e0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
247f0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
24800 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
24810 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70  )./*.** Make cop
24820 69 65 73 20 6f 66 20 72 65 6c 65 76 61 6e 74 20  ies of relevant 
24830 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
24840 6d 73 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  ms of the outer 
24850 71 75 65 72 79 20 69 6e 74 6f 0a 2a 2a 20 74 68  query into.** th
24860 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
24870 66 20 73 75 62 71 75 65 72 79 2e 20 20 45 78 61  f subquery.  Exa
24880 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  mple:.**.**    S
24890 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
248a0 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64  LECT a AS x, c-d
248b0 20 41 53 20 79 20 46 52 4f 4d 20 74 31 29 20 57   AS y FROM t1) W
248c0 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31  HERE x=5 AND y=1
248d0 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f  0;.**.** Transfo
248e0 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a  rmed into:.**.**
248f0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
24900 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20 78  M (SELECT a AS x
24910 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20  , c-d AS y FROM 
24920 74 31 20 57 48 45 52 45 20 61 3d 35 20 41 4e 44  t1 WHERE a=5 AND
24930 20 63 2d 64 3d 31 30 29 0a 2a 2a 20 20 20 20 20   c-d=10).**     
24940 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d  WHERE x=5 AND y=
24950 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f  10;.**.** The ho
24960 70 65 20 69 73 20 74 68 61 74 20 74 68 65 20 74  pe is that the t
24970 65 72 6d 73 20 61 64 64 65 64 20 74 6f 20 74 68  erms added to th
24980 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 77 69  e inner query wi
24990 6c 6c 20 6d 61 6b 65 20 69 74 20 6d 6f 72 65 0a  ll make it more.
249a0 2a 2a 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  ** efficient..**
249b0 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d  .** Do not attem
249c0 70 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  pt this optimiza
249d0 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  tion if:.**.**  
249e0 20 28 31 29 20 28 2a 2a 20 54 68 69 73 20 72 65   (1) (** This re
249f0 73 74 72 69 63 74 69 6f 6e 20 77 61 73 20 72 65  striction was re
24a00 6d 6f 76 65 64 20 6f 6e 20 32 30 31 37 2d 30 39  moved on 2017-09
24a10 2d 32 39 2e 20 20 57 65 20 75 73 65 64 20 74 6f  -29.  We used to
24a20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64 69  .**           di
24a30 73 61 6c 6c 6f 77 20 74 68 69 73 20 6f 70 74 69  sallow this opti
24a40 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 61 67 67  mization for agg
24a50 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65  regate subquerie
24a60 73 2c 20 62 75 74 20 6e 6f 77 0a 2a 2a 20 20 20  s, but now.**   
24a70 20 20 20 20 20 20 20 20 69 74 20 69 73 20 61 6c          it is al
24a80 6c 6f 77 65 64 20 62 79 20 70 75 74 74 69 6e 67  lowed by putting
24a90 20 74 68 65 20 65 78 74 72 61 20 74 65 72 6d 73   the extra terms
24aa0 20 6f 6e 20 74 68 65 20 48 41 56 49 4e 47 20 63   on the HAVING c
24ab0 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  lause..**       
24ac0 20 20 20 20 54 68 65 20 61 64 64 65 64 20 48 41      The added HA
24ad0 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70  VING clause is p
24ae0 6f 69 6e 74 6c 65 73 73 20 69 66 20 74 68 65 20  ointless if the 
24af0 73 75 62 71 75 65 72 79 20 6c 61 63 6b 73 0a 2a  subquery lacks.*
24b00 2a 20 20 20 20 20 20 20 20 20 20 20 61 20 47 52  *           a GR
24b10 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
24b20 42 75 74 20 73 75 63 68 20 61 20 48 41 56 49 4e  But such a HAVIN
24b30 47 20 63 6c 61 75 73 65 20 69 73 20 61 6c 73 6f  G clause is also
24b40 20 68 61 72 6d 6c 65 73 73 0a 2a 2a 20 20 20 20   harmless.**    
24b50 20 20 20 20 20 20 20 73 6f 20 74 68 65 72 65 20         so there 
24b60 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20  does not appear 
24b70 74 6f 20 62 65 20 61 6e 79 20 72 65 61 73 6f 6e  to be any reason
24b80 20 74 6f 20 61 64 64 20 65 78 74 72 61 20 6c 6f   to add extra lo
24b90 67 69 63 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  gic.**          
24ba0 20 74 6f 20 73 75 70 70 72 65 73 73 20 69 74 2e   to suppress it.
24bb0 20 2a 2a 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29   **).**.**   (2)
24bc0 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
24bd0 20 69 73 20 74 68 65 20 72 65 63 75 72 73 69 76   is the recursiv
24be0 65 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d  e part of a comm
24bf0 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73 73  on table express
24c00 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  ion..**.**   (3)
24c10 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
24c20 20 68 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61   has a LIMIT cla
24c30 75 73 65 20 28 73 69 6e 63 65 20 74 68 65 20 63  use (since the c
24c40 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57 48  hanges to the WH
24c50 45 52 45 0a 2a 2a 20 20 20 20 20 20 20 63 6c 6f  ERE.**       clo
24c60 73 65 20 77 6f 75 6c 64 20 63 68 61 6e 67 65 20  se would change 
24c70 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  the meaning of t
24c80 68 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a  he LIMIT)..**.**
24c90 20 20 20 28 34 29 20 54 68 65 20 69 6e 6e 65 72     (4) The inner
24ca0 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69   query is the ri
24cb0 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
24cc0 20 4c 45 46 54 20 4a 4f 49 4e 20 61 6e 64 20 74   LEFT JOIN and t
24cd0 68 65 0a 2a 2a 20 20 20 20 20 20 20 65 78 70 72  he.**       expr
24ce0 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 70 75 73  ession to be pus
24cf0 68 65 64 20 64 6f 77 6e 20 64 6f 65 73 20 6e 6f  hed down does no
24d00 74 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20  t come from the 
24d10 4f 4e 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20  ON clause.**    
24d20 20 20 20 6f 6e 20 74 68 61 74 20 4c 45 46 54 20     on that LEFT 
24d30 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35  JOIN..**.**   (5
24d40 29 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  ) The WHERE clau
24d50 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  se expression or
24d60 69 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20  iginates in the 
24d70 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
24d80 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61  se.**       of a
24d90 20 4c 45 46 54 20 4a 4f 49 4e 20 77 68 65 72 65   LEFT JOIN where
24da0 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20   iCursor is not 
24db0 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 74  the right-hand t
24dc0 61 62 6c 65 20 6f 66 20 74 68 61 74 0a 2a 2a 20  able of that.** 
24dd0 20 20 20 20 20 20 6c 65 66 74 20 6a 6f 69 6e 2e        left join.
24de0 20 20 41 6e 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a    An example:.**
24df0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 53 45  .**           SE
24e00 4c 45 43 54 20 2a 0a 2a 2a 20 20 20 20 20 20 20  LECT *.**       
24e10 20 20 20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54      FROM (SELECT
24e20 20 31 20 41 53 20 61 31 20 55 4e 49 4f 4e 20 41   1 AS a1 UNION A
24e30 4c 4c 20 53 45 4c 45 43 54 20 32 29 20 41 53 20  LL SELECT 2) AS 
24e40 61 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  aa.**           
24e50 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 31 20 41  JOIN (SELECT 1 A
24e60 53 20 62 32 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  S b2 UNION ALL S
24e70 45 4c 45 43 54 20 32 29 20 41 53 20 62 62 20 4f  ELECT 2) AS bb O
24e80 4e 20 28 61 31 3d 62 32 29 0a 2a 2a 20 20 20 20  N (a1=b2).**    
24e90 20 20 20 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e         LEFT JOIN
24ea0 20 28 53 45 4c 45 43 54 20 38 20 41 53 20 63 33   (SELECT 8 AS c3
24eb0 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
24ec0 54 20 39 29 20 41 53 20 63 63 20 4f 4e 20 28 62  T 9) AS cc ON (b
24ed0 32 3d 32 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20  2=2);.**.**     
24ee0 20 20 54 68 65 20 63 6f 72 72 65 63 74 20 61 6e    The correct an
24ef0 73 77 65 72 20 69 73 20 74 68 72 65 65 20 72 6f  swer is three ro
24f00 77 73 3a 20 20 28 31 2c 31 2c 4e 55 4c 4c 29 2c  ws:  (1,1,NULL),
24f10 28 32 2c 32 2c 38 29 2c 28 32 2c 32 2c 39 29 2e  (2,2,8),(2,2,9).
24f20 0a 2a 2a 20 20 20 20 20 20 20 42 75 74 20 69 66  .**       But if
24f30 20 74 68 65 20 28 62 32 3d 32 29 20 74 65 72 6d   the (b2=2) term
24f40 20 77 65 72 65 20 74 6f 20 62 65 20 70 75 73 68   were to be push
24f50 65 64 20 64 6f 77 6e 20 69 6e 74 6f 20 74 68 65  ed down into the
24f60 20 62 62 20 73 75 62 71 75 65 72 79 2c 0a 2a 2a   bb subquery,.**
24f70 20 20 20 20 20 20 20 74 68 65 6e 20 74 68 65 20         then the 
24f80 28 31 2c 31 2c 4e 55 4c 4c 29 20 72 6f 77 20 77  (1,1,NULL) row w
24f90 6f 75 6c 64 20 62 65 20 73 75 70 70 72 65 73 73  ould be suppress
24fa0 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
24fb0 20 30 20 69 66 20 6e 6f 20 63 68 61 6e 67 65 73   0 if no changes
24fc0 20 61 72 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f   are made and no
24fd0 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72  n-zero if one or
24fe0 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75   more WHERE clau
24ff0 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61 72 65 20  se.** terms are 
25000 64 75 70 6c 69 63 61 74 65 64 20 69 6e 74 6f 20  duplicated into 
25010 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
25020 0a 73 74 61 74 69 63 20 69 6e 74 20 70 75 73 68  .static int push
25030 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 0a  DownWhereTerms(.
25040 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
25050 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
25060 20 63 6f 6e 74 65 78 74 20 28 66 6f 72 20 6d 61   context (for ma
25070 6c 6c 6f 63 28 29 20 61 6e 64 20 65 72 72 6f 72  lloc() and error
25080 20 72 65 70 6f 72 74 69 6e 67 29 20 2a 2f 0a 20   reporting) */. 
25090 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 2c 20   Select *pSubq, 
250a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
250b0 62 71 75 65 72 79 20 77 68 6f 73 65 20 57 48 45  bquery whose WHE
250c0 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20  RE clause is to 
250d0 62 65 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a  be augmented */.
250e0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
250f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
25100 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
25110 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
25120 2f 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 2c  /.  int iCursor,
25130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
25140 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
25150 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
25160 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 20  int isLeftJoin  
25170 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
25180 20 70 53 75 62 71 20 69 73 20 74 68 65 20 72 69   pSubq is the ri
25190 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45  ght term of a LE
251a0 46 54 20 4a 4f 49 4e 20 2a 2f 0a 29 7b 0a 20 20  FT JOIN */.){.  
251b0 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
251c0 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 69  t nChng = 0;.  i
251d0 66 28 20 70 57 68 65 72 65 3d 3d 30 20 29 20 72  f( pWhere==0 ) r
251e0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
251f0 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Subq->selFlags &
25200 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 20   SF_Recursive ) 
25210 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 72 65  return 0;  /* re
25220 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 2a 2f  striction (2) */
25230 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
25240 44 45 42 55 47 0a 20 20 2f 2a 20 4f 6e 6c 79 20  DEBUG.  /* Only 
25250 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f  the first term o
25260 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 63 61 6e  f a compound can
25270 20 68 61 76 65 20 61 20 57 49 54 48 20 63 6c 61   have a WITH cla
25280 75 73 65 2e 20 20 42 75 74 20 6d 61 6b 65 0a 20  use.  But make. 
25290 20 2a 2a 20 73 75 72 65 20 6e 6f 20 6f 74 68 65   ** sure no othe
252a0 72 20 74 65 72 6d 73 20 61 72 65 20 6d 61 72 6b  r terms are mark
252b0 65 64 20 53 46 5f 52 65 63 75 72 73 69 76 65 20  ed SF_Recursive 
252c0 69 6e 20 63 61 73 65 20 73 6f 6d 65 74 68 69 6e  in case somethin
252d0 67 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 69  g changes.  ** i
252e0 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a 20 20  n the future..  
252f0 2a 2f 0a 20 20 7b 0a 20 20 20 20 53 65 6c 65 63  */.  {.    Selec
25300 74 20 2a 70 58 3b 20 20 0a 20 20 20 20 66 6f 72  t *pX;  .    for
25310 28 70 58 3d 70 53 75 62 71 3b 20 70 58 3b 20 70  (pX=pSubq; pX; p
25320 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  X=pX->pPrior){. 
25330 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58       assert( (pX
25340 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
25350 5f 52 65 63 75 72 73 69 76 65 29 29 3d 3d 30 20  _Recursive))==0 
25360 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
25370 64 69 66 0a 0a 20 20 69 66 28 20 70 53 75 62 71  dif..  if( pSubq
25380 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20  ->pLimit!=0 ){. 
25390 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
253a0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20  restriction (3) 
253b0 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  */.  }.  while( 
253c0 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41  pWhere->op==TK_A
253d0 4e 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20  ND ){.    nChng 
253e0 2b 3d 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65  += pushDownWhere
253f0 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53  Terms(pParse, pS
25400 75 62 71 2c 20 70 57 68 65 72 65 2d 3e 70 52 69  ubq, pWhere->pRi
25410 67 68 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ght,.           
25420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25430 20 20 20 20 20 69 43 75 72 73 6f 72 2c 20 69 73       iCursor, is
25440 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 70  LeftJoin);.    p
25450 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e  Where = pWhere->
25460 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pLeft;.  }.  if(
25470 20 69 73 4c 65 66 74 4a 6f 69 6e 0a 20 20 20 26   isLeftJoin.   &
25480 26 20 28 45 78 70 72 48 61 73 50 72 6f 70 65 72  & (ExprHasProper
25490 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f  ty(pWhere,EP_Fro
254a0 6d 4a 6f 69 6e 29 3d 3d 30 0a 20 20 20 20 20 20  mJoin)==0.      
254b0 20 20 20 7c 7c 20 70 57 68 65 72 65 2d 3e 69 52     || pWhere->iR
254c0 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 69  ightJoinTable!=i
254d0 43 75 72 73 6f 72 29 0a 20 20 29 7b 0a 20 20 20  Cursor).  ){.   
254e0 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
254f0 73 74 72 69 63 74 69 6f 6e 20 28 34 29 20 2a 2f  striction (4) */
25500 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48  .  }.  if( ExprH
25510 61 73 50 72 6f 70 65 72 74 79 28 70 57 68 65 72  asProperty(pWher
25520 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 26  e,EP_FromJoin) &
25530 26 20 70 57 68 65 72 65 2d 3e 69 52 69 67 68 74  & pWhere->iRight
25540 4a 6f 69 6e 54 61 62 6c 65 21 3d 69 43 75 72 73  JoinTable!=iCurs
25550 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
25560 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69   0; /* restricti
25570 6f 6e 20 28 35 29 20 2a 2f 0a 20 20 7d 0a 20 20  on (5) */.  }.  
25580 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
25590 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70  sTableConstant(p
255a0 57 68 65 72 65 2c 20 69 43 75 72 73 6f 72 29 20  Where, iCursor) 
255b0 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a  ){.    nChng++;.
255c0 20 20 20 20 77 68 69 6c 65 28 20 70 53 75 62 71      while( pSubq
255d0 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43   ){.      SubstC
255e0 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20  ontext x;.      
255f0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
25600 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
25610 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  , pWhere, 0);.  
25620 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70      unsetJoinExp
25630 72 28 70 4e 65 77 2c 20 2d 31 29 3b 0a 20 20 20  r(pNew, -1);.   
25640 20 20 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50     x.pParse = pP
25650 61 72 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54  arse;.      x.iT
25660 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a  able = iCursor;.
25670 20 20 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c        x.iNewTabl
25680 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20  e = iCursor;.   
25690 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20     x.isLeftJoin 
256a0 3d 20 30 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c  = 0;.      x.pEL
256b0 69 73 74 20 3d 20 70 53 75 62 71 2d 3e 70 45 4c  ist = pSubq->pEL
256c0 69 73 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  ist;.      pNew 
256d0 3d 20 73 75 62 73 74 45 78 70 72 28 26 78 2c 20  = substExpr(&x, 
256e0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28  pNew);.      if(
256f0 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73   pSubq->selFlags
25700 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20   & SF_Aggregate 
25710 29 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 71  ){.        pSubq
25720 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
25730 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
25740 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 48  e->db, pSubq->pH
25750 61 76 69 6e 67 2c 20 70 4e 65 77 29 3b 0a 20 20  aving, pNew);.  
25760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25770 20 20 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65     pSubq->pWhere
25780 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
25790 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  d(pParse->db, pS
257a0 75 62 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65  ubq->pWhere, pNe
257b0 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
257c0 20 20 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d    pSubq = pSubq-
257d0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20  >pPrior;.    }. 
257e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e   }.  return nChn
257f0 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  g;.}.#endif /* !
25800 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
25810 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
25820 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
25830 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
25840 2f 2a 0a 2a 2a 20 54 68 65 20 70 46 75 6e 63 20  /*.** The pFunc 
25850 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 67 67 72  is the only aggr
25860 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69  egate function i
25870 6e 20 74 68 65 20 71 75 65 72 79 2e 20 20 43 68  n the query.  Ch
25880 65 63 6b 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66  eck to see.** if
25890 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20   the query is a 
258a0 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68  candidate for th
258b0 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69  e min/max optimi
258c0 7a 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  zation. .**.** I
258d0 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61  f the query is a
258e0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74   candidate for t
258f0 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d  he min/max optim
25900 69 7a 61 74 69 6f 6e 2c 20 74 68 65 6e 20 73 65  ization, then se
25910 74 0a 2a 2a 20 2a 70 70 4d 69 6e 4d 61 78 20 74  t.** *ppMinMax t
25920 6f 20 62 65 20 61 6e 20 4f 52 44 45 52 20 42 59  o be an ORDER BY
25930 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 75 73   clause to be us
25940 65 64 20 66 6f 72 20 74 68 65 20 6f 70 74 69 6d  ed for the optim
25950 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72  ization.** and r
25960 65 74 75 72 6e 20 65 69 74 68 65 72 20 57 48 45  eturn either WHE
25970 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f  RE_ORDERBY_MIN o
25980 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  r WHERE_ORDERBY_
25990 4d 41 58 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  MAX depending on
259a0 0a 2a 2a 20 77 68 65 74 68 65 72 20 70 46 75 6e  .** whether pFun
259b0 63 20 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20  c is a min() or 
259c0 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  max() function..
259d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65  **.** If the que
259e0 72 79 20 69 73 20 6e 6f 74 20 61 20 63 61 6e 64  ry is not a cand
259f0 69 64 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69  idate for the mi
25a00 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69  n/max optimizati
25a10 6f 6e 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 57 48  on, return.** WH
25a20 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
25a30 41 4c 20 28 77 68 69 63 68 20 6d 75 73 74 20 62  AL (which must b
25a40 65 20 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 54  e zero)..**.** T
25a50 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
25a60 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
25a70 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
25a80 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 0a 2a  ions have been.*
25a90 2a 20 6c 6f 63 61 74 65 64 20 62 75 74 20 62 65  * located but be
25aa0 66 6f 72 65 20 74 68 65 69 72 20 61 72 67 75 6d  fore their argum
25ab0 65 6e 74 73 20 68 61 76 65 20 62 65 65 6e 20 73  ents have been s
25ac0 75 62 6a 65 63 74 65 64 20 74 6f 20 61 67 67 72  ubjected to aggr
25ad0 65 67 61 74 65 0a 2a 2a 20 61 6e 61 6c 79 73 69  egate.** analysi
25ae0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  s..*/.static u8 
25af0 6d 69 6e 4d 61 78 51 75 65 72 79 28 73 71 6c 69  minMaxQuery(sqli
25b00 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
25b10 46 75 6e 63 2c 20 45 78 70 72 4c 69 73 74 20 2a  Func, ExprList *
25b20 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e  *ppMinMax){.  in
25b30 74 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f  t eRet = WHERE_O
25b40 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20  RDERBY_NORMAL;  
25b50 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
25b60 6c 75 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  lue */.  ExprLis
25b70 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 46 75 6e  t *pEList = pFun
25b80 63 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f  c->x.pList;    /
25b90 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61  * Arguments to a
25ba0 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  gg function */. 
25bb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
25bc0 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
25bd0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
25be0 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  f aggregate func
25bf0 74 69 6f 6e 20 70 46 75 6e 63 20 2a 2f 0a 20 20  tion pFunc */.  
25c00 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
25c10 42 79 3b 0a 20 20 75 38 20 73 6f 72 74 4f 72 64  By;.  u8 sortOrd
25c20 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a  er;..  assert( *
25c30 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 29 3b 0a 20  ppMinMax==0 );. 
25c40 20 61 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e   assert( pFunc->
25c50 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
25c60 49 4f 4e 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  ION );.  if( pEL
25c70 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74  ist==0 || pEList
25c80 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
25c90 75 72 6e 20 65 52 65 74 3b 0a 20 20 7a 46 75 6e  urn eRet;.  zFun
25ca0 63 20 3d 20 70 46 75 6e 63 2d 3e 75 2e 7a 54 6f  c = pFunc->u.zTo
25cb0 6b 65 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ken;.  if( sqlit
25cc0 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c  e3StrICmp(zFunc,
25cd0 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20   "min")==0 ){.  
25ce0 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f    eRet = WHERE_O
25cf0 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20  RDERBY_MIN;.    
25d00 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49  sortOrder = SQLI
25d10 54 45 5f 53 4f 5f 41 53 43 3b 0a 20 20 7d 65 6c  TE_SO_ASC;.  }el
25d20 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
25d30 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61  rICmp(zFunc, "ma
25d40 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52  x")==0 ){.    eR
25d50 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
25d60 42 59 5f 4d 41 58 3b 0a 20 20 20 20 73 6f 72 74  BY_MAX;.    sort
25d70 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53  Order = SQLITE_S
25d80 4f 5f 44 45 53 43 3b 0a 20 20 7d 65 6c 73 65 7b  O_DESC;.  }else{
25d90 0a 20 20 20 20 72 65 74 75 72 6e 20 65 52 65 74  .    return eRet
25da0 3b 0a 20 20 7d 0a 20 20 2a 70 70 4d 69 6e 4d 61  ;.  }.  *ppMinMa
25db0 78 20 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73  x = pOrderBy = s
25dc0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
25dd0 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29  p(db, pEList, 0)
25de0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
25df0 65 72 42 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  erBy!=0 || db->m
25e00 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
25e10 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
25e20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73  pOrderBy->a[0].s
25e30 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f 72 74 4f  ortOrder = sortO
25e40 72 64 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 65  rder;.  return e
25e50 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Ret;.}../*.** Th
25e60 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
25e70 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  nt passed as the
25e80 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
25e90 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
25ea0 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65  query..** The se
25eb0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
25ec0 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
25ed0 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f  aggregate-info o
25ee0 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20  bject. This .** 
25ef0 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69  function tests i
25f00 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  f the SELECT is 
25f10 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
25f20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
25f30 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
25f40 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c  **.** where tabl
25f50 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  e is a database 
25f60 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62  table, not a sub
25f70 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
25f80 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a   If the query.**
25f90 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73   does match this
25fa0 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61   pattern, then a
25fb0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
25fc0 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70  Table object rep
25fd0 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62  resenting.** <tb
25fe0 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  l> is returned. 
25ff0 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20  Otherwise, 0 is 
26000 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
26010 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d  tic Table *isSim
26020 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20  pleCount(Select 
26030 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  *p, AggInfo *pAg
26040 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20  gInfo){.  Table 
26050 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70  *pTab;.  Expr *p
26060 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Expr;..  assert(
26070 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b   !p->pGroupBy );
26080 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  ..  if( p->pWher
26090 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  e || p->pEList->
260a0 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20  nExpr!=1 .   || 
260b0 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  p->pSrc->nSrc!=1
260c0 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30   || p->pSrc->a[0
260d0 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20  ].pSelect.  ){. 
260e0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
260f0 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  .  pTab = p->pSr
26100 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
26110 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
26120 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
26130 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
26140 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20   !pTab->pSelect 
26150 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69  && pExpr );..  i
26160 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
26170 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  b) ) return 0;. 
26180 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
26190 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
261a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
261b0 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f  ( NEVER(pAggInfo
261c0 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65  ->nFunc==0) ) re
261d0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
261e0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
261f0 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ].pFunc->funcFla
26200 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  gs&SQLITE_FUNC_C
26210 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72  OUNT)==0 ) retur
26220 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
26230 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69  ->flags&EP_Disti
26240 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nct ) return 0;.
26250 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
26260 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
26270 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d  source-list item
26280 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
26290 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65  gument was augme
262a0 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20  nted with an.** 
262b0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
262c0 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c  e, then try to l
262d0 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66  ocate the specif
262e0 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ied index. If th
262f0 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20  ere.** was such 
26300 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  a clause and the
26310 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e   named index can
26320 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  not be found, re
26330 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
26340 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20  ERROR and leave 
26350 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
26360 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70  se. Otherwise, p
26370 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f  opulate .** pFro
26380 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65  m->pIndex and re
26390 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
263a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
263b0 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61  dexedByLookup(Pa
263c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
263d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
263e0 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
263f0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70  pFrom->pTab && p
26400 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  From->fg.isIndex
26410 65 64 42 79 20 29 7b 0a 20 20 20 20 54 61 62 6c  edBy ){.    Tabl
26420 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
26430 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20  >pTab;.    char 
26440 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 70 46  *zIndexedBy = pF
26450 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  rom->u1.zIndexed
26460 42 79 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  By;.    Index *p
26470 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
26480 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
26490 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26  .        pIdx &&
264a0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
264b0 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e  pIdx->zName, zIn
264c0 64 65 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20  dexedBy); .     
264d0 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e     pIdx=pIdx->pN
264e0 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ext.    );.    i
264f0 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20  f( !pIdx ){.    
26500 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
26510 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
26520 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a  ch index: %s", z
26530 49 6e 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20  IndexedBy, 0);. 
26540 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65       pParse->che
26550 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
26560 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26570 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
26580 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64     pFrom->pIBInd
26590 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20  ex = pIdx;.  }. 
265a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
265b0 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63  K;.}./*.** Detec
265c0 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  t compound SELEC
265d0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  T statements tha
265e0 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42  t use an ORDER B
265f0 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a  Y clause with .*
26600 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  * an alternative
26610 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
26620 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  nce..**.**    SE
26630 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
26640 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e   EXCEPT SELECT .
26650 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52  .. FROM t2 ORDER
26660 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e   BY .. COLLATE .
26670 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ...**.** These a
26680 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20  re rewritten as 
26690 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a  a subquery:.**.*
266a0 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
266b0 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46  OM (SELECT ... F
266c0 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45  ROM t1 EXCEPT SE
266d0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32  LECT ... FROM t2
266e0 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42  ).**     ORDER B
266f0 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e  Y ... COLLATE ..
26700 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  ..**.** This tra
26710 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e  nsformation is n
26720 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
26730 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74   the multiSelect
26740 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e  OrderBy() routin
26750 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20  e.** above that 
26760 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
26770 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  de for a compoun
26780 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e  d SELECT with an
26790 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
267a0 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65  .** uses a merge
267b0 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20   algorithm that 
267c0 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61 6d  requires the sam
267d0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
267e0 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72  ence on the.** r
267f0 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73  esult columns as
26800 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   on the ORDER BY
26810 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69   clause.  See ti
26820 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77  cket.** http://w
26830 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ww.sqlite.org/sr
26840 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32  c/info/6709574d2
26850 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  a.**.** This tra
26860 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f  nsformation is o
26870 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45  nly needed for E
26880 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54  XCEPT, INTERSECT
26890 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20  , and UNION..** 
268a0 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
268b0 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e  erator works fin
268c0 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65  e with multiSele
268d0 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e  ctOrderBy() even
268e0 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61   when.** there a
268f0 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73  re COLLATE terms
26900 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
26910 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26920 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
26930 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28  electToSubquery(
26940 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
26950 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
26960 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a  nt i;.  Select *
26970 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a  pNew;.  Select *
26980 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pX;.  sqlite3 *d
26990 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  b;.  struct Expr
269a0 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
269b0 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63  SrcList *pNewSrc
269c0 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
269d0 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79  e;.  Token dummy
269e0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  ;..  if( p->pPri
269f0 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  or==0 ) return W
26a00 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69  RC_Continue;.  i
26a10 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  f( p->pOrderBy==
26a20 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
26a30 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70  ontinue;.  for(p
26a40 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e  X=p; pX && (pX->
26a50 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58  op==TK_ALL || pX
26a60 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29  ->op==TK_SELECT)
26a70 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29  ; pX=pX->pPrior)
26a80 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29  {}.  if( pX==0 )
26a90 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
26aa0 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70  inue;.  a = p->p
26ab0 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f  OrderBy->a;.  fo
26ac0 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d  r(i=p->pOrderBy-
26ad0 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20  >nExpr-1; i>=0; 
26ae0 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b  i--){.    if( a[
26af0 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  i].pExpr->flags 
26b00 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62  & EP_Collate ) b
26b10 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
26b20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  i<0 ) return WRC
26b30 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a  _Continue;..  /*
26b40 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
26b50 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65  s point, that me
26b60 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72  ans the transfor
26b70 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  mation is requir
26b80 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ed. */..  pParse
26b90 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
26ba0 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
26bb0 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20  e->db;.  pNew = 
26bc0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
26bd0 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
26be0 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
26bf0 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
26c00 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d  WRC_Abort;.  mem
26c10 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73  set(&dummy, 0, s
26c20 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20  izeof(dummy));. 
26c30 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74   pNewSrc = sqlit
26c40 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
26c50 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30  romTerm(pParse,0
26c60 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77  ,0,0,&dummy,pNew
26c70 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65  ,0,0);.  if( pNe
26c80 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  wSrc==0 ) return
26c90 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70   WRC_Abort;.  *p
26ca0 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70  New = *p;.  p->p
26cb0 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20  Src = pNewSrc;. 
26cc0 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c   p->pEList = sql
26cd0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
26ce0 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71  nd(pParse, 0, sq
26cf0 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
26d00 5f 41 53 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a  _ASTERISK, 0));.
26d10 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c    p->op = TK_SEL
26d20 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65  ECT;.  p->pWhere
26d30 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47   = 0;.  pNew->pG
26d40 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e  roupBy = 0;.  pN
26d50 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b  ew->pHaving = 0;
26d60 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
26d70 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69  y = 0;.  p->pPri
26d80 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65  or = 0;.  p->pNe
26d90 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69  xt = 0;.  p->pWi
26da0 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c  th = 0;.  p->sel
26db0 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d  Flags &= ~SF_Com
26dc0 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28  pound;.  assert(
26dd0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
26de0 53 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30  SF_Converted)==0
26df0 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   );.  p->selFlag
26e00 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65  s |= SF_Converte
26e10 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  d;.  assert( pNe
26e20 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a  w->pPrior!=0 );.
26e30 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e    pNew->pPrior->
26e40 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
26e50 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pNew->pLimit = 0
26e60 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
26e70 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
26e80 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
26e90 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
26ea0 65 20 74 65 72 6d 20 70 46 72 6f 6d 20 68 61 73  e term pFrom has
26eb0 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75   table-valued fu
26ec0 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65  nction.** argume
26ed0 6e 74 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73  nts.  If it does
26ee0 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
26ef0 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
26f00 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  se and return.**
26f10 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65   non-zero, since
26f20 20 70 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c   pFrom is not al
26f30 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 20 74 61  lowed to be a ta
26f40 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74  ble-valued funct
26f50 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
26f60 6e 74 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74  nt cannotBeFunct
26f70 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
26f80 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  e, struct SrcLis
26f90 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a  t_item *pFrom){.
26fa0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e    if( pFrom->fg.
26fb0 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20  isTabFunc ){.   
26fc0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
26fd0 28 70 50 61 72 73 65 2c 20 22 27 25 73 27 20 69  (pParse, "'%s' i
26fe0 73 20 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e  s not a function
26ff0 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29  ", pFrom->zName)
27000 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
27010 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
27020 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
27030 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
27040 20 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20   Argument pWith 
27050 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55  (which may be NU
27060 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  LL) points to a 
27070 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e  linked list of n
27080 65 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63  ested .** WITH c
27090 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e  ontexts, from in
270a0 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74  ner to outermost
270b0 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69  . If the table i
270c0 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a  dentified by .**
270d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
270e0 6d 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65  ment pItem is re
270f0 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61  ally a common-ta
27100 62 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28  ble-expression (
27110 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65  CTE) .** then re
27120 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
27130 6f 20 74 68 65 20 43 54 45 20 64 65 66 69 6e 69  o the CTE defini
27140 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61  tion for that ta
27150 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a  ble. Otherwise.*
27160 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  * return NULL..*
27170 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55  *.** If a non-NU
27180 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  LL value is retu
27190 72 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e  rned, set *ppCon
271a0 74 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f  text to point to
271b0 20 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a   the With.** obj
271c0 65 63 74 20 74 68 61 74 20 74 68 65 20 72 65 74  ect that the ret
271d0 75 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67  urned CTE belong
271e0 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  s to..*/.static 
271f0 73 74 72 75 63 74 20 43 74 65 20 2a 73 65 61 72  struct Cte *sear
27200 63 68 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a  chWith(.  With *
27210 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20 20  pWith,          
27220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
27230 72 65 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57  rent innermost W
27240 49 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ITH clause */.  
27250 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
27260 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20  tem *pItem,     
27270 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  /* FROM clause e
27280 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76  lement to resolv
27290 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70  e */.  With **pp
272a0 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20  Context         
272b0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57         /* OUT: W
272c0 49 54 48 20 63 6c 61 75 73 65 20 72 65 74 75 72  ITH clause retur
272d0 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20  n value belongs 
272e0 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  to */.){.  const
272f0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
27300 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  if( pItem->zData
27310 62 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d  base==0 && (zNam
27320 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  e = pItem->zName
27330 29 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68  )!=0 ){.    With
27340 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *p;.    for(p=p
27350 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f  With; p; p=p->pO
27360 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74  uter){.      int
27370 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
27380 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b  0; i<p->nCte; i+
27390 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
273a0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
273b0 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e  Name, p->a[i].zN
273c0 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
273d0 20 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20       *ppContext 
273e0 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = p;.          r
273f0 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a  eturn &p->a[i];.
27400 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27410 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
27420 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68  turn 0;.}../* Th
27430 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
27440 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61   maintains a sta
27450 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49 54  ck of active WIT
27460 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74  H clauses.** wit
27470 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74  h the inner-most
27480 20 57 49 54 48 20 63 6c 61 75 73 65 20 62 65 69   WITH clause bei
27490 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66  ng at the top of
274a0 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
274b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70  * This routine p
274c0 75 73 68 65 73 20 74 68 65 20 57 49 54 48 20 63  ushes the WITH c
274d0 6c 61 75 73 65 20 70 61 73 73 65 64 20 61 73 20  lause passed as 
274e0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
274f0 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20  ent.** onto the 
27500 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
27510 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46  . If argument bF
27520 72 65 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ree is true, the
27530 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63  n this.** WITH c
27540 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72  lause will never
27550 20 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20   be popped from 
27560 74 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68  the stack. In th
27570 69 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68  is case it.** sh
27580 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c  ould be freed al
27590 6f 6e 67 20 77 69 74 68 20 74 68 65 20 50 61 72  ong with the Par
275a0 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74  se object. In ot
275b0 68 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a  her cases, when.
275c0 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65  ** bFree==0, the
275d0 20 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c   With object wil
275e0 6c 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67  l be freed along
275f0 20 77 69 74 68 20 74 68 65 20 53 45 4c 45 43 54   with the SELECT
27600 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77   .** statement w
27610 69 74 68 20 77 68 69 63 68 20 69 74 20 69 73 20  ith which it is 
27620 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76  associated..*/.v
27630 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 50  oid sqlite3WithP
27640 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73  ush(Parse *pPars
27650 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  e, With *pWith, 
27660 75 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73  u8 bFree){.  ass
27670 65 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c  ert( bFree==0 ||
27680 20 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d   (pParse->pWith=
27690 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 70 57  =0 && pParse->pW
276a0 69 74 68 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b  ithToFree==0) );
276b0 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a  .  if( pWith ){.
276c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
276d0 73 65 2d 3e 70 57 69 74 68 21 3d 70 57 69 74 68  se->pWith!=pWith
276e0 20 29 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70   );.    pWith->p
276f0 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  Outer = pParse->
27700 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73  pWith;.    pPars
27710 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
27720 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 20  ;.    if( bFree 
27730 29 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54  ) pParse->pWithT
27740 6f 46 72 65 65 20 3d 20 70 57 69 74 68 3b 0a 20  oFree = pWith;. 
27750 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
27760 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
27770 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72   if argument pFr
27780 6f 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20 43  om refers to a C
27790 54 45 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a  TE declared by .
277a0 2a 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73 65  ** a WITH clause
277b0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75   on the stack cu
277c0 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e  rrently maintain
277d0 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
277e0 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72  . And,.** if cur
277f0 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e  rently processin
27800 67 20 61 20 43 54 45 20 65 78 70 72 65 73 73 69  g a CTE expressi
27810 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20 72  on, if it is a r
27820 65 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65  ecursive.** refe
27830 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72  rence to the cur
27840 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20  rent CTE..**.** 
27850 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69  If pFrom falls i
27860 6e 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68  nto either of th
27870 65 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73  e two categories
27880 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70   above, pFrom->p
27890 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  Tab.** and other
278a0 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75   fields are popu
278b0 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  lated accordingl
278c0 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  y. The caller sh
278d0 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70  ould check.** (p
278e0 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74  From->pTab!=0) t
278f0 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
27900 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63  her or not a suc
27910 63 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a  cessful match.**
27920 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   was found..**.*
27930 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
27940 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e   a match is foun
27950 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  d, SQLITE_OK is 
27960 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
27970 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  rror.** occurs. 
27980 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  If an error does
27990 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72   occur, an error
279a0 20 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72   message is stor
279b0 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72  ed in the.** par
279c0 73 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72  ser and some err
279d0 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68  or code other th
279e0 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  an SQLITE_OK ret
279f0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
27a00 20 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28   int withExpand(
27a10 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  .  Walker *pWalk
27a20 65 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72  er, .  struct Sr
27a30 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
27a40 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  m.){.  Parse *pP
27a50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
27a60 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
27a70 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
27a80 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65  db;.  struct Cte
27a90 20 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20 20   *pCte;         
27aa0 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64        /* Matched
27ab0 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66   CTE (or NULL if
27ac0 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20   no match) */.  
27ad0 57 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20  With *pWith;    
27ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27af0 2f 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 74  /* WITH clause t
27b00 68 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73  hat pCte belongs
27b10 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74   to */..  assert
27b20 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
27b30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65   );..  pCte = se
27b40 61 72 63 68 57 69 74 68 28 70 50 61 72 73 65 2d  archWith(pParse-
27b50 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26  >pWith, pFrom, &
27b60 70 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43  pWith);.  if( pC
27b70 74 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  te ){.    Table 
27b80 2a 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c  *pTab;.    ExprL
27b90 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
27ba0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20   Select *pSel;. 
27bb0 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74     Select *pLeft
27bc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27bd0 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45   /* Left-most SE
27be0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
27bf0 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65  /.    int bMayRe
27c00 63 75 72 73 69 76 65 3b 20 20 20 20 20 20 20 20  cursive;        
27c10 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63      /* True if c
27c20 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62  ompound joined b
27c30 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f  y UNION [ALL] */
27c40 0a 20 20 20 20 57 69 74 68 20 2a 70 53 61 76 65  .    With *pSave
27c50 64 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20  dWith;          
27c60 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61     /* Initial va
27c70 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70  lue of pParse->p
27c80 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  With */..    /* 
27c90 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72  If pCte->zCteErr
27ca0 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20   is non-NULL at 
27cb0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
27cc0 20 74 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65   this is an ille
27cd0 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72  gal.    ** recur
27ce0 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 74  sive reference t
27cf0 6f 20 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76  o CTE pCte. Leav
27d00 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
27d10 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a  arse and return.
27d20 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66      ** early. If
27d30 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69   pCte->zCteErr i
27d40 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  s NULL, then thi
27d50 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72  s is not a recur
27d60 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  sive reference..
27d70 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
27d80 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a  ase, proceed.  *
27d90 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e  /.    if( pCte->
27da0 7a 43 74 65 45 72 72 20 29 7b 0a 20 20 20 20 20  zCteErr ){.     
27db0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
27dc0 28 70 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a  (pParse, pCte->z
27dd0 43 74 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e  CteErr, pCte->zN
27de0 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
27df0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
27e00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
27e10 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28  annotBeFunction(
27e20 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29  pParse, pFrom) )
27e30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
27e40 52 52 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65 72  RROR;..    asser
27e50 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
27e60 30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  0 );.    pFrom->
27e70 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
27e80 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
27e90 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
27ea0 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54  le));.    if( pT
27eb0 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
27ec0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54  RC_Abort;.    pT
27ed0 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b  ab->nTabRef = 1;
27ee0 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  .    pTab->zName
27ef0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
27f00 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61  up(db, pCte->zNa
27f10 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69  me);.    pTab->i
27f20 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70  PKey = -1;.    p
27f30 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
27f40 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32  = 200; assert( 2
27f50 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  00==sqlite3LogEs
27f60 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20  t(1048576) );.  
27f70 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
27f80 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c   |= TF_Ephemeral
27f90 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52   | TF_NoVisibleR
27fa0 6f 77 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d 2d  owid;.    pFrom-
27fb0 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
27fc0 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
27fd0 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pCte->pSelect, 0
27fe0 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
27ff0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
28000 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
28010 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65  M_BKPT;.    asse
28020 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  rt( pFrom->pSele
28030 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  ct );..    /* Ch
28040 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 61  eck if this is a
28050 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 20   recursive CTE. 
28060 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46  */.    pSel = pF
28070 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
28080 20 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20    bMayRecursive 
28090 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b  = ( pSel->op==TK
280a0 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70  _ALL || pSel->op
280b0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
280c0 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73    if( bMayRecurs
280d0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ive ){.      int
280e0 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73   i;.      SrcLis
280f0 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d  t *pSrc = pFrom-
28100 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a  >pSelect->pSrc;.
28110 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
28120 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
28130 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
28140 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
28150 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  pItem = &pSrc->a
28160 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
28170 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
28180 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26  e==0 .         &
28190 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d  & pItem->zName!=
281a0 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 30  0 .         && 0
281b0 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
281c0 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70  (pItem->zName, p
281d0 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20  Cte->zName).    
281e0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
281f0 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d     pItem->pTab =
28200 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20   pTab;.         
28210 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63   pItem->fg.isRec
28220 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20  ursive = 1;.    
28230 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62        pTab->nTab
28240 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
28250 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
28260 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b  |= SF_Recursive;
28270 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28280 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
28290 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73   Only one recurs
282a0 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 73  ive reference is
282b0 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a   permitted. */ .
282c0 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 54      if( pTab->nT
282d0 61 62 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20  abRef>2 ){.     
282e0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
282f0 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  (.          pPar
28300 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65  se, "multiple re
28310 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75  ferences to recu
28320 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22  rsive table: %s"
28330 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20  , pCte->zName.  
28340 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74      );.      ret
28350 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
28360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
28370 72 74 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65  rt( pTab->nTabRe
28380 66 3d 3d 31 20 7c 7c 20 0a 20 20 20 20 20 20 20  f==1 || .       
28390 20 20 20 20 20 28 28 70 53 65 6c 2d 3e 73 65 6c       ((pSel->sel
283a0 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72 73 69  Flags&SF_Recursi
283b0 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e 54 61  ve) && pTab->nTa
283c0 62 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20  bRef==2 ));..   
283d0 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d   pCte->zCteErr =
283e0 20 22 63 69 72 63 75 6c 61 72 20 72 65 66 65 72   "circular refer
283f0 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20 20 70  ence: %s";.    p
28400 53 61 76 65 64 57 69 74 68 20 3d 20 70 50 61 72  SavedWith = pPar
28410 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70  se->pWith;.    p
28420 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
28430 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62 4d  With;.    if( bM
28440 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  ayRecursive ){. 
28450 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72       Select *pPr
28460 69 6f 72 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  ior = pSel->pPri
28470 6f 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  or;.      assert
28480 28 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 3d  ( pPrior->pWith=
28490 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69  =0 );.      pPri
284a0 6f 72 2d 3e 70 57 69 74 68 20 3d 20 70 53 65 6c  or->pWith = pSel
284b0 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 20 20 73  ->pWith;.      s
284c0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
284d0 28 70 57 61 6c 6b 65 72 2c 20 70 50 72 69 6f 72  (pWalker, pPrior
284e0 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  );.      pPrior-
284f0 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 20 20  >pWith = 0;.    
28500 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
28510 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
28520 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
28530 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
28540 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
28550 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70  .    for(pLeft=p
28560 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69  Sel; pLeft->pPri
28570 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d  or; pLeft=pLeft-
28580 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45  >pPrior);.    pE
28590 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45  List = pLeft->pE
285a0 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43  List;.    if( pC
285b0 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20  te->pCols ){.   
285c0 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
285d0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
285e0 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78  pCte->pCols->nEx
285f0 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
28600 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
28610 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
28620 68 61 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f  has %d values fo
28630 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20  r %d columns",. 
28640 20 20 20 20 20 20 20 20 20 20 20 70 43 74 65 2d             pCte-
28650 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e  >zName, pEList->
28660 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f  nExpr, pCte->pCo
28670 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20  ls->nExpr.      
28680 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61    );.        pPa
28690 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61  rse->pWith = pSa
286a0 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20  vedWith;.       
286b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
286c0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
286d0 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74      pEList = pCt
286e0 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a  e->pCols;.    }.
286f0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
28700 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
28710 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
28720 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
28730 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69  ab->aCol);.    i
28740 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  f( bMayRecursive
28750 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53   ){.      if( pS
28760 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  el->selFlags & S
28770 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  F_Recursive ){. 
28780 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74         pCte->zCt
28790 65 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65  eErr = "multiple
287a0 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
287b0 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20  ences: %s";.    
287c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
287d0 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d   pCte->zCteErr =
287e0 20 22 72 65 63 75 72 73 69 76 65 20 72 65 66 65   "recursive refe
287f0 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75  rence in a subqu
28800 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20  ery: %s";.      
28810 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  }.      sqlite3W
28820 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
28830 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a  r, pSel);.    }.
28840 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
28850 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73  r = 0;.    pPars
28860 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65  e->pWith = pSave
28870 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65  dWith;.  }..  re
28880 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28890 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
288a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
288b0 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  E./*.** If the S
288c0 45 4c 45 43 54 20 70 61 73 73 65 64 20 61 73 20  ELECT passed as 
288d0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
288e0 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63  ent has an assoc
288f0 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63  iated WITH .** c
28900 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72  lause, pop it fr
28910 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f  om the stack sto
28920 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  red as part of t
28930 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e  he Parse object.
28940 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
28950 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20  tion is used as 
28960 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62  the xSelectCallb
28970 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20  ack2() callback 
28980 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c  by.** sqlite3Sel
28990 65 63 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e  ectExpand() when
289a0 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43   walking a SELEC
289b0 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76  T tree to resolv
289c0 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73  e table.** names
289d0 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20   and other FROM 
289e0 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e  clause elements.
289f0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
28a00 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57   selectPopWith(W
28a10 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
28a20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
28a30 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
28a40 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
28a50 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59   if( OK_IF_ALWAY
28a60 53 5f 54 52 55 45 28 70 50 61 72 73 65 2d 3e 70  S_TRUE(pParse->p
28a70 57 69 74 68 29 20 26 26 20 70 2d 3e 70 50 72 69  With) && p->pPri
28a80 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69 74  or==0 ){.    Wit
28a90 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52  h *pWith = findR
28aa0 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69  ightmost(p)->pWi
28ab0 74 68 3b 0a 20 20 20 20 69 66 28 20 70 57 69 74  th;.    if( pWit
28ac0 68 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  h!=0 ){.      as
28ad0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57  sert( pParse->pW
28ae0 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20  ith==pWith );.  
28af0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
28b00 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65  h = pWith->pOute
28b10 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  r;.    }.  }.}.#
28b20 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c  else.#define sel
28b30 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e  ectPopWith 0.#en
28b40 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  dif..static int 
28b50 73 65 6c 65 63 74 45 78 70 61 6e 64 53 75 62 71  selectExpandSubq
28b60 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61 72  uery(Parse *pPar
28b70 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69  se, struct SrcLi
28b80 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b  st_item *pFrom){
28b90 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20  .  Select *pSel 
28ba0 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
28bb0 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
28bc0 0a 0a 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  ..  pFrom->pTab 
28bd0 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
28be0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
28bf0 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
28c00 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70  Table));.  if( p
28c10 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
28c20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 70 54 61  WRC_Abort;.  pTa
28c30 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a  b->nTabRef = 1;.
28c40 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c    if( pFrom->zAl
28c50 69 61 73 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  ias ){.    pTab-
28c60 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
28c70 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d  DbStrDup(pParse-
28c80 3e 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  >db, pFrom->zAli
28c90 61 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  as);.  }else{.  
28ca0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
28cb0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
28cc0 50 61 72 73 65 2d 3e 64 62 2c 20 22 73 75 62 71  Parse->db, "subq
28cd0 75 65 72 79 5f 25 70 22 2c 20 28 76 6f 69 64 2a  uery_%p", (void*
28ce0 29 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 77 68  )pTab);.  }.  wh
28cf0 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
28d00 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c  r ){ pSel = pSel
28d10 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 73 71  ->pPrior; }.  sq
28d20 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d  lite3ColumnsFrom
28d30 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
28d40 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70   pSel->pEList,&p
28d50 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d  Tab->nCol,&pTab-
28d60 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62 2d 3e  >aCol);.  pTab->
28d70 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
28d80 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
28d90 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
28da0 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
28db0 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 70  (1048576) );.  p
28dc0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
28dd0 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 0a   TF_Ephemeral;..
28de0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
28df0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
28e00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
28e10 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  a Walker callbac
28e20 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67  k for "expanding
28e30 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
28e40 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64  ment..** "Expand
28e50 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f  ing" means to do
28e60 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
28e70 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61  **.**    (1)  Ma
28e80 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72  ke sure VDBE cur
28e90 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
28ea0 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
28eb0 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20  o every.**      
28ec0 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68     element of th
28ed0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
28ee0 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c  *.**    (2)  Fil
28ef0 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
28f00 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
28f10 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
28f20 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
28f30 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20     defines FROM 
28f40 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69  clause.  When vi
28f50 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  ews appear in th
28f60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a  e FROM clause,.*
28f70 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
28f80 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
28f90 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
28fa0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
28fb0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
28fc0 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
28fd0 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
28fe0 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
28ff0 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
29000 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
29010 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
29020 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
29030 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
29040 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
29050 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
29060 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
29070 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
29080 65 72 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  ersistent repres
29090 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
290a0 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
290b0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41  .**.**    (3)  A
290c0 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
290d0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
290e0 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20  accommodate the 
290f0 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a  NATURAL keyword.
29100 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f  **         on jo
29110 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61  ins and the ON a
29120 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  nd USING clause 
29130 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20  of joins..**.** 
29140 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65     (4)  Scan the
29150 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
29160 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
29170 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b  et (pEList) look
29180 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ing.**         f
29190 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  or instances of 
291a0 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  the "*" operator
291b0 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20   or the TABLE.* 
291c0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20  operator..**    
291d0 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65       If found, e
291e0 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74  xpand each "*" t
291f0 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
29200 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65  n in every table
29210 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20  .**         and 
29220 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76  TABLE.* to be ev
29230 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41  ery column in TA
29240 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  BLE..**.*/.stati
29250 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61  c int selectExpa
29260 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61  nder(Walker *pWa
29270 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
29280 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
29290 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
292a0 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  rse;.  int i, j,
292b0 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   k;.  SrcList *p
292c0 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
292d0 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
292e0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
292f0 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c  em *pFrom;.  sql
29300 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
29310 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
29320 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78  E, *pRight, *pEx
29330 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61  pr;.  u16 selFla
29340 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  gs = p->selFlags
29350 3b 0a 20 20 75 33 32 20 65 6c 69 73 74 46 6c 61  ;.  u32 elistFla
29360 67 73 20 3d 20 30 3b 0a 0a 20 20 70 2d 3e 73 65  gs = 0;..  p->se
29370 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70  lFlags |= SF_Exp
29380 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d  anded;.  if( db-
29390 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29  >mallocFailed  )
293a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
293b0 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 61 73  _Abort;.  }.  as
293c0 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30  sert( p->pSrc!=0
293d0 20 29 3b 0a 20 20 69 66 28 20 28 73 65 6c 46 6c   );.  if( (selFl
293e0 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65  ags & SF_Expande
293f0 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  d)!=0 ){.    ret
29400 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
29410 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20   }.  pTabList = 
29420 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
29430 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
29440 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68   sqlite3WithPush
29450 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 57 69 74  (pParse, p->pWit
29460 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  h, 0);..  /* Mak
29470 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
29480 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
29490 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
294a0 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
294b0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
294c0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
294d0 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
294e0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
294f0 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
29500 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a  se, pTabList);..
29510 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
29520 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69  ry table named i
29530 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
29540 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  e of the select.
29550 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74    If.  ** an ent
29560 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
29570 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75  lause is a subqu
29580 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ery instead of a
29590 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a   table or view,.
295a0 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65    ** then create
295b0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
295c0 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  le structure to 
295d0 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62  describe the sub
295e0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
295f0 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
29600 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
29610 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
29620 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
29630 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
29640 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66  assert( pFrom->f
29650 67 2e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30  g.isRecursive==0
29660 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21   || pFrom->pTab!
29670 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46  =0 );.    if( pF
29680 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73  rom->fg.isRecurs
29690 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ive ) continue;.
296a0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
296b0 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69  m->pTab==0 );.#i
296c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
296d0 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69  T_CTE.    if( wi
296e0 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72  thExpand(pWalker
296f0 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72  , pFrom) ) retur
29700 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
29710 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
29720 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69   ) {} else.#endi
29730 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  f.    if( pFrom-
29740 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
29750 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29760 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
29770 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
29780 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
29790 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
297a0 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
297b0 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
297c0 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
297d0 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20  rt( pSel!=0 );. 
297e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
297f0 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
29800 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
29810 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
29820 65 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75  er, pSel) ) retu
29830 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
29840 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 45 78      if( selectEx
29850 70 61 6e 64 53 75 62 71 75 65 72 79 28 70 50 61  pandSubquery(pPa
29860 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72 65  rse, pFrom) ) re
29870 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
29880 23 69 66 20 30 0a 20 20 20 20 20 20 70 46 72 6f  #if 0.      pFro
29890 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
298a0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
298b0 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
298c0 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69  Table));.      i
298d0 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
298e0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
298f0 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52       pTab->nTabR
29900 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  ef = 1;.      if
29910 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20  ( pFrom->zAlias 
29920 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ){.        pTab-
29930 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
29940 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 46 72  DbStrDup(db, pFr
29950 6f 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  om->zAlias);.   
29960 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29970 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
29980 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
29990 62 2c 20 22 73 75 62 71 75 65 72 79 5f 25 70 22  b, "subquery_%p"
299a0 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a  , (void*)pTab);.
299b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
299c0 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
299d0 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c  r ){ pSel = pSel
299e0 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20  ->pPrior; }.    
299f0 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73    sqlite3Columns
29a00 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
29a10 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73  rse, pSel->pELis
29a20 74 2c 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70  t,&pTab->nCol,&p
29a30 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  Tab->aCol);.    
29a40 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
29a50 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  -1;.      pTab->
29a60 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30  nRowLogEst = 200
29a70 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73  ; assert( 200==s
29a80 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34  qlite3LogEst(104
29a90 38 35 37 36 29 20 29 3b 0a 20 20 20 20 20 20 70  8576) );.      p
29aa0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
29ab0 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23   TF_Ephemeral;.#
29ac0 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 20 20 20  endif.#endif.   
29ad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
29ae0 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   An ordinary tab
29af0 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
29b00 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
29b10 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  se */.      asse
29b20 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
29b30 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f  =0 );.      pFro
29b40 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
29b50 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
29b60 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
29b70 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20  0, pFrom);.     
29b80 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
29b90 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
29ba0 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
29bb0 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66 66 66 66  >nTabRef>=0xffff
29bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
29bd0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
29be0 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65  se, "too many re
29bf0 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73  ferences to \"%s
29c00 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a  \": max 65535",.
29c10 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
29c20 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
29c30 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30   pFrom->pTab = 0
29c40 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
29c50 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
29c60 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e    }.      pTab->
29c70 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20  nTabRef++;.     
29c80 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28   if( !IsVirtual(
29c90 70 54 61 62 29 20 26 26 20 63 61 6e 6e 6f 74 42  pTab) && cannotB
29ca0 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  eFunction(pParse
29cb0 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20  , pFrom) ){.    
29cc0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
29cd0 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69  bort;.      }.#i
29ce0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
29cf0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
29d00 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45  !defined (SQLITE
29d10 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
29d20 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 49 73  LE).      if( Is
29d30 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c  Virtual(pTab) ||
29d40 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
29d50 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e 43  {.        i16 nC
29d60 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ol;.        if( 
29d70 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
29d80 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
29d90 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  , pTab) ) return
29da0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
29db0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
29dc0 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  m->pSelect==0 );
29dd0 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
29de0 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
29df0 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
29e00 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  Tab->pSelect, 0)
29e10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
29e20 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
29e30 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70  From->pSelect, p
29e40 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
29e50 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62       nCol = pTab
29e60 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->nCol;.        
29e70 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  pTab->nCol = -1;
29e80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29e90 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
29ea0 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  er, pFrom->pSele
29eb0 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61  ct);.        pTa
29ec0 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a  b->nCol = nCol;.
29ed0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
29ee0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63     }..    /* Loc
29ef0 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61  ate the index na
29f00 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58  med by the INDEX
29f10 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66  ED BY clause, if
29f20 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28   any. */.    if(
29f30 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
29f40 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  yLookup(pParse, 
29f50 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20  pFrom) ){.      
29f60 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
29f70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
29f80 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41  * Process NATURA
29f90 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20  L keywords, and 
29fa0 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
29fb0 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20  uses of joins.. 
29fc0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
29fd0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71  llocFailed || sq
29fe0 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
29ff0 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20  pParse, p) ){.  
2a000 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
2a010 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f  rt;.  }..  /* Fo
2a020 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74  r every "*" that
2a030 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63   occurs in the c
2a040 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65  olumn list, inse
2a050 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  rt the names of.
2a060 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73    ** all columns
2a070 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20   in all tables. 
2a080 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54   And for every T
2a090 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68  ABLE.* insert th
2a0a0 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20  e names.  ** of 
2a0b0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54  all columns in T
2a0c0 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65  ABLE.  The parse
2a0d0 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65  r inserted a spe
2a0e0 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a  cial expression.
2a0f0 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b    ** with the TK
2a100 5f 41 53 54 45 52 49 53 4b 20 6f 70 65 72 61 74  _ASTERISK operat
2a110 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20  or for each "*" 
2a120 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e  that it found in
2a130 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a   the column.  **
2a140 20 6c 69 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c   list.  The foll
2a150 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20  owing code just 
2a160 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  has to locate th
2a170 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20  e TK_ASTERISK.  
2a180 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
2a190 6e 64 20 65 78 70 61 6e 64 20 65 61 63 68 20 6f  nd expand each o
2a1a0 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ne to the list o
2a1b0 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
2a1c0 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73  .  ** all tables
2a1d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
2a1e0 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20  first loop just 
2a1f0 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
2a200 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22   there are any "
2a210 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a  *" operators.  *
2a220 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61  * that need expa
2a230 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nding..  */.  fo
2a240 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
2a250 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
2a260 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61    pE = pEList->a
2a270 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [k].pExpr;.    i
2a280 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53  f( pE->op==TK_AS
2a290 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a  TERISK ) break;.
2a2a0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
2a2b0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
2a2c0 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  ->pRight!=0 );. 
2a2d0 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
2a2e0 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45  p!=TK_DOT || (pE
2a2f0 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45  ->pLeft!=0 && pE
2a300 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
2a310 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ID) );.    if( p
2a320 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
2a330 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
2a340 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62  =TK_ASTERISK ) b
2a350 72 65 61 6b 3b 0a 20 20 20 20 65 6c 69 73 74 46  reak;.    elistF
2a360 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61 67  lags |= pE->flag
2a370 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70  s;.  }.  if( k<p
2a380 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
2a390 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66      /*.    ** If
2a3a0 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20   we get here it 
2a3b0 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74  means the result
2a3c0 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e   set contains on
2a3d0 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20  e or more "*".  
2a3e0 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74    ** operators t
2a3f0 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  hat need to be e
2a400 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74  xpanded.  Loop t
2a410 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
2a420 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e  ession.    ** in
2a430 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
2a440 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20  and expand them 
2a450 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20  one by one..    
2a460 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  */.    struct Ex
2a470 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d  prList_item *a =
2a480 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
2a490 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d  ExprList *pNew =
2a4a0 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   0;.    int flag
2a4b0 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  s = pParse->db->
2a4c0 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c  flags;.    int l
2a4d0 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67  ongNames = (flag
2a4e0 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
2a4f0 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20  olNames)!=0.    
2a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a510 20 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51    && (flags & SQ
2a520 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
2a530 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72  es)==0;..    for
2a540 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
2a550 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
2a560 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78     pE = a[k].pEx
2a570 70 72 3b 0a 20 20 20 20 20 20 65 6c 69 73 74 46  pr;.      elistF
2a580 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61 67  lags |= pE->flag
2a590 73 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  s;.      pRight 
2a5a0 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20  = pE->pRight;.  
2a5b0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
2a5c0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52  op!=TK_DOT || pR
2a5d0 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  ight!=0 );.     
2a5e0 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f   if( pE->op!=TK_
2a5f0 41 53 54 45 52 49 53 4b 0a 20 20 20 20 20 20 20  ASTERISK.       
2a600 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  && (pE->op!=TK_D
2a610 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70  OT || pRight->op
2a620 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29 0a 20  !=TK_ASTERISK). 
2a630 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2a640 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c  /* This particul
2a650 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f  ar expression do
2a660 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
2a670 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20  e expanded..    
2a680 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
2a690 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
2a6a0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
2a6b0 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70  se, pNew, a[k].p
2a6c0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
2a6d0 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
2a6e0 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
2a6f0 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d  w->nExpr-1].zNam
2a700 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a  e = a[k].zName;.
2a710 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2a720 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
2a730 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53  .zSpan = a[k].zS
2a740 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61  pan;.          a
2a750 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  [k].zName = 0;. 
2a760 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53           a[k].zS
2a770 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pan = 0;.       
2a780 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e   }.        a[k].
2a790 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20  pExpr = 0;.     
2a7a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a7b0 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69  /* This expressi
2a7c0 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61  on is a "*" or a
2a7d0 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e   "TABLE.*" and n
2a7e0 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20  eeds to be.     
2a7f0 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20     ** expanded. 
2a800 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  */.        int t
2a810 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20  ableSeen = 0;   
2a820 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77     /* Set to 1 w
2a830 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65  hen TABLE matche
2a840 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  s */.        cha
2a850 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20  r *zTName = 0;  
2a860 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20       /* text of 
2a870 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f  name of TABLE */
2a880 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d  .        if( pE-
2a890 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
2a8a0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2a8b0 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b   pE->pLeft!=0 );
2a8c0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2a8d0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2a8e0 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45  rty(pE->pLeft, E
2a8f0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
2a900 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
2a910 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a  = pE->pLeft->u.z
2a920 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d  Token;.        }
2a930 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2a940 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
2a950 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
2a960 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
2a970 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
2a980 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
2a990 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  rom->pTab;.     
2a9a0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75       Select *pSu
2a9b0 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  b = pFrom->pSele
2a9c0 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ct;.          ch
2a9d0 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
2a9e0 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  From->zAlias;.  
2a9f0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2aa00 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20  ar *zSchemaName 
2aa10 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
2aa20 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
2aa30 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d    if( zTabName==
2aa40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2aa50 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62   zTabName = pTab
2aa60 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
2aa70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
2aa80 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2aa90 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  led ) break;.   
2aaa0 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 3d         if( pSub=
2aab0 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c  =0 || (pSub->sel
2aac0 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65  Flags & SF_Neste
2aad0 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20  dFrom)==0 ){.   
2aae0 20 20 20 20 20 20 20 20 20 70 53 75 62 20 3d 20           pSub = 
2aaf0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
2ab00 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c  f( zTName && sql
2ab10 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61  ite3StrICmp(zTNa
2ab20 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30  me, zTabName)!=0
2ab30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ab40 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2ab50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ab60 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69        iDb = sqli
2ab70 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
2ab80 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
2ab90 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ma);.           
2aba0 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69   zSchemaName = i
2abb0 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b  Db>=0 ? db->aDb[
2abc0 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a 20  iDb].zDbSName : 
2abd0 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  "*";.          }
2abe0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
2abf0 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
2ac00 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
2ac10 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
2ac20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
2ac30 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
2ac40 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d     char *zColnam
2ac50 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75  e;  /* The compu
2ac60 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ted column name 
2ac70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  */.            c
2ac80 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20  har *zToFree;   
2ac90 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69  /* Malloced stri
2aca0 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ng that needs to
2acb0 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20   be freed */.   
2acc0 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73           Token s
2acd0 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d  Colname;  /* Com
2ace0 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  puted column nam
2acf0 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a  e as a token */.
2ad00 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
2ad10 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20  ert( zName );.  
2ad20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
2ad30 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20  Name && pSub.   
2ad40 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
2ad50 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d  ite3MatchSpanNam
2ad60 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  e(pSub->pEList->
2ad70 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a  a[j].zSpan, 0, z
2ad80 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20  TName, 0)==0.   
2ad90 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2ada0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2adb0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
2adc0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  }..            /
2add0 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73  * If a column is
2ade0 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64 64   marked as 'hidd
2adf0 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20 66 72 6f  en', omit it fro
2ae00 6d 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20  m the expanded. 
2ae10 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65             ** re
2ae20 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 20 75 6e  sult-set list un
2ae30 6c 65 73 73 20 74 68 65 20 53 45 4c 45 43 54 20  less the SELECT 
2ae40 68 61 73 20 74 68 65 20 53 46 5f 49 6e 63 6c 75  has the SF_Inclu
2ae50 64 65 48 69 64 64 65 6e 0a 20 20 20 20 20 20 20  deHidden.       
2ae60 20 20 20 20 20 2a 2a 20 62 69 74 20 73 65 74 2e       ** bit set.
2ae70 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
2ae80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2ae90 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
2aea0 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 29  F_IncludeHidden)
2aeb0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
2aec0 20 26 26 20 49 73 48 69 64 64 65 6e 43 6f 6c 75   && IsHiddenColu
2aed0 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  mn(&pTab->aCol[j
2aee0 5d 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]) .            
2aef0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2af00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2af10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2af20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d       tableSeen =
2af30 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20   1;..           
2af40 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61   if( i>0 && zTNa
2af50 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
2af60 20 20 20 20 20 20 20 69 66 28 20 28 70 46 72 6f         if( (pFro
2af70 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
2af80 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a   JT_NATURAL)!=0.
2af90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afa0 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  && tableAndColum
2afb0 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c  nIndex(pTabList,
2afc0 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29   i, zName, 0, 0)
2afd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29  .              )
2afe0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2aff0 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41    /* In a NATURA
2b000 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65  L join, omit the
2b010 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72   join columns fr
2b020 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  om the .        
2b030 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
2b040 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66   to the right of
2b050 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20   the join */.   
2b060 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
2b070 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2b080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b090 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2b0a0 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f  IdListIndex(pFro
2b0b0 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65  m->pUsing, zName
2b0c0 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
2b0d0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
2b0e0 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e  join with a USIN
2b0f0 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63  G clause, omit c
2b100 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20  olumns in the.  
2b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2b120 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72   using clause fr
2b130 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  om the table on 
2b140 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20  the right. */.  
2b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
2b160 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2b170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b180 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b190 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74    pRight = sqlit
2b1a0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
2b1b0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
2b1c0 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d        zColname =
2b1d0 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20   zName;.        
2b1e0 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b      zToFree = 0;
2b1f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2b200 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54   longNames || pT
2b210 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29  abList->nSrc>1 )
2b220 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2b230 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20  Expr *pLeft;.   
2b240 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
2b250 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
2b260 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61  b, TK_ID, zTabNa
2b270 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
2b280 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
2b290 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
2b2a0 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70  TK_DOT, pLeft, p
2b2b0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
2b2c0 20 20 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d        if( zSchem
2b2d0 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  aName ){.       
2b2e0 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
2b2f0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
2b300 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e   TK_ID, zSchemaN
2b310 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2b320 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
2b330 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
2b340 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
2b350 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
2b360 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b370 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
2b380 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
2b390 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
2b3a0 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
2b3b0 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  tf(db, "%s.%s", 
2b3c0 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  zTabName, zName)
2b3d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2b3e0 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c    zToFree = zCol
2b3f0 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  name;.          
2b400 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b420 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70         pExpr = p
2b430 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
2b440 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2b450 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
2b460 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
2b470 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70  arse, pNew, pExp
2b480 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
2b490 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74  sqlite3TokenInit
2b4a0 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a 43 6f 6c  (&sColname, zCol
2b4b0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
2b4c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
2b4d0 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
2b4e0 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d  , pNew, &sColnam
2b4f0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 0);.         
2b500 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20 28     if( pNew && (
2b510 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2b520 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20  _NestedFrom)!=0 
2b530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2b540 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2b550 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65  _item *pX = &pNe
2b560 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
2b570 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -1];.           
2b580 20 20 20 69 66 28 20 70 53 75 62 20 29 7b 0a 20     if( pSub ){. 
2b590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2b5a0 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  X->zSpan = sqlit
2b5b0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
2b5c0 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a  Sub->pEList->a[j
2b5d0 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20  ].zSpan);.      
2b5e0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2b5f0 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30  se( pX->zSpan==0
2b600 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2b610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b620 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70           pX->zSp
2b630 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  an = sqlite3MPri
2b640 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 2e 25  ntf(db, "%s.%s.%
2b650 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
2b660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
2b680 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62  SchemaName, zTab
2b690 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b  Name, zColname);
2b6a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b6b0 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a   testcase( pX->z
2b6c0 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Span==0 );.     
2b6d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b6e0 20 20 20 20 20 20 20 20 20 70 58 2d 3e 62 53 70           pX->bSp
2b6f0 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20 20 20  anIsTab = 1;.   
2b700 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b710 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
2b720 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65  Free(db, zToFree
2b730 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2b740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b750 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
2b760 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2b770 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20   zTName ){.     
2b780 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
2b790 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2b7a0 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
2b7b0 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20  s", zTName);.   
2b7c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2b7d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b7e0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2b7f0 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65  , "no tables spe
2b800 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  cified");.      
2b810 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2b820 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b830 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2b840 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69  tDelete(db, pELi
2b850 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69  st);.    p->pELi
2b860 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  st = pNew;.  }. 
2b870 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 29   if( p->pEList )
2b880 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 45 4c  {.    if( p->pEL
2b890 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61  ist->nExpr>db->a
2b8a0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
2b8b0 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
2b8c0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2b8d0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
2b8e0 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   many columns in
2b8f0 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20   result set");. 
2b900 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2b910 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20  Abort;.    }.   
2b920 20 69 66 28 20 28 65 6c 69 73 74 46 6c 61 67 73   if( (elistFlags
2b930 20 26 20 28 45 50 5f 48 61 73 46 75 6e 63 7c 45   & (EP_HasFunc|E
2b940 50 5f 53 75 62 71 75 65 72 79 29 29 21 3d 30 20  P_Subquery))!=0 
2b950 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 65 6c 46  ){.      p->selF
2b960 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6d 70 6c  lags |= SF_Compl
2b970 65 78 52 65 73 75 6c 74 3b 0a 20 20 20 20 7d 0a  exResult;.    }.
2b980 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
2b990 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
2b9a0 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e  .** No-op routin
2b9b0 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d  e for the parse-
2b9c0 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a  tree walker..**.
2b9d0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
2b9e0 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b  tine is the Walk
2b9f0 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
2ba00 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e   then expression
2ba10 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61   trees.** are wa
2ba20 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79  lked without any
2ba30 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74   actions being t
2ba40 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64  aken at each nod
2ba50 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a  e.  Presumably,.
2ba60 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ** when this rou
2ba70 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
2ba80 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
2ba90 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57  lback then .** W
2baa0 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
2bab0 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20  lback is set to 
2bac0 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65  do something use
2bad0 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a  ful for every .*
2bae0 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68  * subquery in th
2baf0 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a  e parser tree..*
2bb00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2bb10 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72  rWalkNoop(Walker
2bb20 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20   *NotUsed, Expr 
2bb30 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e  *NotUsed2){.  UN
2bb40 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
2bb50 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
2bb60 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43  2);.  return WRC
2bb70 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
2bb80 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e  .** No-op routin
2bb90 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d  e for the parse-
2bba0 74 72 65 65 20 77 61 6c 6b 65 72 20 66 6f 72 20  tree walker for 
2bbb0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2bbc0 73 2e 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69  s..** subquery i
2bbd0 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65  n the parser tre
2bbe0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2bbf0 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 28  3SelectWalkNoop(
2bc00 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c  Walker *NotUsed,
2bc10 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64   Select *NotUsed
2bc20 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
2bc30 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
2bc40 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
2bc50 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2bc60 65 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  e;.}..#if SQLITE
2bc70 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 6c 77  _DEBUG./*.** Alw
2bc80 61 79 73 20 61 73 73 65 72 74 2e 20 20 54 68 69  ays assert.  Thi
2bc90 73 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  s xSelectCallbac
2bca0 6b 32 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  k2 implementatio
2bcb0 6e 20 70 72 6f 76 65 73 20 74 68 61 74 20 74 68  n proves that th
2bcc0 65 0a 2a 2a 20 78 53 65 6c 65 63 74 43 61 6c 6c  e.** xSelectCall
2bcd0 62 61 63 6b 32 20 69 73 20 6e 65 76 65 72 20 69  back2 is never i
2bce0 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  nvoked..*/.void 
2bcf0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
2bd00 6b 41 73 73 65 72 74 32 28 57 61 6c 6b 65 72 20  kAssert2(Walker 
2bd10 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65 63 74  *NotUsed, Select
2bd20 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55   *NotUsed2){.  U
2bd30 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
2bd40 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
2bd50 64 32 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30  d2);.  assert( 0
2bd60 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 2f 2a 0a   );.}.#endif./*.
2bd70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2bd80 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45  "expands" a SELE
2bd90 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  CT statement and
2bda0 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71   all of its subq
2bdb0 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61  ueries..** For a
2bdc0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
2bdd0 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74  ation on what it
2bde0 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e   means to "expan
2bdf0 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73  d" a SELECT.** s
2be00 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68  tatement, see th
2be10 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
2be20 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f   selectExpand wo
2be30 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62  rker callback ab
2be40 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e  ove..**.** Expan
2be50 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74  ding a SELECT st
2be60 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66  atement is the f
2be70 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f  irst step in pro
2be80 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c  cessing a.** SEL
2be90 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
2bea0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
2beb0 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70  ment must be exp
2bec0 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  anded before.** 
2bed0 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
2bee0 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a  is performed..**
2bef0 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20  .** If anything 
2bf00 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65  goes wrong, an e
2bf10 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
2bf20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61  written into pPa
2bf30 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  rse..** The call
2bf40 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  ing function can
2bf50 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62   detect the prob
2bf60 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  lem by looking a
2bf70 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a  t pParse->nErr.*
2bf80 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d  * and/or pParse-
2bf90 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2bfa0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
2bfb0 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  d sqlite3SelectE
2bfc0 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61  xpand(Parse *pPa
2bfd0 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
2bfe0 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20  lect){.  Walker 
2bff0 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  w;.  w.xExprCall
2c000 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  back = sqlite3Ex
2c010 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
2c020 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2c030 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57  .  if( OK_IF_ALW
2c040 41 59 53 5f 54 52 55 45 28 70 50 61 72 73 65 2d  AYS_TRUE(pParse-
2c050 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 29 20 29 7b  >hasCompound) ){
2c060 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61  .    w.xSelectCa
2c070 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74  llback = convert
2c080 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f  CompoundSelectTo
2c090 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20 77 2e  Subquery;.    w.
2c0a0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
2c0b0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
2c0c0 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
2c0d0 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20  pSelect);.  }.  
2c0e0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2c0f0 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64  k = selectExpand
2c100 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  er;.  w.xSelectC
2c110 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63  allback2 = selec
2c120 74 50 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c 69  tPopWith;.  sqli
2c130 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
2c140 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a  , pSelect);.}...
2c150 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c160 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
2c170 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c  ** This is a Wal
2c180 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
2c190 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ack callback for
2c1a0 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65   the sqlite3Sele
2c1b0 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20  ctTypeInfo().** 
2c1c0 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
2c1d0 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63   For each FROM-c
2c1e0 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20  lause subquery, 
2c1f0 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  add Column.zType
2c200 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c   and Column.zCol
2c210 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
2c220 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74   to the Table st
2c230 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
2c240 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
2c250 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61  lt set.** of tha
2c260 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  t subquery..**.*
2c270 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
2c280 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
2c290 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
2c2a0 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75   set was constru
2c2b0 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63  cted.** by selec
2c2c0 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20  tExpander() but 
2c2d0 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  the type and col
2c2e0 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
2c2f0 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a  on was omitted.*
2c300 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  * at that point 
2c310 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69  because identifi
2c320 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ers had not yet 
2c330 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20  been resolved.  
2c340 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
2c350 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
2c360 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c  identifier resol
2c370 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
2c380 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53   void selectAddS
2c390 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28  ubqueryTypeInfo(
2c3a0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2c3b0 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
2c3c0 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20  arse *pParse;.  
2c3d0 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74  int i;.  SrcList
2c3e0 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74   *pTabList;.  st
2c3f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2c400 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73  m *pFrom;..  ass
2c410 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
2c420 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29   & SF_Resolved )
2c430 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  ;.  assert( (p->
2c440 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
2c450 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 3b  sTypeInfo)==0 );
2c460 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
2c470 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  = SF_HasTypeInfo
2c480 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61  ;.  pParse = pWa
2c490 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
2c4a0 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
2c4b0 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  rc;.  for(i=0, p
2c4c0 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
2c4d0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
2c4e0 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
2c4f0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
2c500 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
2c510 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
2c520 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab!=0 );.    if(
2c530 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
2c540 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
2c550 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
2c560 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
2c570 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
2c580 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
2c590 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
2c5a0 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
2c5b0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  t;.      if( pSe
2c5c0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  l ){.        whi
2c5d0 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
2c5e0 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e   ) pSel = pSel->
2c5f0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
2c600 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
2c610 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
2c620 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
2c630 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  Tab, pSel);.    
2c640 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
2c650 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
2c660 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73  his routine adds
2c670 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f   datatype and co
2c680 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
2c690 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a   information to.
2c6a0 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  ** the Table str
2c6b0 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46  uctures of all F
2c6c0 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
2c6d0 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45  eries in a.** SE
2c6e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
2c6f0 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72  **.** Use this r
2c700 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d  outine after nam
2c710 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  e resolution..*/
2c720 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
2c730 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
2c740 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  eInfo(Parse *pPa
2c750 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
2c760 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  lect){.#ifndef S
2c770 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2c780 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  ERY.  Walker w;.
2c790 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2c7a0 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ack = sqlite3Sel
2c7b0 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  ectWalkNoop;.  w
2c7c0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2c7d0 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62  2 = selectAddSub
2c7e0 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20  queryTypeInfo;. 
2c7f0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
2c800 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
2c810 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72  lkNoop;.  w.pPar
2c820 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73  se = pParse;.  s
2c830 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
2c840 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23  (&w, pSelect);.#
2c850 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
2c860 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
2c870 73 20 75 70 20 61 20 53 45 4c 45 43 54 20 73 74  s up a SELECT st
2c880 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63  atement for proc
2c890 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20  essing.  The.** 
2c8a0 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63  following is acc
2c8b0 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a  omplished:.**.**
2c8c0 20 20 20 20 20 2a 20 20 56 44 42 45 20 43 75 72       *  VDBE Cur
2c8d0 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20  sor numbers are 
2c8e0 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
2c8f0 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d  FROM-clause term
2c900 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68  s..**     *  Eph
2c910 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a  emeral Table obj
2c920 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64  ects are created
2c930 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c   for all FROM-cl
2c940 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2e  ause subqueries.
2c950 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e  .**     *  ON an
2c960 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
2c970 61 72 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f  are shifted into
2c980 20 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74   WHERE statement
2c990 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64  s.**     *  Wild
2c9a0 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54  cards "*" and "T
2c9b0 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c  ABLE.*" in resul
2c9c0 74 20 73 65 74 73 20 61 72 65 20 65 78 70 61 6e  t sets are expan
2c9d0 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49  ded..**     *  I
2c9e0 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78  dentifiers in ex
2c9f0 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74  pression are mat
2ca00 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a  ched to tables..
2ca10 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2ca20 6e 65 20 61 63 74 73 20 72 65 63 75 72 73 69 76  ne acts recursiv
2ca30 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75  ely on all subqu
2ca40 65 72 69 65 73 20 77 69 74 68 69 6e 20 74 68 65  eries within the
2ca50 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
2ca60 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
2ca70 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
2ca80 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
2ca90 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
2caa0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
2cab0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
2cac0 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
2cad0 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
2cae0 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ed. */.  NameCon
2caf0 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20  text *pOuterNC  
2cb00 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
2cb10 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f  for container */
2cb20 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  .){.  assert( p!
2cb30 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
2cb40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2cb50 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
2cb60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2cb70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
2cb80 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
2cb90 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20  F_HasTypeInfo ) 
2cba0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
2cbb0 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50  3SelectExpand(pP
2cbc0 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20  arse, p);.  if( 
2cbd0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
2cbe0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
2cbf0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
2cc00 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f  n;.  sqlite3Reso
2cc10 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70  lveSelectNames(p
2cc20 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72  Parse, p, pOuter
2cc30 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  NC);.  if( pPars
2cc40 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73  e->nErr || pPars
2cc50 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
2cc60 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
2cc70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
2cc80 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c  TypeInfo(pParse,
2cc90 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
2cca0 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
2ccb0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  e accumulator..*
2ccc0 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61  *.** The aggrega
2ccd0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69  te accumulator i
2cce0 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72  s a set of memor
2ccf0 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c  y cells that hol
2cd00 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74  d.** intermediat
2cd10 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20  e results while 
2cd20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61  calculating an a
2cd30 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a  ggregate.  This.
2cd40 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
2cd50 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 73  ates code that s
2cd60 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61  tores NULLs in a
2cd70 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f  ll of those memo
2cd80 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  ry.** cells..*/.
2cd90 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65  static void rese
2cda0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  tAccumulator(Par
2cdb0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
2cdc0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
2cdd0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
2cde0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
2cdf0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
2ce00 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63  Info_func *pFunc
2ce10 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70  ;.  int nReg = p
2ce20 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b  AggInfo->nFunc +
2ce30 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75   pAggInfo->nColu
2ce40 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d  mn;.  if( nReg==
2ce50 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64  0 ) return;.#ifd
2ce60 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2ce70 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
2ce80 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67   all AggInfo reg
2ce90 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68 69  isters are withi
2cea0 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65 63  n the range spec
2ceb0 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67  ified by.  ** Ag
2cec0 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67  gInfo.mnReg..Agg
2ced0 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20  Info.mxReg */.  
2cee0 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41  assert( nReg==pA
2cef0 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41  ggInfo->mxReg-pA
2cf00 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20  ggInfo->mnReg+1 
2cf10 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2cf20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
2cf30 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  n; i++){.    ass
2cf40 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ert( pAggInfo->a
2cf50 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67  Col[i].iMem>=pAg
2cf60 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20  gInfo->mnReg.   
2cf70 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66        && pAggInf
2cf80 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c  o->aCol[i].iMem<
2cf90 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
2cfa0 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   );.  }.  for(i=
2cfb0 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
2cfc0 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
2cfd0 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
2cfe0 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e  ->aFunc[i].iMem>
2cff0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  =pAggInfo->mnReg
2d000 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67  .         && pAg
2d010 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e  gInfo->aFunc[i].
2d020 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem<=pAggInfo->
2d030 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e  mxReg );.  }.#en
2d040 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62  dif.  sqlite3Vdb
2d050 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
2d060 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d  ll, 0, pAggInfo-
2d070 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f  >mnReg, pAggInfo
2d080 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28  ->mxReg);.  for(
2d090 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
2d0a0 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
2d0b0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
2d0c0 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
2d0d0 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69    if( pFunc->iDi
2d0e0 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
2d0f0 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46     Expr *pE = pF
2d100 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  unc->pExpr;.    
2d110 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2d120 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
2d130 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2d140 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e        if( pE->x.
2d150 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  pList==0 || pE->
2d160 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  x.pList->nExpr!=
2d170 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
2d180 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2d190 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61  rse, "DISTINCT a
2d1a0 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68  ggregates must h
2d1b0 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  ave exactly one 
2d1c0 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72  ".           "ar
2d1d0 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20  gument");.      
2d1e0 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e    pFunc->iDistin
2d1f0 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  ct = -1;.      }
2d200 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65  else{.        Ke
2d210 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
2d220 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
2d230 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
2d240 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29  ->x.pList, 0, 0)
2d250 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2d260 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2d270 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
2d280 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
2d290 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  t, 0, 0,.       
2d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2b0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
2d2c0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
2d2d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2d2e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
2d2f0 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e  ke the OP_AggFin
2d300 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72  alize opcode for
2d310 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65   every aggregate
2d320 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
2d330 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
2d340 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
2d350 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67   void finalizeAg
2d360 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65  gFunctions(Parse
2d370 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
2d380 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
2d390 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
2d3a0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
2d3b0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
2d3c0 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66  fo_func *pF;.  f
2d3d0 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
2d3e0 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
2d3f0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
2d400 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45  ++, pF++){.    E
2d410 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
2d420 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
2d430 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
2d440 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2d450 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
2d460 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
2d470 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d480 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e  Op2(v, OP_AggFin
2d490 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c  al, pF->iMem, pL
2d4a0 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
2d4b0 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 73 71 6c  pr : 0);.    sql
2d4c0 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
2d4d0 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50  (v, pF->pFunc, P
2d4e0 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a  4_FUNCDEF);.  }.
2d4f0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
2d500 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
2d510 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
2d520 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61   an aggregate ba
2d530 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75  sed on.** the cu
2d540 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
2d550 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
2d560 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75   void updateAccu
2d570 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
2d580 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
2d590 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
2d5a0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
2d5b0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
2d5c0 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b   int regHit = 0;
2d5d0 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65  .  int addrHitTe
2d5e0 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  st = 0;.  struct
2d5f0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
2d600 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  F;.  struct AggI
2d610 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20  nfo_col *pC;..  
2d620 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
2d630 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28  Mode = 1;.  for(
2d640 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
2d650 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
2d660 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
2d670 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   pF++){.    int 
2d680 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64  nArg;.    int ad
2d690 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  drNext = 0;.    
2d6a0 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20  int regAgg;.    
2d6b0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
2d6c0 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
2d6d0 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
2d6e0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2d6f0 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
2d700 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
2d710 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
2d720 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69        nArg = pLi
2d730 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
2d740 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65   regAgg = sqlite
2d750 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
2d760 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20  arse, nArg);.   
2d770 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2d780 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
2d790 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67  e, pList, regAgg
2d7a0 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c  , 0, SQLITE_ECEL
2d7b0 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _DUP);.    }else
2d7c0 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
2d7d0 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
2d7e0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
2d7f0 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
2d800 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
2d810 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
2d820 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2d830 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2d840 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45  nArg==0 );  /* E
2d850 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a  rror condition *
2d860 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
2d870 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a  ( nArg>1 );   /*
2d880 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a   Also an error *
2d890 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74  /.      codeDist
2d8a0 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d  inct(pParse, pF-
2d8b0 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72  >iDistinct, addr
2d8c0 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29  Next, 1, regAgg)
2d8d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d8e0 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  pF->pFunc->funcF
2d8f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
2d900 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
2d910 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
2d920 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  oll = 0;.      s
2d930 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
2d940 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
2d950 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61    int j;.      a
2d960 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
2d970 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20  );  /* pList!=0 
2d980 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73  if pF->pFunc has
2d990 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20   NEEDCOLL */.   
2d9a0 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
2d9b0 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f  m=pList->a; !pCo
2d9c0 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b  ll && j<nArg; j+
2d9d0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2d9e0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
2d9f0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2da00 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
2da10 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
2da20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
2da30 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
2da40 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
2da50 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
2da60 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 48  }.      if( regH
2da70 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66  it==0 && pAggInf
2da80 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  o->nAccumulator 
2da90 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61  ) regHit = ++pPa
2daa0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2dab0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2dac0 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p4(v, OP_CollSeq
2dad0 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20  , regHit, 0, 0, 
2dae0 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
2daf0 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
2db00 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
2db10 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67  eAddOp3(v, OP_Ag
2db20 67 53 74 65 70 30 2c 20 30 2c 20 72 65 67 41 67  gStep0, 0, regAg
2db30 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20  g, pF->iMem);.  
2db40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
2db50 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75  endP4(v, pF->pFu
2db60 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
2db70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2db80 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
2db90 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
2dba0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
2dbb0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
2dbc0 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
2dbd0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
2dbe0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
2dbf0 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
2dc00 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  g);.    if( addr
2dc10 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71  Next ){.      sq
2dc20 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2dc30 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78  Label(v, addrNex
2dc40 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
2dc50 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2dc60 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
2dc70 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20   }..  /* Before 
2dc80 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61  populating the a
2dc90 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
2dca0 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20  ters, clear the 
2dcb0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20  column cache..  
2dcc0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
2dcd0 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75   any of the requ
2dce0 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ired column valu
2dcf0 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  es are already p
2dd00 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20  resent .  ** in 
2dd10 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74  registers, sqlit
2dd20 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79  e3ExprCode() may
2dd30 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f   use OP_SCopy to
2dd40 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a   copy the value.
2dd50 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d    ** to pC->iMem
2dd60 2e 20 42 75 74 20 62 79 20 74 68 65 20 74 69 6d  . But by the tim
2dd70 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 75  e the value is u
2dd80 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  sed, the origina
2dd90 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20  l register.  ** 
2dda0 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 73  may have been us
2ddb0 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67  ed, invalidating
2ddc0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
2ddd0 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74  buffer holding t
2dde0 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20  he.  ** text or 
2ddf0 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20  blob value. See 
2de00 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63  ticket [883034dc
2de10 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  b5]..  **.  ** A
2de20 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20  nother solution 
2de30 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e  would be to chan
2de40 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20  ge the OP_SCopy 
2de50 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63  used to copy cac
2de60 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20  hed.  ** values 
2de70 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20  to an OP_Copy.. 
2de80 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74   */.  if( regHit
2de90 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54   ){.    addrHitT
2dea0 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
2deb0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
2dec0 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62 65 43  , regHit); VdbeC
2ded0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
2dee0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2def0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2df00 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70  .  for(i=0, pC=p
2df10 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69  AggInfo->aCol; i
2df20 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75  <pAggInfo->nAccu
2df30 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43  mulator; i++, pC
2df40 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
2df50 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
2df60 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e   pC->pExpr, pC->
2df70 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67  iMem);.  }.  pAg
2df80 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
2df90 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
2dfa0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2dfb0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64  Parse);.  if( ad
2dfc0 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20  drHitTest ){.   
2dfd0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2dfe0 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74 54  Here(v, addrHitT
2dff0 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  est);.  }.}../*.
2e000 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20  ** Add a single 
2e010 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
2e020 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44  uction to the VD
2e030 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20  BE to explain a 
2e040 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28  simple.** count(
2e050 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43  *) query ("SELEC
2e060 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2e070 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64  pTab")..*/.#ifnd
2e080 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
2e090 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f  XPLAIN.static vo
2e0a0 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  id explainSimple
2e0b0 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  Count(.  Parse *
2e0c0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2e0d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
2e0e0 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
2e0f0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
2e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e110 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75  * Table being qu
2e120 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  eried */.  Index
2e130 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
2e140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2e150 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69  dex used to opti
2e160 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55  mize scan, or NU
2e170 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  LL */.){.  if( p
2e180 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
2e190 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f  2 ){.    int bCo
2e1a0 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20 26  ver = (pIdx!=0 &
2e1b0 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62  & (HasRowid(pTab
2e1c0 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b  ) || !IsPrimaryK
2e1d0 65 79 49 6e 64 65 78 28 70 49 64 78 29 29 29 3b  eyIndex(pIdx)));
2e1e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2e1f0 45 78 70 6c 61 69 6e 28 70 50 61 72 73 65 2c 20  Explain(pParse, 
2e200 30 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25  0, "SCAN TABLE %
2e210 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s%s%s",.        
2e220 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
2e230 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22 20       bCover ? " 
2e240 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
2e250 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20  NDEX " : "",.   
2e260 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70 49       bCover ? pI
2e270 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20  dx->zName : "". 
2e280 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73     );.  }.}.#els
2e290 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  e.# define expla
2e2a0 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c  inSimpleCount(a,
2e2b0 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  b,c).#endif../*.
2e2c0 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  ** sqlite3WalkEx
2e2d0 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75 73  pr() callback us
2e2e0 65 64 20 62 79 20 68 61 76 69 6e 67 54 6f 57 68  ed by havingToWh
2e2f0 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ere()..**.** If 
2e300 74 68 65 20 6e 6f 64 65 20 70 61 73 73 65 64 20  the node passed 
2e310 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
2e320 69 73 20 61 20 54 4b 5f 41 4e 44 20 6e 6f 64 65  is a TK_AND node
2e330 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 57 52 43  , return .** WRC
2e340 5f 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 65 6c  _Continue to tel
2e350 6c 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70  l sqlite3WalkExp
2e360 72 28 29 20 74 6f 20 69 74 65 72 61 74 65 20 74  r() to iterate t
2e370 68 72 6f 75 67 68 20 63 68 69 6c 64 20 6e 6f 64  hrough child nod
2e380 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  es..**.** Otherw
2e390 69 73 65 2c 20 72 65 74 75 72 6e 20 57 52 43 5f  ise, return WRC_
2e3a0 50 72 75 6e 65 2e 20 49 6e 20 74 68 69 73 20 63  Prune. In this c
2e3b0 61 73 65 2c 20 61 6c 73 6f 20 63 68 65 63 6b 20  ase, also check 
2e3c0 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 65  if the .** sub-e
2e3d0 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65  xpression matche
2e3e0 73 20 74 68 65 20 63 72 69 74 65 72 69 61 20 66  s the criteria f
2e3f0 6f 72 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74  or being moved t
2e400 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 63  o the WHERE.** c
2e410 6c 61 75 73 65 2e 20 49 66 20 73 6f 2c 20 61 64  lause. If so, ad
2e420 64 20 69 74 20 74 6f 20 74 68 65 20 57 48 45 52  d it to the WHER
2e430 45 20 63 6c 61 75 73 65 20 61 6e 64 20 72 65 70  E clause and rep
2e440 6c 61 63 65 20 74 68 65 20 73 75 62 2d 65 78 70  lace the sub-exp
2e450 72 65 73 73 69 6f 6e 0a 2a 2a 20 77 69 74 68 69  ression.** withi
2e460 6e 20 74 68 65 20 48 41 56 49 4e 47 20 65 78 70  n the HAVING exp
2e470 72 65 73 73 69 6f 6e 20 77 69 74 68 20 61 20 63  ression with a c
2e480 6f 6e 73 74 61 6e 74 20 22 31 22 2e 0a 2a 2f 0a  onstant "1"..*/.
2e490 73 74 61 74 69 63 20 69 6e 74 20 68 61 76 69 6e  static int havin
2e4a0 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 28 57  gToWhereExprCb(W
2e4b0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2e4c0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2e4d0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
2e4e0 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 53 65 6c  K_AND ){.    Sel
2e4f0 65 63 74 20 2a 70 53 20 3d 20 70 57 61 6c 6b 65  ect *pS = pWalke
2e500 72 2d 3e 75 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->u.pSelect;.  
2e510 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2e520 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  rIsConstantOrGro
2e530 75 70 42 79 28 70 57 61 6c 6b 65 72 2d 3e 70 50  upBy(pWalker->pP
2e540 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53 2d  arse, pExpr, pS-
2e550 3e 70 47 72 6f 75 70 42 79 29 20 29 7b 0a 20 20  >pGroupBy) ){.  
2e560 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
2e570 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
2e580 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 45 78 70  e->db;.      Exp
2e590 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
2e5a0 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
2e5b0 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69  K_INTEGER, &sqli
2e5c0 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c  te3IntTokens[1],
2e5d0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
2e5e0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 45  New ){.        E
2e5f0 78 70 72 20 2a 70 57 68 65 72 65 20 3d 20 70 53  xpr *pWhere = pS
2e600 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20  ->pWhere;.      
2e610 20 20 53 57 41 50 28 45 78 70 72 2c 20 2a 70 4e    SWAP(Expr, *pN
2e620 65 77 2c 20 2a 70 45 78 70 72 29 3b 0a 20 20 20  ew, *pExpr);.   
2e630 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
2e640 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
2e650 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20  Where, pNew);.  
2e660 20 20 20 20 20 20 70 53 2d 3e 70 57 68 65 72 65        pS->pWhere
2e670 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
2e680 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
2e690 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
2e6a0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52   }.    return WR
2e6b0 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72  C_Prune;.  }.  r
2e6c0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2e6d0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61  ue;.}../*.** Tra
2e6e0 6e 73 66 65 72 20 65 6c 69 67 69 62 6c 65 20 74  nsfer eligible t
2e6f0 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 48 41  erms from the HA
2e700 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  VING clause of a
2e710 20 71 75 65 72 79 2c 20 77 68 69 63 68 20 69 73   query, which is
2e720 0a 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 61 66  .** processed af
2e730 74 65 72 20 67 72 6f 75 70 69 6e 67 2c 20 74 6f  ter grouping, to
2e740 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2e750 65 2c 20 77 68 69 63 68 20 69 73 20 70 72 6f 63  e, which is proc
2e760 65 73 73 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  essed before.** 
2e770 67 72 6f 75 70 69 6e 67 2e 20 46 6f 72 20 65 78  grouping. For ex
2e780 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72 79  ample, the query
2e790 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
2e7a0 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e   * FROM <tables>
2e7b0 20 57 48 45 52 45 20 61 3d 3f 20 47 52 4f 55 50   WHERE a=? GROUP
2e7c0 20 42 59 20 62 20 48 41 56 49 4e 47 20 62 3d 3f   BY b HAVING b=?
2e7d0 20 41 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63   AND c=?.**.** c
2e7e0 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20  an be rewritten 
2e7f0 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  as:.**.**   SELE
2e800 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65  CT * FROM <table
2e810 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44  s> WHERE a=? AND
2e820 20 62 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20   b=? GROUP BY b 
2e830 48 41 56 49 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a  HAVING c=?.**.**
2e840 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20 48   A term of the H
2e850 41 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  AVING expression
2e860 20 69 73 20 65 6c 69 67 69 62 6c 65 20 66 6f 72   is eligible for
2e870 20 74 72 61 6e 73 66 65 72 20 69 66 20 69 74 20   transfer if it 
2e880 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 65 6e 74 69  consists.** enti
2e890 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74  rely of constant
2e8a0 73 20 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e  s and expression
2e8b0 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20  s that are also 
2e8c0 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 74  GROUP BY terms t
2e8d0 68 61 74 0a 2a 2a 20 75 73 65 20 74 68 65 20 22  hat.** use the "
2e8e0 42 49 4e 41 52 59 22 20 63 6f 6c 6c 61 74 69 6f  BINARY" collatio
2e8f0 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  n sequence..*/.s
2e900 74 61 74 69 63 20 76 6f 69 64 20 68 61 76 69 6e  tatic void havin
2e910 67 54 6f 57 68 65 72 65 28 50 61 72 73 65 20 2a  gToWhere(Parse *
2e920 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2e930 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61  p){.  Walker sWa
2e940 6c 6b 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26  lker;.  memset(&
2e950 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65  sWalker, 0, size
2e960 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20 20  of(sWalker));.  
2e970 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d  sWalker.pParse =
2e980 20 70 50 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b   pParse;.  sWalk
2e990 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
2e9a0 20 3d 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65   = havingToWhere
2e9b0 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65  ExprCb;.  sWalke
2e9c0 72 2e 75 2e 70 53 65 6c 65 63 74 20 3d 20 70 3b  r.u.pSelect = p;
2e9d0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
2e9e0 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70 2d 3e  pr(&sWalker, p->
2e9f0 70 48 61 76 69 6e 67 29 3b 0a 23 69 66 20 53 45  pHaving);.#if SE
2ea00 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2ea10 44 0a 20 20 69 66 28 20 73 57 61 6c 6b 65 72 2e  D.  if( sWalker.
2ea20 65 43 6f 64 65 20 26 26 20 28 73 71 6c 69 74 65  eCode && (sqlite
2ea30 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
2ea40 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  x100)!=0 ){.    
2ea50 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
2ea60 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 4d 6f 76  0,pParse,p,("Mov
2ea70 65 20 48 41 56 49 4e 47 20 74 65 72 6d 73 20 69  e HAVING terms i
2ea80 6e 74 6f 20 57 48 45 52 45 3a 5c 6e 22 29 29 3b  nto WHERE:\n"));
2ea90 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
2eaa0 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
2eab0 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
2eac0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
2ead0 6f 20 73 65 65 20 69 66 20 74 68 65 20 70 54 68  o see if the pTh
2eae0 69 73 20 65 6e 74 72 79 20 6f 66 20 70 54 61 62  is entry of pTab
2eaf0 4c 69 73 74 20 69 73 20 61 20 73 65 6c 66 2d 6a  List is a self-j
2eb00 6f 69 6e 20 6f 66 20 61 20 70 72 69 6f 72 20 76  oin of a prior v
2eb10 69 65 77 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73  iew..** If it is
2eb20 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  , then return th
2eb30 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 66  e SrcList_item f
2eb40 6f 72 20 74 68 65 20 70 72 69 6f 72 20 76 69 65  or the prior vie
2eb50 77 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  w.  If it is not
2eb60 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e  ,.** then return
2eb70 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74   0..*/.static st
2eb80 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2eb90 6d 20 2a 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65  m *isSelfJoinVie
2eba0 77 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  w(.  SrcList *pT
2ebb0 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  abList,         
2ebc0 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
2ebd0 73 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20 74 68  self-joins in th
2ebe0 69 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  is FROM clause *
2ebf0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
2ec00 73 74 5f 69 74 65 6d 20 2a 70 54 68 69 73 20 20  st_item *pThis  
2ec10 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70   /* Search for p
2ec20 72 69 6f 72 20 72 65 66 65 72 65 6e 63 65 20 74  rior reference t
2ec30 6f 20 74 68 69 73 20 73 75 62 71 75 65 72 79 20  o this subquery 
2ec40 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
2ec50 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2ec60 65 6d 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 20  em;.  for(pItem 
2ec70 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70  = pTabList->a; p
2ec80 49 74 65 6d 3c 70 54 68 69 73 3b 20 70 49 74 65  Item<pThis; pIte
2ec90 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49  m++){.    if( pI
2eca0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  tem->pSelect==0 
2ecb0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2ecc0 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69  if( pItem->fg.vi
2ecd0 61 43 6f 72 6f 75 74 69 6e 65 20 29 20 63 6f 6e  aCoroutine ) con
2ece0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
2ecf0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  Item->zName==0 )
2ed00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2ed10 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
2ed20 6d 70 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  mp(pItem->zDatab
2ed30 61 73 65 2c 20 70 54 68 69 73 2d 3e 7a 44 61 74  ase, pThis->zDat
2ed40 61 62 61 73 65 29 21 3d 30 20 29 20 63 6f 6e 74  abase)!=0 ) cont
2ed50 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71  inue;.    if( sq
2ed60 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 49  lite3_stricmp(pI
2ed70 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 68 69  tem->zName, pThi
2ed80 73 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 20 63  s->zName)!=0 ) c
2ed90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2eda0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2edb0 61 72 65 28 30 2c 20 0a 20 20 20 20 20 20 20 20  are(0, .        
2edc0 20 20 70 54 68 69 73 2d 3e 70 53 65 6c 65 63 74    pThis->pSelect
2edd0 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d  ->pWhere, pItem-
2ede0 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65  >pSelect->pWhere
2edf0 2c 20 2d 31 29 20 0a 20 20 20 20 29 7b 0a 20 20  , -1) .    ){.  
2ee00 20 20 20 20 2f 2a 20 54 68 65 20 76 69 65 77 20      /* The view 
2ee10 77 61 73 20 6d 6f 64 69 66 69 65 64 20 62 79 20  was modified by 
2ee20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74 69 6d  some other optim
2ee30 69 7a 61 74 69 6f 6e 20 73 75 63 68 20 61 73 0a  ization such as.
2ee40 20 20 20 20 20 20 2a 2a 20 70 75 73 68 44 6f 77        ** pushDow
2ee50 6e 57 68 65 72 65 54 65 72 6d 73 28 29 20 2a 2f  nWhereTerms() */
2ee60 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
2ee70 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
2ee80 6e 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20 20 72  n pItem;.  }.  r
2ee90 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64  eturn 0;.}..#ifd
2eea0 65 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f  ef SQLITE_COUNTO
2eeb0 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49  FVIEW_OPTIMIZATI
2eec0 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  ON./*.** Attempt
2eed0 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20   to transform a 
2eee0 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72  query of the for
2eef0 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  m.**.**    SELEC
2ef00 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2ef10 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  (SELECT x FROM t
2ef20 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  1 UNION ALL SELE
2ef30 43 54 20 79 20 46 52 4f 4d 20 74 32 29 0a 2a 2a  CT y FROM t2).**
2ef40 0a 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a 0a 2a  .** Into this:.*
2ef50 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 28  *.**    SELECT (
2ef60 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
2ef70 46 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45 43 54  FROM t1)+(SELECT
2ef80 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
2ef90 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 72 61  2).**.** The tra
2efa0 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 6c 79  nsformation only
2efb0 20 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20 6f 66   works if all of
2efc0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
2efd0 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
2efe0 20 2a 20 20 54 68 65 20 73 75 62 71 75 65 72 79   *  The subquery
2eff0 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   is a UNION ALL 
2f000 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74  of two or more t
2f010 65 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65  erms.**   *  The
2f020 72 65 20 69 73 20 6e 6f 20 57 48 45 52 45 20 6f  re is no WHERE o
2f030 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41  r GROUP BY or HA
2f040 56 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 6e 20  VING clauses on 
2f050 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 2a  the subqueries.*
2f060 2a 20 20 20 2a 20 20 54 68 65 20 6f 75 74 65 72  *   *  The outer
2f070 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70   query is a simp
2f080 6c 65 20 63 6f 75 6e 74 28 2a 29 0a 2a 2a 0a 2a  le count(*).**.*
2f090 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
2f0a0 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
2f0b0 6e 20 69 73 20 75 6e 64 65 72 74 61 6b 65 6e 2e  n is undertaken.
2f0c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2f0d0 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d 69  ountOfViewOptimi
2f0e0 7a 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  zation(Parse *pP
2f0f0 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
2f100 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  {.  Select *pSub
2f110 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 45 78 70  , *pPrior;.  Exp
2f120 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72  r *pExpr;.  Expr
2f130 20 2a 70 43 6f 75 6e 74 3b 0a 20 20 73 71 6c 69   *pCount;.  sqli
2f140 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 28  te3 *db;.  if( (
2f150 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2f160 5f 41 67 67 72 65 67 61 74 65 29 3d 3d 30 20 29  _Aggregate)==0 )
2f170 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
2f180 54 68 69 73 20 69 73 20 61 6e 20 61 67 67 72 65  This is an aggre
2f190 67 61 74 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d  gate */.  if( p-
2f1a0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
2f1b0 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
2f1c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2f1d0 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c  ingle result col
2f1e0 75 6d 6e 20 2a 2f 0a 20 20 70 45 78 70 72 20 3d  umn */.  pExpr =
2f1f0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
2f200 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45  .pExpr;.  if( pE
2f210 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
2f220 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
2f230 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  n 0;        /* R
2f240 65 73 75 6c 74 20 69 73 20 61 6e 20 61 67 67 72  esult is an aggr
2f250 65 67 61 74 65 20 2a 2f 0a 20 20 69 66 28 20 73  egate */.  if( s
2f260 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70  qlite3_stricmp(p
2f270 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
2f280 63 6f 75 6e 74 22 29 20 29 20 72 65 74 75 72 6e  count") ) return
2f290 20 30 3b 20 20 2f 2a 20 49 73 20 63 6f 75 6e 74   0;  /* Is count
2f2a0 28 29 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  () */.  if( pExp
2f2b0 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 29 20  r->x.pList!=0 ) 
2f2c0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
2f2d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
2f2e0 74 20 62 65 20 63 6f 75 6e 74 28 2a 29 20 2a 2f  t be count(*) */
2f2f0 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 2d 3e  .  if( p->pSrc->
2f300 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e  nSrc!=1 ) return
2f310 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2f320 20 20 20 20 20 2f 2a 20 4f 6e 65 20 74 61 62 6c       /* One tabl
2f330 65 20 69 6e 20 46 52 4f 4d 20 20 2a 2f 0a 20 20  e in FROM  */.  
2f340 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pSub = p->pSrc->
2f350 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[0].pSelect;.  
2f360 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 72 65  if( pSub==0 ) re
2f370 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
2f380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f390 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 69 73    /* The FROM is
2f3a0 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20   a subquery */. 
2f3b0 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f   if( pSub->pPrio
2f3c0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
2f3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3e0 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 61 20     /* Must be a 
2f3f0 63 6f 6d 70 6f 75 6e 64 20 72 79 20 2a 2f 0a 20  compound ry */. 
2f400 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 53 75   do{.    if( pSu
2f410 62 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26  b->op!=TK_ALL &&
2f420 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 20   pSub->pPrior ) 
2f430 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 75  return 0;  /* Mu
2f440 73 74 20 62 65 20 55 4e 49 4f 4e 20 41 4c 4c 20  st be UNION ALL 
2f450 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
2f460 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
2f470 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2f480 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 57           /* No W
2f490 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2f4a0 20 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c     if( pSub->sel
2f4b0 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
2f4c0 67 61 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b  gate ) return 0;
2f4d0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6e 20 61       /* Not an a
2f4e0 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 20 20  ggregate */.    
2f4f0 70 53 75 62 20 3d 20 70 53 75 62 2d 3e 70 50 72  pSub = pSub->pPr
2f500 69 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ior;            
2f510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f520 20 20 2f 2a 20 52 65 70 65 61 74 20 6f 76 65 72    /* Repeat over
2f530 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 7d   compound */.  }
2f540 77 68 69 6c 65 28 20 70 53 75 62 20 29 3b 0a 0a  while( pSub );..
2f550 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
2f560 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 6e   this point then
2f570 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 70 65 72   it is OK to per
2f580 66 6f 72 6d 20 74 68 65 20 74 72 61 6e 73 66 6f  form the transfo
2f590 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62  rmation */..  db
2f5a0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
2f5b0 20 70 43 6f 75 6e 74 20 3d 20 70 45 78 70 72 3b   pCount = pExpr;
2f5c0 0a 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  .  pExpr = 0;.  
2f5d0 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pSub = p->pSrc->
2f5e0 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[0].pSelect;.  
2f5f0 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
2f600 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73 71 6c  elect = 0;.  sql
2f610 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
2f620 65 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a  e(db, p->pSrc);.
2f630 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69    p->pSrc = sqli
2f640 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
2f650 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
2f660 6f 66 28 2a 70 2d 3e 70 53 72 63 29 29 3b 0a 20  of(*p->pSrc));. 
2f670 20 77 68 69 6c 65 28 20 70 53 75 62 20 29 7b 0a   while( pSub ){.
2f680 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 3b      Expr *pTerm;
2f690 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 53  .    pPrior = pS
2f6a0 75 62 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  ub->pPrior;.    
2f6b0 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 3d 20 30  pSub->pPrior = 0
2f6c0 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4e 65 78  ;.    pSub->pNex
2f6d0 74 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d  t = 0;.    pSub-
2f6e0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
2f6f0 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 70  Aggregate;.    p
2f700 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d  Sub->selFlags &=
2f710 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20   ~SF_Compound;. 
2f720 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74     pSub->nSelect
2f730 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Row = 0;.    sql
2f740 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2f750 74 65 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c  te(db, pSub->pEL
2f760 69 73 74 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  ist);.    pTerm 
2f770 3d 20 70 50 72 69 6f 72 20 3f 20 73 71 6c 69 74  = pPrior ? sqlit
2f780 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 43  e3ExprDup(db, pC
2f790 6f 75 6e 74 2c 20 30 29 20 3a 20 70 43 6f 75 6e  ount, 0) : pCoun
2f7a0 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 45 4c  t;.    pSub->pEL
2f7b0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
2f7c0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
2f7d0 73 65 2c 20 30 2c 20 70 54 65 72 6d 29 3b 0a 20  se, 0, pTerm);. 
2f7e0 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74     pTerm = sqlit
2f7f0 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
2f800 54 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 29  TK_SELECT, 0, 0)
2f810 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 45 78  ;.    sqlite3PEx
2f820 70 72 41 64 64 53 65 6c 65 63 74 28 70 50 61 72  prAddSelect(pPar
2f830 73 65 2c 20 70 54 65 72 6d 2c 20 70 53 75 62 29  se, pTerm, pSub)
2f840 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 3d  ;.    if( pExpr=
2f850 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  =0 ){.      pExp
2f860 72 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d  r = pTerm;.    }
2f870 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70  else{.      pExp
2f880 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
2f890 28 70 50 61 72 73 65 2c 20 54 4b 5f 50 4c 55 53  (pParse, TK_PLUS
2f8a0 2c 20 70 54 65 72 6d 2c 20 70 45 78 70 72 29 3b  , pTerm, pExpr);
2f8b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 20  .    }.    pSub 
2f8c0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20  = pPrior;.  }.  
2f8d0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
2f8e0 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
2f8f0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
2f900 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 0a  ~SF_Aggregate;..
2f910 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
2f920 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
2f930 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
2f940 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
2f950 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30  SELECTTRACE(0x40
2f960 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
2f970 65 72 20 63 6f 75 6e 74 2d 6f 66 2d 76 69 65 77  er count-of-view
2f980 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 5c 6e   optimization:\n
2f990 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
2f9a0 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
2f9b0 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
2f9c0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  dif.  return 1;.
2f9d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2f9e0 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f  TE_COUNTOFVIEW_O
2f9f0 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
2fa00 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
2fa10 69 6e 64 6f 77 52 65 77 72 69 74 65 20 57 69 6e  indowRewrite Win
2fa20 64 6f 77 52 65 77 72 69 74 65 3b 0a 73 74 72 75  dowRewrite;.stru
2fa30 63 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ct WindowRewrite
2fa40 20 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69   {.  Window *pWi
2fa50 6e 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  n;.  ExprList *p
2fa60 53 75 62 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  Sub;.};..static 
2fa70 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f 77  int selectWindow
2fa80 52 65 77 72 69 74 65 53 65 6c 65 63 74 43 62 28  RewriteSelectCb(
2fa90 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2faa0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
2fab0 29 7b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  ){.  return WRC_
2fac0 50 72 75 6e 65 3b 0a 7d 0a 0a 73 74 61 74 69 63  Prune;.}..static
2fad0 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f   int selectWindo
2fae0 77 52 65 77 72 69 74 65 45 78 70 72 43 62 28 57  wRewriteExprCb(W
2faf0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2fb00 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2fb10 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65 77  struct WindowRew
2fb20 72 69 74 65 20 2a 70 20 3d 20 70 57 61 6c 6b 65  rite *p = pWalke
2fb30 72 2d 3e 75 2e 70 52 65 77 72 69 74 65 3b 0a 20  r->u.pRewrite;. 
2fb40 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
2fb50 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
2fb60 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 57 52 43  ;.  int rc = WRC
2fb70 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 73 77  _Continue;..  sw
2fb80 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
2fb90 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  ){.    case TK_C
2fba0 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 45  OLUMN: {.      E
2fbb0 78 70 72 20 2a 70 44 75 70 20 3d 20 73 71 6c 69  xpr *pDup = sqli
2fbc0 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73  te3ExprDup(pPars
2fbd0 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30 29  e->db, pExpr, 0)
2fbe0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 53 75 62 20  ;.      p->pSub 
2fbf0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
2fc00 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
2fc10 70 2d 3e 70 53 75 62 2c 20 70 44 75 70 29 3b 0a  p->pSub, pDup);.
2fc20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 53 75        if( p->pSu
2fc30 62 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  b ){.        ass
2fc40 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
2fc50 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53  erty(pExpr, EP_S
2fc60 74 61 74 69 63 29 3d 3d 30 20 29 3b 0a 20 20 20  tatic)==0 );.   
2fc70 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70       ExprSetProp
2fc80 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53  erty(pExpr, EP_S
2fc90 74 61 74 69 63 29 3b 0a 20 20 20 20 20 20 20 20  tatic);.        
2fca0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
2fcb0 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45  e(pParse->db, pE
2fcc0 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 45 78  xpr);.        Ex
2fcd0 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  prClearProperty(
2fce0 70 45 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63  pExpr, EP_Static
2fcf0 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  );.        memse
2fd00 74 28 70 45 78 70 72 2c 20 30 2c 20 73 69 7a 65  t(pExpr, 0, size
2fd10 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20 20 20 20  of(Expr));..    
2fd20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
2fd30 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
2fd40 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
2fd50 6e 20 3d 20 70 2d 3e 70 53 75 62 2d 3e 6e 45 78  n = p->pSub->nEx
2fd60 70 72 2d 31 3b 0a 20 20 20 20 20 20 20 20 70 45  pr-1;.        pE
2fd70 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 2d  xpr->iTable = p-
2fd80 3e 70 57 69 6e 2d 3e 69 45 70 68 43 73 72 3b 0a  >pWin->iEphCsr;.
2fd90 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 62        }..      b
2fda0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
2fdb0 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
2fdc0 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  N:.      if( pEx
2fdd0 70 72 2d 3e 70 57 69 6e 20 29 7b 0a 20 20 20 20  pr->pWin ){.    
2fde0 20 20 20 20 72 63 20 3d 20 57 52 43 5f 50 72 75      rc = WRC_Pru
2fdf0 6e 65 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  ne;.        pExp
2fe00 72 2d 3e 70 57 69 6e 2d 3e 70 4f 77 6e 65 72 20  r->pWin->pOwner 
2fe10 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 7d  = pExpr;.      }
2fe20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
2fe30 20 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20 6e     default: /* n
2fe40 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62 72  o-op */.      br
2fe50 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  eak;.  }..  retu
2fe60 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
2fe70 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f   int selectWindo
2fe80 77 52 65 77 72 69 74 65 45 4c 69 73 74 28 0a 20  wRewriteEList(. 
2fe90 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2fea0 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 2c  .  Window *pWin,
2feb0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
2fec0 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ist,            
2fed0 20 20 20 2f 2a 20 52 65 77 72 69 74 65 20 65 78     /* Rewrite ex
2fee0 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 69  pressions in thi
2fef0 73 20 6c 69 73 74 20 2a 2f 0a 20 20 45 78 70 72  s list */.  Expr
2ff00 4c 69 73 74 20 2a 2a 70 70 53 75 62 20 20 20 20  List **ppSub    
2ff10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2ff20 4e 2f 4f 55 54 3a 20 53 75 62 2d 73 65 6c 65 63  N/OUT: Sub-selec
2ff30 74 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73  t expression-lis
2ff40 74 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72  t */.){.  Walker
2ff50 20 73 57 61 6c 6b 65 72 3b 0a 20 20 57 69 6e 64   sWalker;.  Wind
2ff60 6f 77 52 65 77 72 69 74 65 20 73 52 65 77 72 69  owRewrite sRewri
2ff70 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  te;.  int rc;.. 
2ff80 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b 65 72   memset(&sWalker
2ff90 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 61 6c 6b  , 0, sizeof(Walk
2ffa0 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  er));.  memset(&
2ffb0 73 52 65 77 72 69 74 65 2c 20 30 2c 20 73 69 7a  sRewrite, 0, siz
2ffc0 65 6f 66 28 57 69 6e 64 6f 77 52 65 77 72 69 74  eof(WindowRewrit
2ffd0 65 29 29 3b 0a 0a 20 20 73 52 65 77 72 69 74 65  e));..  sRewrite
2ffe0 2e 70 53 75 62 20 3d 20 2a 70 70 53 75 62 3b 0a  .pSub = *ppSub;.
2fff0 20 20 73 52 65 77 72 69 74 65 2e 70 57 69 6e 20    sRewrite.pWin 
30000 3d 20 70 57 69 6e 3b 0a 0a 20 20 73 57 61 6c 6b  = pWin;..  sWalk
30010 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  er.pParse = pPar
30020 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45  se;.  sWalker.xE
30030 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  xprCallback = se
30040 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74  lectWindowRewrit
30050 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b  eExprCb;.  sWalk
30060 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  er.xSelectCallba
30070 63 6b 20 3d 20 73 65 6c 65 63 74 57 69 6e 64 6f  ck = selectWindo
30080 77 52 65 77 72 69 74 65 53 65 6c 65 63 74 43 62  wRewriteSelectCb
30090 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70 52  ;.  sWalker.u.pR
300a0 65 77 72 69 74 65 20 3d 20 26 73 52 65 77 72 69  ewrite = &sRewri
300b0 74 65 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  te;..  rc = sqli
300c0 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28  te3WalkExprList(
300d0 26 73 57 61 6c 6b 65 72 2c 20 70 45 4c 69 73 74  &sWalker, pEList
300e0 29 3b 0a 0a 20 20 2a 70 70 53 75 62 20 3d 20 73  );..  *ppSub = s
300f0 52 65 77 72 69 74 65 2e 70 53 75 62 3b 0a 20 20  Rewrite.pSub;.  
30100 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
30110 61 74 69 63 20 45 78 70 72 4c 69 73 74 20 2a 65  atic ExprList *e
30120 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73  xprListAppendLis
30130 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
30140 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
30150 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
30160 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
30170 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  List,        /* 
30180 4c 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f  List to which to
30190 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62   append. Might b
301a0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
301b0 4c 69 73 74 20 2a 70 41 70 70 65 6e 64 20 20 20  List *pAppend   
301c0 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 76      /* List of v
301d0 61 6c 75 65 73 20 74 6f 20 61 70 70 65 6e 64 2e  alues to append.
301e0 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
301f0 2f 0a 29 7b 0a 20 20 69 66 28 20 70 41 70 70 65  /.){.  if( pAppe
30200 6e 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  nd ){.    int i;
30210 0a 20 20 20 20 69 6e 74 20 6e 49 6e 69 74 20 3d  .    int nInit =
30220 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e   pList ? pList->
30230 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 66  nExpr : 0;.    f
30240 6f 72 28 69 3d 30 3b 20 69 3c 70 41 70 70 65 6e  or(i=0; i<pAppen
30250 64 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  d->nExpr; i++){.
30260 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70        Expr *pDup
30270 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
30280 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 41  p(pParse->db, pA
30290 70 70 65 6e 64 2d 3e 61 5b 69 5d 2e 70 45 78 70  ppend->a[i].pExp
302a0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4c 69  r, 0);.      pLi
302b0 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
302c0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
302d0 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70 29 3b  e, pList, pDup);
302e0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
302f0 20 29 20 70 4c 69 73 74 2d 3e 61 5b 6e 49 6e 69   ) pList->a[nIni
30300 74 2b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  t+i].sortOrder =
30310 20 70 41 70 70 65 6e 64 2d 3e 61 5b 69 5d 2e 73   pAppend->a[i].s
30320 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a  ortOrder;.    }.
30330 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69    }.  return pLi
30340 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  st;.}../*.** If 
30350 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
30360 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74  ment passed as t
30370 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
30380 6e 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 76 6f  nt does not invo
30390 6b 65 0a 2a 2a 20 61 6e 79 20 53 51 4c 20 77 69  ke.** any SQL wi
303a0 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 2c 20  ndow functions, 
303b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
303c0 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
303d0 69 73 65 2c 20 69 74 20 0a 2a 2a 20 72 65 77 72  ise, it .** rewr
303e0 69 74 65 73 20 74 68 65 20 53 45 4c 45 43 54 20  ites the SELECT 
303f0 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61  statement so tha
30400 74 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f  t window functio
30410 6e 20 78 53 74 65 70 20 66 75 6e 63 74 69 6f 6e  n xStep function
30420 73 0a 2a 2a 20 61 72 65 20 69 6e 76 6f 6b 65 64  s.** are invoked
30430 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
30440 6f 72 64 65 72 2e 20 54 68 65 20 73 69 6d 70 6c  order. The simpl
30450 65 73 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  est version of t
30460 68 65 20 0a 2a 2a 20 74 72 61 6e 73 66 6f 72 6d  he .** transform
30470 61 74 69 6f 6e 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ation is:.**.** 
30480 20 20 53 45 4c 45 43 54 20 77 69 6e 28 61 72 67    SELECT win(arg
30490 73 2e 2e 2e 29 20 4f 56 45 52 20 28 3c 6c 69 73  s...) OVER (<lis
304a0 74 31 3e 29 20 46 52 4f 4d 20 3c 73 72 63 3e 20  t1>) FROM <src> 
304b0 4f 52 44 45 52 20 42 59 20 3c 6c 69 73 74 32 3e  ORDER BY <list2>
304c0 0a 2a 2a 0a 2a 2a 20 74 6f 0a 2a 2a 0a 2a 2a 20  .**.** to.**.** 
304d0 20 20 53 45 4c 45 43 54 20 77 69 6e 28 61 72 67    SELECT win(arg
304e0 73 2e 2e 2e 29 20 46 52 4f 4d 20 28 0a 2a 2a 20  s...) FROM (.** 
304f0 20 20 20 20 53 45 4c 45 43 54 20 61 72 67 73 2e      SELECT args.
30500 2e 2e 20 46 52 4f 4d 20 3c 73 72 63 3e 20 4f 52  .. FROM <src> OR
30510 44 45 52 20 42 59 20 3c 6c 69 73 74 31 3e 0a 2a  DER BY <list1>.*
30520 2a 20 20 20 29 20 4f 52 44 45 52 20 42 59 20 3c  *   ) ORDER BY <
30530 6c 69 73 74 32 3e 0a 2a 2a 0a 2a 2a 20 77 68 65  list2>.**.** whe
30540 72 65 20 3c 73 72 63 3e 20 6d 61 79 20 63 6f 6e  re <src> may con
30550 74 61 69 6e 20 57 48 45 52 45 2c 20 47 52 4f 55  tain WHERE, GROU
30560 50 20 42 59 20 61 6e 64 20 48 41 56 49 4e 47 20  P BY and HAVING 
30570 63 6c 61 75 73 65 73 2c 20 61 6e 64 20 3c 6c 69  clauses, and <li
30580 73 74 31 3e 0a 2a 2a 20 69 73 20 74 68 65 20 63  st1>.** is the c
30590 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20  oncatenation of 
305a0 74 68 65 20 50 41 52 54 49 54 49 4f 4e 20 42 59  the PARTITION BY
305b0 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 63 6c   and ORDER BY cl
305c0 61 75 73 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20  auses in the.** 
305d0 4f 56 45 52 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  OVER clause..**.
305e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
305f0 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74  lectWindowRewrit
30600 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
30610 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
30620 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
30630 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 6e  K;.  if( p->pWin
30640 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
30650 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
30660 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 6e  (pParse);.    in
30670 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t i;.    sqlite3
30680 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
30690 62 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  b;.    Select *p
306a0 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
306b0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71       /* The subq
306c0 75 65 72 79 20 2a 2f 0a 20 20 20 20 53 72 63 4c  uery */.    SrcL
306d0 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70  ist *pSrc = p->p
306e0 53 72 63 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  Src;.    Expr *p
306f0 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72  Where = p->pWher
30700 65 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  e;.    ExprList 
30710 2a 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70  *pGroupBy = p->p
30720 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 45 78 70  GroupBy;.    Exp
30730 72 20 2a 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  r *pHaving = p->
30740 70 48 61 76 69 6e 67 3b 0a 20 20 20 20 45 78 70  pHaving;.    Exp
30750 72 4c 69 73 74 20 2a 70 53 6f 72 74 20 3d 20 30  rList *pSort = 0
30760 3b 0a 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ;..    ExprList 
30770 2a 70 53 75 62 6c 69 73 74 20 3d 20 30 3b 20 20  *pSublist = 0;  
30780 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
30790 6f 6e 20 6c 69 73 74 20 66 6f 72 20 73 75 62 2d  on list for sub-
307a0 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 57 69 6e  query */.    Win
307b0 64 6f 77 20 2a 70 57 69 6e 20 3d 20 70 2d 3e 70  dow *pWin = p->p
307c0 57 69 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 4f 44  Win;..    /* TOD
307d0 4f 3a 20 54 68 69 73 20 69 73 20 6f 66 20 63 6f  O: This is of co
307e0 75 72 73 65 20 74 65 6d 70 6f 72 61 72 79 20 72  urse temporary r
307f0 65 71 75 69 72 65 6d 65 6e 74 73 20 2a 2f 0a 20  equirements */. 
30800 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 2d     assert( pWin-
30810 3e 70 4e 65 78 74 57 69 6e 3d 3d 30 20 29 3b 0a  >pNextWin==0 );.
30820 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30  .    p->pSrc = 0
30830 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  ;.    p->pWhere 
30840 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f  = 0;.    p->pGro
30850 75 70 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  upBy = 0;.    p-
30860 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 0a 20  >pHaving = 0;.. 
30870 20 20 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75     pWin->regAccu
30880 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
30890 65 6d 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 72 65  em;.    pWin->re
308a0 67 52 65 73 75 6c 74 20 3d 20 2b 2b 70 50 61 72  gResult = ++pPar
308b0 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 2f  se->nMem;..    /
308c0 2a 20 41 73 73 69 67 6e 20 61 20 63 75 72 73 6f  * Assign a curso
308d0 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
308e0 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
308f0 20 75 73 65 64 20 74 6f 20 62 75 66 66 65 72 20   used to buffer 
30900 72 6f 77 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65  rows..    ** The
30910 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69   OpenEphemeral i
30920 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 63 6f  nstruction is co
30930 64 65 64 20 6c 61 74 65 72 2c 20 61 66 74 65 72  ded later, after
30940 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 68 6f 77   it is known how
30950 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20 63 6f 6c  .    ** many col
30960 75 6d 6e 73 20 74 68 65 20 74 61 62 6c 65 20 77  umns the table w
30970 69 6c 6c 20 68 61 76 65 2e 20 20 2a 2f 0a 20 20  ill have.  */.  
30980 20 20 70 57 69 6e 2d 3e 69 45 70 68 43 73 72 20    pWin->iEphCsr 
30990 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
309a0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 65 6c 65  ;..    rc = sele
309b0 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45  ctWindowRewriteE
309c0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 57 69  List(pParse, pWi
309d0 6e 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70  n, p->pEList, &p
309e0 53 75 62 6c 69 73 74 29 3b 0a 20 20 20 20 69 66  Sublist);.    if
309f0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
30a00 3b 0a 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63  ;.    rc = selec
30a10 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65 45 4c  tWindowRewriteEL
30a20 69 73 74 28 70 50 61 72 73 65 2c 20 70 57 69 6e  ist(pParse, pWin
30a30 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 26  , p->pOrderBy, &
30a40 70 53 75 62 6c 69 73 74 29 3b 0a 20 20 20 20 69  pSublist);.    i
30a50 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
30a60 63 3b 0a 20 20 20 20 70 57 69 6e 2d 3e 6e 42 75  c;.    pWin->nBu
30a70 66 66 65 72 43 6f 6c 20 3d 20 28 70 53 75 62 6c  fferCol = (pSubl
30a80 69 73 74 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e  ist ? pSublist->
30a90 6e 45 78 70 72 20 3a 20 30 29 3b 0a 0a 20 20 20  nExpr : 0);..   
30aa0 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 4f   /* Create the O
30ab0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
30ac0 6f 72 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  or the sub-selec
30ad0 74 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 63  t. This is the c
30ae0 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 0a 20 20 20  oncatenation.   
30af0 20 2a 2a 20 6f 66 20 74 68 65 20 77 69 6e 64 6f   ** of the windo
30b00 77 20 50 41 52 54 49 54 49 4f 4e 20 61 6e 64 20  w PARTITION and 
30b10 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
30b20 2e 20 41 70 70 65 6e 64 20 74 68 65 20 73 61 6d  . Append the sam
30b30 65 20 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73  e .    ** expres
30b40 73 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 75 62  sions to the sub
30b50 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69  -select expressi
30b60 6f 6e 20 6c 69 73 74 2e 20 54 68 65 79 20 61 72  on list. They ar
30b70 65 20 72 65 71 75 69 72 65 64 20 74 6f 0a 20 20  e required to.  
30b80 20 20 2a 2a 20 66 69 67 75 72 65 20 6f 75 74 20    ** figure out 
30b90 77 68 65 72 65 20 62 6f 75 6e 64 61 72 69 65 73  where boundaries
30ba0 20 66 6f 72 20 70 61 72 74 69 74 69 6f 6e 73 20   for partitions 
30bb0 61 6e 64 20 73 65 74 73 20 6f 66 20 70 65 65 72  and sets of peer
30bc0 20 72 6f 77 73 2e 20 20 2a 2f 0a 20 20 20 20 70   rows.  */.    p
30bd0 53 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Sort = sqlite3Ex
30be0 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 57  prListDup(db, pW
30bf0 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20  in->pPartition, 
30c00 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57 69 6e  0);.    if( pWin
30c10 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
30c20 20 20 20 20 70 53 6f 72 74 20 3d 20 65 78 70 72      pSort = expr
30c30 4c 69 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70  ListAppendList(p
30c40 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 57  Parse, pSort, pW
30c50 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20  in->pOrderBy);. 
30c60 20 20 20 7d 0a 20 20 20 20 70 53 75 62 6c 69 73     }.    pSublis
30c70 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65  t = exprListAppe
30c80 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  ndList(pParse, p
30c90 53 75 62 6c 69 73 74 2c 20 70 53 6f 72 74 29 3b  Sublist, pSort);
30ca0 0a 0a 20 20 20 20 2f 2a 20 41 6c 73 6f 20 61 70  ..    /* Also ap
30cb0 70 65 6e 64 20 74 68 65 20 61 72 67 75 6d 65 6e  pend the argumen
30cc0 74 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  ts passed to the
30cd0 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
30ce0 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 73   to the.    ** s
30cf0 75 62 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73  ub-select expres
30d00 73 69 6f 6e 20 6c 69 73 74 2e 20 2a 2f 0a 20 20  sion list. */.  
30d10 20 20 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 20    pWin->iArgCol 
30d20 3d 20 28 70 53 75 62 6c 69 73 74 20 3f 20 70 53  = (pSublist ? pS
30d30 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  ublist->nExpr : 
30d40 30 29 3b 0a 20 20 20 20 70 53 75 62 6c 69 73 74  0);.    pSublist
30d50 20 3d 20 65 78 70 72 4c 69 73 74 41 70 70 65 6e   = exprListAppen
30d60 64 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  dList(pParse, pS
30d70 75 62 6c 69 73 74 2c 20 70 57 69 6e 2d 3e 70 4f  ublist, pWin->pO
30d80 77 6e 65 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  wner->x.pList);.
30d90 0a 20 20 20 20 70 53 75 62 20 3d 20 73 71 6c 69  .    pSub = sqli
30da0 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20 20  te3SelectNew(.  
30db0 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 53        pParse, pS
30dc0 75 62 6c 69 73 74 2c 20 70 53 72 63 2c 20 70 57  ublist, pSrc, pW
30dd0 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  here, pGroupBy, 
30de0 70 48 61 76 69 6e 67 2c 20 70 53 6f 72 74 2c 20  pHaving, pSort, 
30df0 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 20 20  0, 0.    );.    
30e00 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  p->pSrc = sqlite
30e10 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64  3SrcListAppend(d
30e20 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  b, 0, 0, 0);.   
30e30 20 69 66 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a   if( p->pSrc ){.
30e40 20 20 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a        int iTab;.
30e50 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
30e60 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  pList = 0;.     
30e70 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
30e80 53 65 6c 65 63 74 20 3d 20 70 53 75 62 3b 0a 20  Select = pSub;. 
30e90 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
30ea0 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
30eb0 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 72 63  (pParse, p->pSrc
30ec0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 6c  );.      if( sel
30ed0 65 63 74 45 78 70 61 6e 64 53 75 62 71 75 65 72  ectExpandSubquer
30ee0 79 28 70 50 61 72 73 65 2c 20 26 70 2d 3e 70 53  y(pParse, &p->pS
30ef0 72 63 2d 3e 61 5b 30 5d 29 20 29 7b 0a 20 20 20  rc->a[0]) ){.   
30f00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30f10 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
30f20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53 75  lse{.        pSu
30f30 62 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  b->selFlags |= S
30f40 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 20 20  F_Expanded;.    
30f50 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20 53    }.    }..#if S
30f60 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
30f70 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ED.    if( sqlit
30f80 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
30f90 30 78 31 30 38 20 29 7b 0a 20 20 20 20 20 20 53  0x108 ){.      S
30fa0 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 34  ELECTTRACE(0x104
30fb0 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74  ,pParse,p, ("aft
30fc0 65 72 20 77 69 6e 64 6f 77 20 72 65 77 72 69 74  er window rewrit
30fd0 65 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 73  e:\n"));.      s
30fe0 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
30ff0 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
31000 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
31010 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
31020 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
31030 65 6d 65 72 61 6c 2c 20 70 57 69 6e 2d 3e 69 45  emeral, pWin->iE
31040 70 68 43 73 72 2c 20 70 57 69 6e 2d 3e 6e 42 75  phCsr, pWin->nBu
31050 66 66 65 72 43 6f 6c 29 3b 0a 20 20 20 20 73 71  fferCol);.    sq
31060 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
31070 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
31080 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a  Win->regAccum);.
31090 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
310a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
310b0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
310c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
310d0 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70  t given in the p
310e0 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a   argument.  .**.
310f0 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  ** The results a
31100 72 65 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f  re returned acco
31110 72 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c  rding to the Sel
31120 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
31130 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  e..** See commen
31140 74 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ts in sqliteInt.
31150 68 20 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e  h for further in
31160 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
31170 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
31180 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
31190 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
311a0 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a  any errors are.*
311b0 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  * encountered, t
311c0 68 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61  hen an appropria
311d0 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
311e0 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70   is left in.** p
311f0 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
31200 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
31210 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65  ne does NOT free
31220 20 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75   the Select stru
31230 63 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e  cture passed in.
31240 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
31250 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20   function needs 
31260 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69  to do that..*/.i
31270 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
31280 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
31290 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
312a0 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
312b0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
312c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
312d0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
312e0 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
312f0 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  . */.  SelectDes
31300 74 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a  t *pDest      /*
31310 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
31320 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
31330 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
31340 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
31350 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
31360 72 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66  rs */.  WhereInf
31370 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f  o *pWInfo;     /
31380 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71  * Return from sq
31390 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
313a0 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  ) */.  Vdbe *v; 
313b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
313c0 20 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   The virtual mac
313d0 68 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  hine under const
313e0 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ruction */.  int
313f0 20 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20   isAgg;         
31400 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
31410 73 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b  select lists lik
31420 65 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a  e "count(*)" */.
31430 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
31440 73 74 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74  st = 0;  /* List
31450 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65   of columns to e
31460 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63  xtract. */.  Src
31470 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20  List *pTabList; 
31480 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74      /* List of t
31490 61 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20  ables to select 
314a0 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a  from */.  Expr *
314b0 70 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20  pWhere;         
314c0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
314d0 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
314e0 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
314f0 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f   *pGroupBy;    /
31500 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63  * The GROUP BY c
31510 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
31520 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
31530 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20  Having;         
31540 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c  /* The HAVING cl
31550 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
31560 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  LL */.  int rc =
31570 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
31580 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
31590 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
315a0 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e  tion */.  Distin
315b0 63 74 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b  ctCtx sDistinct;
315c0 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20   /* Info on how 
315d0 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53 54  to code the DIST
315e0 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a  INCT keyword */.
315f0 20 20 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b    SortCtx sSort;
31600 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
31610 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20   on how to code 
31620 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
31630 75 73 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f  use */.  AggInfo
31640 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20   sAggInfo;      
31650 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  /* Information u
31660 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65  sed by aggregate
31670 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e   queries */.  in
31680 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t iEnd;         
31690 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
316a0 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  of the end of th
316b0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  e query */.  sql
316c0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
316d0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
316e0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
316f0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d  /.  ExprList *pM
31700 69 6e 4d 61 78 4f 72 64 65 72 42 79 20 3d 20 30  inMaxOrderBy = 0
31710 3b 20 20 2f 2a 20 41 64 64 65 64 20 4f 52 44 45  ;  /* Added ORDE
31720 52 20 42 59 20 66 6f 72 20 6d 69 6e 2f 6d 61 78  R BY for min/max
31730 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 75 38   queries */.  u8
31740 20 6d 69 6e 4d 61 78 46 6c 61 67 3b 20 20 20 20   minMaxFlag;    
31750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31760 46 6c 61 67 20 66 6f 72 20 6d 69 6e 2f 6d 61 78  Flag for min/max
31770 20 71 75 65 72 69 65 73 20 2a 2f 0a 0a 20 20 64   queries */..  d
31780 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
31790 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
317a0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
317b0 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  if( p==0 || db->
317c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
317d0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
317e0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
317f0 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  }.  if( sqlite3A
31800 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
31810 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20   SQLITE_SELECT, 
31820 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72  0, 0, 0) ) retur
31830 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  n 1;.  memset(&s
31840 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  AggInfo, 0, size
31850 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23  of(sAggInfo));.#
31860 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
31870 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45 43 54 54  NABLED.  SELECTT
31880 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c  RACE(1,pParse,p,
31890 20 28 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73   ("begin process
318a0 69 6e 67 3a 5c 6e 22 2c 20 70 50 61 72 73 65 2d  ing:\n", pParse-
318b0 3e 61 64 64 72 45 78 70 6c 61 69 6e 29 29 3b 0a  >addrExplain));.
318c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c    if( sqlite3Sel
318d0 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30  ectTrace & 0x100
318e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54   ){.    sqlite3T
318f0 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
31900 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
31910 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  if..  assert( p-
31920 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
31930 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
31940 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20  T_DistFifo );.  
31950 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
31960 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d  rBy==0 || pDest-
31970 3e 65 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f  >eDest!=SRT_Fifo
31980 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
31990 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
319a0 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
319b0 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20  T_DistQueue );. 
319c0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
319d0 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74  erBy==0 || pDest
319e0 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65  ->eDest!=SRT_Que
319f0 75 65 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f  ue );.  if( Igno
31a00 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
31a10 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  st) ){.    asser
31a20 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  t(pDest->eDest==
31a30 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44  SRT_Exists || pD
31a40 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
31a50 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20  Union || .      
31a60 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
31a70 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c  t==SRT_Except ||
31a80 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
31a90 52 54 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20  RT_Discard ||.  
31aa0 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
31ab0 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65  eDest==SRT_Queue
31ac0 20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73    || pDest->eDes
31ad0 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
31ae0 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  ||.           pD
31af0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
31b00 44 69 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65  DistQueue || pDe
31b10 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46  st->eDest==SRT_F
31b20 69 66 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ifo);.    /* If 
31b30 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e  ORDER BY makes n
31b40 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  o difference in 
31b50 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20  the output then 
31b60 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20  neither does.   
31b70 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20   ** DISTINCT so 
31b80 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  it can be remove
31b90 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71  d too. */.    sq
31ba0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
31bb0 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
31bc0 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rBy);.    p->pOr
31bd0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
31be0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
31bf0 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  F_Distinct;.  }.
31c00 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
31c10 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30  rep(pParse, p, 0
31c20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f  );.  memset(&sSo
31c30 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  rt, 0, sizeof(sS
31c40 6f 72 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70  ort));.  sSort.p
31c50 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
31c60 64 65 72 42 79 3b 0a 20 20 69 66 28 20 70 50 61  derBy;.  if( pPa
31c70 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
31c80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
31c90 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
31ca0 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _end;.  }.  asse
31cb0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30  rt( p->pEList!=0
31cc0 20 29 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70   );.  isAgg = (p
31cd0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
31ce0 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 23  Aggregate)!=0;.#
31cf0 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
31d00 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
31d10 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
31d20 26 20 30 78 31 30 34 20 29 7b 0a 20 20 20 20 53  & 0x104 ){.    S
31d30 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 34  ELECTTRACE(0x104
31d40 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74  ,pParse,p, ("aft
31d50 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  er name resoluti
31d60 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  on:\n"));.    sq
31d70 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
31d80 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
31d90 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
31da0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
31db0 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
31dc0 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
31dd0 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  mes(pParse, p);.
31de0 20 20 7d 0a 0a 20 20 69 66 28 20 28 72 63 20 3d    }..  if( (rc =
31df0 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
31e00 72 69 74 65 28 70 50 61 72 73 65 2c 20 70 29 29  rite(pParse, p))
31e10 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
31e20 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70  ect_end;.  }.  p
31e30 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
31e40 63 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  c;..  /* Try to 
31e50 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61  various optimiza
31e60 74 69 6f 6e 73 20 28 66 6c 61 74 74 65 6e 69 6e  tions (flattenin
31e70 67 20 73 75 62 71 75 65 72 69 65 73 2c 20 61 6e  g subqueries, an
31e80 64 20 73 74 72 65 6e 67 74 68 0a 20 20 2a 2a 20  d strength.  ** 
31e90 72 65 64 75 63 74 69 6f 6e 20 6f 66 20 6a 6f 69  reduction of joi
31ea0 6e 20 6f 70 65 72 61 74 6f 72 73 29 20 69 6e 20  n operators) in 
31eb0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
31ec0 75 70 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  up into the main
31ed0 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66 20   query.  */.#if 
31ee0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
31ef0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
31f00 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
31f10 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66  E_OMIT_VIEW).  f
31f20 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69  or(i=0; !p->pPri
31f30 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74  or && i<pTabList
31f40 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
31f50 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
31f60 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
31f70 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a  pTabList->a[i];.
31f80 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
31f90 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63   = pItem->pSelec
31fa0 74 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  t;.    Table *pT
31fb0 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
31fc0 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72  ;..    /* Conver
31fd0 74 20 4c 45 46 54 20 4a 4f 49 4e 20 69 6e 74 6f  t LEFT JOIN into
31fe0 20 4a 4f 49 4e 20 69 66 20 74 68 65 72 65 20 61   JOIN if there a
31ff0 72 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  re terms of the 
32000 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20 20 20  right table.    
32010 2a 2a 20 6f 66 20 74 68 65 20 4c 45 46 54 20 4a  ** of the LEFT J
32020 4f 49 4e 20 75 73 65 64 20 69 6e 20 74 68 65 20  OIN used in the 
32030 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20  WHERE clause..  
32040 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49    */.    if( (pI
32050 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
32060 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20   & JT_LEFT)!=0. 
32070 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78      && sqlite3Ex
32080 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c  prImpliesNonNull
32090 52 6f 77 28 70 2d 3e 70 57 68 65 72 65 2c 20 70  Row(p->pWhere, p
320a0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20  Item->iCursor). 
320b0 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
320c0 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
320d0 51 4c 49 54 45 5f 53 69 6d 70 6c 69 66 79 4a 6f  QLITE_SimplifyJo
320e0 69 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  in).    ){.     
320f0 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
32100 30 30 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20  00,pParse,p,.   
32110 20 20 20 20 20 20 20 20 20 20 20 20 20 28 22 4c               ("L
32120 45 46 54 2d 4a 4f 49 4e 20 73 69 6d 70 6c 69 66  EFT-JOIN simplif
32130 69 65 73 20 74 6f 20 4a 4f 49 4e 20 6f 6e 20 74  ies to JOIN on t
32140 65 72 6d 20 25 64 5c 6e 22 2c 69 29 29 3b 0a 20  erm %d\n",i));. 
32150 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6a       pItem->fg.j
32160 6f 69 6e 74 79 70 65 20 26 3d 20 7e 28 4a 54 5f  ointype &= ~(JT_
32170 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52 29 3b 0a  LEFT|JT_OUTER);.
32180 20 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45        unsetJoinE
32190 78 70 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70  xpr(p->pWhere, p
321a0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
321b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f      }..    /* No
321c0 20 66 75 74 68 65 72 20 61 63 74 69 6f 6e 20 69   futher action i
321d0 66 20 74 68 69 73 20 74 65 72 6d 20 6f 66 20 74  f this term of t
321e0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
321f0 73 20 6e 6f 20 61 20 73 75 62 71 75 65 72 79 20  s no a subquery 
32200 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d  */.    if( pSub=
32210 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
32220 20 20 20 20 2f 2a 20 43 61 74 63 68 20 6d 69 73      /* Catch mis
32230 6d 61 74 63 68 20 69 6e 20 74 68 65 20 64 65 63  match in the dec
32240 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66  lared columns of
32250 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20   a view and the 
32260 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
32270 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
32280 53 45 4c 45 43 54 20 6f 6e 20 74 68 65 20 52 48  SELECT on the RH
32290 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61  S */.    if( pTa
322a0 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70  b->nCol!=pSub->p
322b0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
322c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
322d0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65  orMsg(pParse, "e
322e0 78 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d  xpected %d colum
322f0 6e 73 20 66 6f 72 20 27 25 73 27 20 62 75 74 20  ns for '%s' but 
32300 67 6f 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20  got %d",.       
32310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
32320 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d  Tab->nCol, pTab-
32330 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45  >zName, pSub->pE
32340 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
32350 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
32360 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  end;.    }..    
32370 2f 2a 20 44 6f 20 6e 6f 74 20 74 72 79 20 74 6f  /* Do not try to
32380 20 66 6c 61 74 74 65 6e 20 61 6e 20 61 67 67 72   flatten an aggr
32390 65 67 61 74 65 20 73 75 62 71 75 65 72 79 2e 0a  egate subquery..
323a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6c      **.    ** Fl
323b0 61 74 74 65 6e 69 6e 67 20 61 6e 20 61 67 67 72  attening an aggr
323c0 65 67 61 74 65 20 73 75 62 71 75 65 72 79 20 69  egate subquery i
323d0 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
323e0 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
323f0 72 79 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  ry.    ** is not
32400 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66   a join.  But if
32410 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
32420 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2c 20   is not a join, 
32430 74 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72  then the subquer
32440 79 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65  y.    ** will be
32450 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
32460 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 61 6e 64  a co-routine and
32470 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61 64 76   there is no adv
32480 61 6e 74 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  antage to.    **
32490 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 74   flattening in t
324a0 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  hat case..    */
324b0 0a 20 20 20 20 69 66 28 20 28 70 53 75 62 2d 3e  .    if( (pSub->
324c0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
324d0 67 72 65 67 61 74 65 29 21 3d 30 20 29 20 63 6f  gregate)!=0 ) co
324e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
324f0 72 74 28 20 70 53 75 62 2d 3e 70 47 72 6f 75 70  rt( pSub->pGroup
32500 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a  By==0 );..    /*
32510 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   If the outer qu
32520 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 22  ery contains a "
32530 63 6f 6d 70 6c 65 78 22 20 72 65 73 75 6c 74 20  complex" result 
32540 73 65 74 20 28 74 68 61 74 20 69 73 2c 0a 20 20  set (that is,.  
32550 20 20 2a 2a 20 69 66 20 74 68 65 20 72 65 73 75    ** if the resu
32560 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
32570 74 65 72 20 71 75 65 72 79 20 75 73 65 73 20 66  ter query uses f
32580 75 6e 63 74 69 6f 6e 73 20 6f 72 20 73 75 62 71  unctions or subq
32590 75 65 72 69 65 73 29 0a 20 20 20 20 2a 2a 20 61  ueries).    ** a
325a0 6e 64 20 69 66 20 74 68 65 20 73 75 62 71 75 65  nd if the subque
325b0 72 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 4f  ry contains an O
325c0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
325d0 6e 64 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20  nd if.    ** it 
325e0 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e  will be implemen
325f0 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
32600 69 6e 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ine, then do not
32610 20 66 6c 61 74 74 65 6e 2e 20 20 54 68 69 73 0a   flatten.  This.
32620 20 20 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69      ** restricti
32630 6f 6e 20 61 6c 6c 6f 77 73 20 53 51 4c 20 63 6f  on allows SQL co
32640 6e 73 74 72 75 63 74 73 20 6c 69 6b 65 20 74 68  nstructs like th
32650 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  is:.    **.    *
32660 2a 20 20 53 45 4c 45 43 54 20 65 78 70 65 6e 73  *  SELECT expens
32670 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 78 29 0a  ive_function(x).
32680 20 20 20 20 2a 2a 20 20 20 20 46 52 4f 4d 20 28      **    FROM (
32690 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61  SELECT x FROM ta
326a0 62 20 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d  b ORDER BY y LIM
326b0 49 54 20 31 30 29 3b 0a 20 20 20 20 2a 2a 0a 20  IT 10);.    **. 
326c0 20 20 20 2a 2a 20 54 68 65 20 65 78 70 65 6e 73     ** The expens
326d0 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69  ive_function() i
326e0 73 20 6f 6e 6c 79 20 63 6f 6d 70 75 74 65 64 20  s only computed 
326f0 6f 6e 20 74 68 65 20 31 30 20 72 6f 77 73 20 74  on the 10 rows t
32700 68 61 74 0a 20 20 20 20 2a 2a 20 61 72 65 20 6f  hat.    ** are o
32710 75 74 70 75 74 2c 20 72 61 74 68 65 72 20 74 68  utput, rather th
32720 61 6e 20 65 76 65 72 79 20 72 6f 77 20 6f 66 20  an every row of 
32730 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  the table..    *
32740 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 71  *.    ** The req
32750 75 69 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68  uirement that th
32760 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68 61  e outer query ha
32770 76 65 20 61 20 63 6f 6d 70 6c 65 78 20 72 65 73  ve a complex res
32780 75 6c 74 20 73 65 74 0a 20 20 20 20 2a 2a 20 6d  ult set.    ** m
32790 65 61 6e 73 20 74 68 61 74 20 66 6c 61 74 74 65  eans that flatte
327a0 6e 69 6e 67 20 64 6f 65 73 20 6f 63 63 75 72 20  ning does occur 
327b0 6f 6e 20 73 69 6d 70 6c 65 72 20 53 51 4c 20 63  on simpler SQL c
327c0 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 74 68 6f  onstraints witho
327d0 75 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 78  ut.    ** the ex
327e0 70 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e  pensive_function
327f0 28 29 20 6c 69 6b 65 3a 0a 20 20 20 20 2a 2a 0a  () like:.    **.
32800 20 20 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 78      **  SELECT x
32810 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20   FROM (SELECT x 
32820 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20 42  FROM tab ORDER B
32830 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20  Y y LIMIT 10);. 
32840 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
32850 75 62 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 0a  ub->pOrderBy!=0.
32860 20 20 20 20 20 26 26 20 69 3d 3d 30 0a 20 20 20       && i==0.   
32870 20 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67    && (p->selFlag
32880 73 20 26 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65  s & SF_ComplexRe
32890 73 75 6c 74 29 21 3d 30 0a 20 20 20 20 20 26 26  sult)!=0.     &&
328a0 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63   (pTabList->nSrc
328b0 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==1.         || 
328c0 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e  (pTabList->a[1].
328d0 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f  fg.jointype&(JT_
328e0 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21  LEFT|JT_CROSS))!
328f0 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
32900 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
32910 0a 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65  ..    if( flatte
32920 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65  nSubquery(pParse
32930 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 29 20 29  , p, i, isAgg) )
32940 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
32950 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20  subquery can be 
32960 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74  absorbed into it
32970 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  s parent. */.   
32980 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d     i = -1;.    }
32990 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
329a0 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28  p->pSrc;.    if(
329b0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
329c0 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
329d0 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 21 49 67  end;.    if( !Ig
329e0 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
329f0 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73  Dest) ){.      s
32a00 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
32a10 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  p->pOrderBy;.   
32a20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23   }.  }.#endif..#
32a30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32a40 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
32a50 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63  CT.  /* Handle c
32a60 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
32a70 74 61 74 65 6d 65 6e 74 73 20 75 73 69 6e 67 20  tatements using 
32a80 74 68 65 20 73 65 70 61 72 61 74 65 20 6d 75 6c  the separate mul
32a90 74 69 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20  tiSelect().  ** 
32aa0 70 72 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a  procedure..  */.
32ab0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
32ac0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  ){.    rc = mult
32ad0 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
32ae0 70 2c 20 70 44 65 73 74 29 3b 0a 23 69 66 20 53  p, pDest);.#if S
32af0 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
32b00 45 44 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ED.    SELECTTRA
32b10 43 45 28 30 78 31 2c 70 50 61 72 73 65 2c 70 2c  CE(0x1,pParse,p,
32b20 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73  ("end compound-s
32b30 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67  elect processing
32b40 5c 6e 22 29 29 3b 0a 20 20 20 20 69 66 28 20 28  \n"));.    if( (
32b50 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
32b60 63 65 20 26 20 30 78 32 30 30 30 29 21 3d 30 20  ce & 0x2000)!=0 
32b70 26 26 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50  && ExplainQueryP
32b80 6c 61 6e 50 61 72 65 6e 74 28 70 50 61 72 73 65  lanParent(pParse
32b90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
32ba0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
32bb0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
32bc0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
32bd0 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  f( p->pNext==0 )
32be0 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
32bf0 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  nPop(pParse);.  
32c00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
32c10 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 6f  .#endif..  /* Fo
32c20 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74  r each term in t
32c30 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20  he FROM clause, 
32c40 64 6f 20 74 77 6f 20 74 68 69 6e 67 73 3a 0a 20  do two things:. 
32c50 20 2a 2a 20 28 31 29 20 41 75 74 68 6f 72 69 7a   ** (1) Authoriz
32c60 65 64 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20  ed unreferenced 
32c70 74 61 62 6c 65 73 0a 20 20 2a 2a 20 28 32 29 20  tables.  ** (2) 
32c80 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
32c90 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
32ca0 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  s.  */.  for(i=0
32cb0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
32cc0 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
32cd0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
32ce0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
32cf0 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
32d00 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
32d10 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75  .    Select *pSu
32d20 62 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  b;.#if !defined(
32d30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
32d40 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
32d50 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
32d60 45 57 29 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  EW).    const ch
32d70 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
32d80 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 0a 20  ntext;.#endif.. 
32d90 20 20 20 2f 2a 20 49 73 73 75 65 20 53 51 4c 49     /* Issue SQLI
32da0 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a  TE_READ authoriz
32db0 61 74 69 6f 6e 73 20 77 69 74 68 20 61 20 66 61  ations with a fa
32dc0 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66  ke column name f
32dd0 6f 72 20 61 6e 79 0a 20 20 20 20 2a 2a 20 74 61  or any.    ** ta
32de0 62 6c 65 73 20 74 68 61 74 20 61 72 65 20 72 65  bles that are re
32df0 66 65 72 65 6e 63 65 64 20 62 75 74 20 66 72 6f  ferenced but fro
32e00 6d 20 77 68 69 63 68 20 6e 6f 20 76 61 6c 75 65  m which no value
32e10 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 2e  s are extracted.
32e20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 73  .    ** Examples
32e30 20 6f 66 20 77 68 65 72 65 20 74 68 65 73 65 20   of where these 
32e40 6b 69 6e 64 73 20 6f 66 20 6e 75 6c 6c 20 53 51  kinds of null SQ
32e50 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72  LITE_READ author
32e60 69 7a 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20  izations.    ** 
32e70 77 6f 75 6c 64 20 6f 63 63 75 72 3a 0a 20 20 20  would occur:.   
32e80 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53   **.    **     S
32e90 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
32ea0 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 53 51 4c  ROM t1;   -- SQL
32eb0 49 54 45 5f 52 45 41 44 20 74 31 2e 22 22 0a 20  ITE_READ t1."". 
32ec0 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54     **     SELECT
32ed0 20 74 31 2e 2a 20 46 52 4f 4d 20 74 31 2c 20 74   t1.* FROM t1, t
32ee0 32 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52  2;   -- SQLITE_R
32ef0 45 41 44 20 74 32 2e 22 22 0a 20 20 20 20 2a 2a  EAD t2."".    **
32f00 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 61 6b 65  .    ** The fake
32f10 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
32f20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  an empty string.
32f30 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
32f40 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 6f 0a   for a table to.
32f50 20 20 20 20 2a 2a 20 68 61 76 65 20 61 20 63 6f      ** have a co
32f60 6c 75 6d 6e 20 6e 61 6d 65 64 20 62 79 20 74 68  lumn named by th
32f70 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20  e empty string, 
32f80 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
32f90 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
32fa0 0a 20 20 20 20 2a 2a 20 64 69 73 74 69 6e 67 75  .    ** distingu
32fb0 69 73 68 20 62 65 74 77 65 65 6e 20 61 6e 20 75  ish between an u
32fc0 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c  nreferenced tabl
32fd0 65 20 61 6e 64 20 61 6e 20 61 63 74 75 61 6c 20  e and an actual 
32fe0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
32ff0 0a 20 20 20 20 2a 2a 20 22 22 20 63 6f 6c 75 6d  .    ** "" colum
33000 6e 2e 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  n. The original 
33010 64 65 73 69 67 6e 20 77 61 73 20 66 6f 72 20 74  design was for t
33020 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e  he fake column n
33030 61 6d 65 20 74 6f 20 62 65 20 61 20 4e 55 4c 4c  ame to be a NULL
33040 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77  ,.    ** which w
33050 6f 75 6c 64 20 62 65 20 75 6e 61 6d 62 69 67 75  ould be unambigu
33060 6f 75 73 2e 20 20 42 75 74 20 6c 65 67 61 63 79  ous.  But legacy
33070 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63   authorization c
33080 61 6c 6c 62 61 63 6b 73 20 6d 69 67 68 74 0a 20  allbacks might. 
33090 20 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 65     ** assume the
330a0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20   column name is 
330b0 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20 73 65 67  non-NULL and seg
330c0 66 61 75 6c 74 2e 20 20 54 68 65 20 75 73 65 20  fault.  The use 
330d0 6f 66 20 61 6e 20 65 6d 70 74 79 0a 20 20 20 20  of an empty.    
330e0 2a 2a 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  ** string for th
330f0 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61  e fake column na
33100 6d 65 20 73 65 65 6d 73 20 73 61 66 65 72 2e 0a  me seems safer..
33110 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
33120 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30  Item->colUsed==0
33130 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
33140 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
33150 65 2c 20 53 51 4c 49 54 45 5f 52 45 41 44 2c 20  e, SQLITE_READ, 
33160 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22  pItem->zName, ""
33170 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  , pItem->zDataba
33180 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  se);.    }..#if 
33190 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
331a0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
331b0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
331c0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20  E_OMIT_VIEW).   
331d0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
331e0 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75  e for all sub-qu
331f0 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  eries in the FRO
33200 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a  M clause.    */.
33210 20 20 20 20 70 53 75 62 20 3d 20 70 49 74 65 6d      pSub = pItem
33220 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
33230 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e  f( pSub==0 ) con
33240 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53  tinue;..    /* S
33250 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64  ometimes the cod
33260 65 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79  e for a subquery
33270 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
33280 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ed more than.   
33290 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65   ** once, if the
332a0 20 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72   subquery is par
332b0 74 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  t of the WHERE c
332c0 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20  lause in a LEFT 
332d0 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72  JOIN,.    ** for
332e0 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68   example.  In th
332f0 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20  at case, do not 
33300 72 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  regenerate the c
33310 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a  ode to manifest.
33320 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72      ** a view or
33330 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
33340 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76  to implement a v
33350 69 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20  iew.  The first 
33360 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20  instance.    ** 
33370 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74  is sufficient, t
33380 68 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75  hough the subrou
33390 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74  tine to manifest
333a0 20 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e   the view does n
333b0 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  eed.    ** to be
333c0 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20   invoked again. 
333d0 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  */.    if( pItem
333e0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b  ->addrFillSub ){
333f0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
33400 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e  ->fg.viaCoroutin
33410 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
33420 2f 2a 20 54 68 65 20 73 75 62 72 6f 75 74 69 6e  /* The subroutin
33430 65 20 74 68 61 74 20 6d 61 6e 69 66 65 73 74 73  e that manifests
33440 20 74 68 65 20 76 69 65 77 20 6d 69 67 68 74 20   the view might 
33450 62 65 20 61 20 6f 6e 65 2d 74 69 6d 65 20 72 6f  be a one-time ro
33460 75 74 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 2a  utine,.        *
33470 2a 20 6f 72 20 69 74 20 6d 69 67 68 74 20 6e 65  * or it might ne
33480 65 64 20 74 6f 20 62 65 20 72 65 72 75 6e 20 6f  ed to be rerun o
33490 6e 20 65 61 63 68 20 69 74 65 72 61 74 69 6f 6e  n each iteration
334a0 20 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20   because it.    
334b0 20 20 20 20 2a 2a 20 65 6e 63 6f 64 65 73 20 61      ** encodes a
334c0 20 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71   correlated subq
334d0 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  uery. */.       
334e0 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
334f0 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
33500 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
33510 62 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f  b)->opcode==OP_O
33520 6e 63 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73  nce );.        s
33530 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
33540 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49  (v, OP_Gosub, pI
33550 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  tem->regReturn, 
33560 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
33570 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ub);.      }.   
33580 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
33590 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
335a0 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67  ment Parse.nHeig
335b0 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68 74  ht by the height
335c0 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
335d0 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a  expression.    *
335e0 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64 20  * tree referred 
335f0 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65 20  to by this, the 
33600 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54  parent select. T
33610 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a  he child select.
33620 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61      ** may conta
33630 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  in expression tr
33640 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20  ees of at most. 
33650 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41     ** (SQLITE_MA
33660 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72  X_EXPR_DEPTH-Par
33670 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67  se.nHeight) heig
33680 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62 69  ht. This is a bi
33690 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f  t.    ** more co
336a0 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e 20  nservative than 
336b0 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d  necessary, but m
336c0 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e 20  uch easier than 
336d0 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a  enforcing.    **
336e0 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e   an exact limit.
336f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72  .    */.    pPar
33700 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73  se->nHeight += s
33710 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72  qlite3SelectExpr
33720 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20  Height(p);..    
33730 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  /* Make copies o
33740 66 20 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45  f constant WHERE
33750 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e  -clause terms in
33760 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
33770 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73   down.    ** ins
33780 69 64 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ide the subquery
33790 2e 20 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70  .  This can help
337a0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74 6f   the subquery to
337b0 20 72 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69   run more effici
337c0 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ently..    */.  
337d0 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69    if( Optimizati
337e0 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
337f0 4c 49 54 45 5f 50 75 73 68 44 6f 77 6e 29 0a 20  LITE_PushDown). 
33800 20 20 20 20 26 26 20 70 75 73 68 44 6f 77 6e 57      && pushDownW
33810 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73 65  hereTerms(pParse
33820 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57 68 65 72  , pSub, p->pWher
33830 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  e, pItem->iCurso
33840 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
33850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
33860 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  Item->fg.jointyp
33870 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
33880 29 0a 20 20 20 20 29 7b 0a 23 69 66 20 53 45 4c  ).    ){.#if SEL
33890 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
338a0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
338b0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
338c0 30 78 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  0x100 ){.       
338d0 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
338e0 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
338f0 74 65 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65  ter WHERE-clause
33900 20 70 75 73 68 2d 64 6f 77 6e 3a 5c 6e 22 29 29   push-down:\n"))
33910 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
33920 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
33930 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, p, 0);.      
33940 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  }.#endif.    }el
33950 73 65 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  se{.      SELECT
33960 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61 72  TRACE(0x100,pPar
33970 73 65 2c 70 2c 28 22 50 75 73 68 2d 64 6f 77 6e  se,p,("Push-down
33980 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 5c 6e 22   not possible\n"
33990 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a  ));.    }..    z
339a0 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
339b0 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
339c0 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 50 61  Context;.    pPa
339d0 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
339e0 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  t = pItem->zName
339f0 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
33a00 74 65 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  te code to imple
33a10 6d 65 6e 74 20 74 68 65 20 73 75 62 71 75 65 72  ment the subquer
33a20 79 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  y.    **.    ** 
33a30 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
33a40 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
33a50 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 66 20 74   co-routine if t
33a60 68 65 20 73 75 62 71 75 65 72 79 20 69 73 0a 20  he subquery is. 
33a70 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64     ** guaranteed
33a80 20 74 6f 20 62 65 20 74 68 65 20 6f 75 74 65 72   to be the outer
33a90 20 6c 6f 6f 70 20 28 73 6f 20 74 68 61 74 20 69   loop (so that i
33aa0 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
33ab0 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 6d  to be.    ** com
33ac0 70 75 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 20  puted more than 
33ad0 6f 6e 63 65 29 0a 20 20 20 20 2a 2a 0a 20 20 20  once).    **.   
33ae0 20 2a 2a 20 54 4f 44 4f 3a 20 41 72 65 20 74 68   ** TODO: Are th
33af0 65 72 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ere other reason
33b00 73 20 62 65 73 69 64 65 20 28 31 29 20 74 6f 20  s beside (1) to 
33b10 75 73 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65  use a co-routine
33b20 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  .    ** implemen
33b30 74 61 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20  tation?.    */. 
33b40 20 20 20 69 66 28 20 69 3d 3d 30 0a 20 20 20 20     if( i==0.    
33b50 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e   && (pTabList->n
33b60 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  Src==1.         
33b70 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d     || (pTabList-
33b80 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70  >a[1].fg.jointyp
33b90 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  e&(JT_LEFT|JT_CR
33ba0 4f 53 53 29 29 21 3d 30 29 20 20 2f 2a 20 28 31  OSS))!=0)  /* (1
33bb0 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20  ) */.    ){.    
33bc0 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61    /* Implement a
33bd0 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74   co-routine that
33be0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73   will return a s
33bf0 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
33c00 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
33c10 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76   set on each inv
33c20 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ocation..      *
33c30 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
33c40 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
33c50 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
33c60 31 3b 0a 20 20 20 20 20 0a 20 20 20 20 20 20 70  1;.     .      p
33c70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
33c80 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
33c90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
33ca0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
33cb0 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70  InitCoroutine, p
33cc0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Item->regReturn,
33cd0 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
33ce0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
33cf0 28 76 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d  (v, "%s", pItem-
33d00 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
33d10 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64        pItem->add
33d20 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54  rFillSub = addrT
33d30 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  op;.      sqlite
33d40 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
33d50 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75  &dest, SRT_Corou
33d60 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
33d70 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 45  Return);.      E
33d80 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
33d90 28 70 50 61 72 73 65 2c 20 31 2c 20 22 43 4f 2d  (pParse, 1, "CO-
33da0 52 4f 55 54 49 4e 45 20 30 78 25 70 22 2c 20 70  ROUTINE 0x%p", p
33db0 53 75 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sub));.      sql
33dc0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
33dd0 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b  e, pSub, &dest);
33de0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54  .      pItem->pT
33df0 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
33e00 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f   pSub->nSelectRo
33e10 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  w;.      pItem->
33e20 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
33e30 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  = 1;.      pItem
33e40 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65  ->regResult = de
33e50 73 74 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20  st.iSdst;.      
33e60 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f  sqlite3VdbeEndCo
33e70 72 6f 75 74 69 6e 65 28 76 2c 20 70 49 74 65 6d  routine(v, pItem
33e80 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
33e90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
33ea0 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
33eb0 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  op-1);.      sql
33ec0 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67  ite3ClearTempReg
33ed0 43 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20  Cache(pParse);. 
33ee0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33ef0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
33f00 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  broutine that wi
33f10 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d  ll fill an ephem
33f20 65 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a  eral table with.
33f30 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e        ** the con
33f40 74 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62  tent of this sub
33f50 71 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61  query.  pItem->a
33f60 64 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20  ddrFillSub will 
33f70 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74  point.      ** t
33f80 6f 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  o the address of
33f90 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 73   the generated s
33fa0 75 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65  ubroutine.  pIte
33fb0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20  m->regReturn.   
33fc0 20 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73     ** is a regis
33fd0 74 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ter allocated to
33fe0 20 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75   hold the subrou
33ff0 74 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72  tine return addr
34000 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ess.      */.   
34010 20 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a     int topAddr;.
34020 20 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64        int onceAd
34030 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  dr = 0;.      in
34040 74 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20  t retAddr;.     
34050 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
34060 69 74 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a 20  item *pPrior;.. 
34070 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
34080 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d  em->addrFillSub=
34090 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65  =0 );.      pIte
340a0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  m->regReturn = +
340b0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
340c0 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73       topAddr = s
340d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
340e0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
340f0 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  0, pItem->regRet
34100 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65  urn);.      pIte
34110 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
34120 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20   topAddr+1;.    
34130 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
34140 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20  isCorrelated==0 
34150 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
34160 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
34170 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20   not correlated 
34180 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f  and if we are no
34190 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20  t inside of.    
341a0 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72      ** a trigger
341b0 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e  , then we only n
341c0 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  eed to compute t
341d0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
341e0 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20  subquery.       
341f0 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20   ** once. */.   
34200 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20       onceAddr = 
34210 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
34220 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
34230 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
34240 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
34250 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61  ent((v, "materia
34260 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49  lize \"%s\"", pI
34270 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
34280 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
34290 0a 20 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f  .        VdbeNoo
342a0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61  pComment((v, "ma
342b0 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22  terialize \"%s\"
342c0 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
342d0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d  zName));.      }
342e0 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20  .      pPrior = 
342f0 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 70  isSelfJoinView(p
34300 54 61 62 4c 69 73 74 2c 20 70 49 74 65 6d 29 3b  TabList, pItem);
34310 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f  .      if( pPrio
34320 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
34330 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
34340 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 49  , OP_OpenDup, pI
34350 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50  tem->iCursor, pP
34360 72 69 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  rior->iCursor);.
34370 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
34380 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 21  pPrior->pSelect!
34390 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53  =0 );.        pS
343a0 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d  ub->nSelectRow =
343b0 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74   pPrior->pSelect
343c0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
343d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
343e0 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
343f0 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
34400 53 52 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49  SRT_EphemTab, pI
34410 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  tem->iCursor);. 
34420 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75         ExplainQu
34430 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
34440 20 31 2c 20 22 4d 41 54 45 52 49 41 4c 49 5a 45   1, "MATERIALIZE
34450 20 30 78 25 70 22 2c 20 70 53 75 62 29 29 3b 0a   0x%p", pSub));.
34460 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
34470 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
34480 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ub, &dest);.    
34490 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 6d 2d    }.      pItem-
344a0 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73  >pTab->nRowLogEs
344b0 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63  t = pSub->nSelec
344c0 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20  tRow;.      if( 
344d0 6f 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69 74  onceAddr ) sqlit
344e0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
344f0 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20  , onceAddr);.   
34500 20 20 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c     retAddr = sql
34510 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
34520 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74  , OP_Return, pIt
34530 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
34540 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
34550 74 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20  t((v, "end %s", 
34560 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
34570 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  me));.      sqli
34580 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
34590 76 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41  v, topAddr, retA
345a0 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ddr);.      sqli
345b0 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
345c0 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20  ache(pParse);.  
345d0 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
345e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
345f0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
34600 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
34610 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65  ght -= sqlite3Se
34620 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
34630 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a  );.    pParse->z
34640 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
34650 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b  avedAuthContext;
34660 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
34670 2a 20 56 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e  * Various elemen
34680 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ts of the SELECT
34690 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63   copied into loc
346a0 61 6c 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72  al variables for
346b0 0a 20 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63  .  ** convenienc
346c0 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20  e */.  pEList = 
346d0 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57 68  p->pEList;.  pWh
346e0 65 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b  ere = p->pWhere;
346f0 0a 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d  .  pGroupBy = p-
34700 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61  >pGroupBy;.  pHa
34710 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e  ving = p->pHavin
34720 67 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69  g;.  sDistinct.i
34730 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46  sTnct = (p->selF
34740 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
34750 63 74 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c  ct)!=0;..#if SEL
34760 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
34770 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65  .  if( sqlite3Se
34780 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30  lectTrace & 0x40
34790 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54  0 ){.    SELECTT
347a0 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
347b0 65 2c 70 2c 28 22 41 66 74 65 72 20 61 6c 6c 20  e,p,("After all 
347c0 46 52 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c  FROM-clause anal
347d0 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  ysis:\n"));.    
347e0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
347f0 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
34800 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
34810 65 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f  ef SQLITE_COUNTO
34820 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49  FVIEW_OPTIMIZATI
34830 4f 4e 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  ON.  if( Optimiz
34840 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
34850 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61   SQLITE_QueryFla
34860 74 74 65 6e 65 72 7c 53 51 4c 49 54 45 5f 43 6f  ttener|SQLITE_Co
34870 75 6e 74 4f 66 56 69 65 77 29 0a 20 20 20 26 26  untOfView).   &&
34880 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69   countOfViewOpti
34890 6d 69 7a 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  mization(pParse,
348a0 20 70 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28   p).  ){.    if(
348b0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
348c0 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f  d ) goto select_
348d0 65 6e 64 3b 0a 20 20 20 20 70 45 4c 69 73 74 20  end;.    pEList 
348e0 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  = p->pEList;.   
348f0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
34900 53 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  Src;.  }.#endif.
34910 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65  .  /* If the que
34920 72 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 77  ry is DISTINCT w
34930 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
34940 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  but is not an ag
34950 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20  gregate, and .  
34960 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63 74  ** if the select
34970 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73 61 6d  -list is the sam
34980 65 20 61 73 20 74 68 65 20 4f 52 44 45 52 20 42  e as the ORDER B
34990 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69  Y list, then thi
349a0 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e  s query.  ** can
349b0 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73   be rewritten as
349c0 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20   a GROUP BY. In 
349d0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69  other words, thi
349e0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
349f0 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
34a00 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52   xyz FROM ... OR
34a10 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a  DER BY xyz.  **.
34a20 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72    ** is transfor
34a30 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  med to:.  **.  *
34a40 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a  *     SELECT xyz
34a50 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20   FROM ... GROUP 
34a60 42 59 20 78 79 7a 20 4f 52 44 45 52 20 42 59 20  BY xyz ORDER BY 
34a70 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  xyz.  **.  ** Th
34a80 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73  e second form is
34a90 20 70 72 65 66 65 72 72 65 64 20 61 73 20 61 20   preferred as a 
34aa0 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72  single index (or
34ab0 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79   temp-table) may
34ac0 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66   be .  ** used f
34ad0 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45  or both the ORDE
34ae0 52 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  R BY and DISTINC
34af0 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73  T processing. As
34b00 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a   originally .  *
34b10 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20 71 75  * written the qu
34b20 65 72 79 20 6d 75 73 74 20 75 73 65 20 61 20 74  ery must use a t
34b30 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74  emp-table for at
34b40 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68   least one of th
34b50 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59  e ORDER .  ** BY
34b60 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61   and DISTINCT, a
34b70 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73  nd an index or s
34b80 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62  eparate temp-tab
34b90 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  le for the other
34ba0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  ..  */.  if( (p-
34bb0 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
34bc0 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
34bd0 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
34be0 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69  inct .   && sqli
34bf0 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
34c00 72 65 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  re(sSort.pOrderB
34c10 79 2c 20 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d  y, pEList, -1)==
34c20 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65  0.  ){.    p->se
34c30 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
34c40 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 47 72 6f  stinct;.    pGro
34c50 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
34c60 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
34c70 4c 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69  ListDup(db, pELi
34c80 73 74 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 4e  st, 0);.    /* N
34c90 6f 74 69 63 65 20 74 68 61 74 20 65 76 65 6e 20  otice that even 
34ca0 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69  thought SF_Disti
34cb0 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65  nct has been cle
34cc0 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c  ared from p->sel
34cd0 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68  Flags,.    ** th
34ce0 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  e sDistinct.isTn
34cf0 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e  ct is still set.
34d00 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20    Hence, isTnct 
34d10 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20  represents the. 
34d20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73     ** original s
34d30 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46  etting of the SF
34d40 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20  _Distinct flag, 
34d50 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  not the current 
34d60 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61  setting */.    a
34d70 73 73 65 72 74 28 20 73 44 69 73 74 69 6e 63 74  ssert( sDistinct
34d80 2e 69 73 54 6e 63 74 20 29 3b 0a 0a 23 69 66 20  .isTnct );..#if 
34d90 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
34da0 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69  LED.    if( sqli
34db0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
34dc0 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20   0x400 ){.      
34dd0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30  SELECTTRACE(0x40
34de0 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 54 72 61  0,pParse,p,("Tra
34df0 6e 73 66 6f 72 6d 20 44 49 53 54 49 4e 43 54 20  nsform DISTINCT 
34e00 69 6e 74 6f 20 47 52 4f 55 50 20 42 59 3a 5c 6e  into GROUP BY:\n
34e10 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
34e20 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
34e30 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d  (0, p, 0);.    }
34e40 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
34e50 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
34e60 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
34e70 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e  , then create an
34e80 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78   ephemeral index
34e90 20 74 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20   to.  ** do the 
34ea0 73 6f 72 74 69 6e 67 2e 20 20 42 75 74 20 74 68  sorting.  But th
34eb0 69 73 20 73 6f 72 74 69 6e 67 20 65 70 68 65 6d  is sorting ephem
34ec0 65 72 61 6c 20 69 6e 64 65 78 20 6d 69 67 68 74  eral index might
34ed0 20 65 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65 69   end up.  ** bei
34ee0 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68 65  ng unused if the
34ef0 20 64 61 74 61 20 63 61 6e 20 62 65 20 65 78 74   data can be ext
34f00 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f  racted in pre-so
34f10 72 74 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a  rted order..  **
34f20 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
34f30 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 4f  case, then the O
34f40 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
34f50 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c  instruction will
34f60 20 62 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64   be.  ** changed
34f70 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f   to an OP_Noop o
34f80 6e 63 65 20 77 65 20 66 69 67 75 72 65 20 6f 75  nce we figure ou
34f90 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69  t that the sorti
34fa0 6e 67 20 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a  ng index is.  **
34fb0 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68   not needed.  Th
34fc0 65 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  e sSort.addrSort
34fd0 49 6e 64 65 78 20 76 61 72 69 61 62 6c 65 20 69  Index variable i
34fe0 73 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69  s used to facili
34ff0 74 61 74 65 0a 20 20 2a 2a 20 74 68 61 74 20 63  tate.  ** that c
35000 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  hange..  */.  if
35010 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  ( sSort.pOrderBy
35020 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
35030 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70  *pKeyInfo;.    p
35040 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
35050 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
35060 61 72 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64  arse, sSort.pOrd
35070 65 72 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d  erBy, 0, pEList-
35080 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f  >nExpr);.    sSo
35090 72 74 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50  rt.iECursor = pP
350a0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
350b0 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74    sSort.addrSort
350c0 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71  Index =.      sq
350d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
350e0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
350f0 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73  ral,.          s
35100 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73  Sort.iECursor, s
35110 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e  Sort.pOrderBy->n
35120 45 78 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e  Expr+1+pEList->n
35130 45 78 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20  Expr, 0,.       
35140 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
35150 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20  fo, P4_KEYINFO. 
35160 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b       );.  }else{
35170 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53  .    sSort.addrS
35180 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20  ortIndex = -1;. 
35190 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
351a0 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
351b0 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
351c0 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
351d0 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
351e0 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
351f0 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
35200 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
35210 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
35220 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
35230 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70  Dest->iSDParm, p
35240 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
35250 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
35260 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20   limiter..  */. 
35270 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
35280 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
35290 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
352a0 61 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69  ags & SF_FixedLi
352b0 6d 69 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  mit)==0 ){.    p
352c0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 33  ->nSelectRow = 3
352d0 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f  20;  /* 4 billio
352e0 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 7d 0a 20 20  n rows */.  }.  
352f0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
35300 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
35310 20 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d   iEnd);.  if( p-
35320 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53  >iLimit==0 && sS
35330 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
35340 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  x>=0 ){.    sqli
35350 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63  te3VdbeChangeOpc
35360 6f 64 65 28 76 2c 20 73 53 6f 72 74 2e 61 64 64  ode(v, sSort.add
35370 72 53 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53  rSortIndex, OP_S
35380 6f 72 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20  orterOpen);.    
35390 73 53 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20  sSort.sortFlags 
353a0 7c 3d 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53  |= SORTFLAG_UseS
353b0 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  orter;.  }..  /*
353c0 20 4f 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72   Open an ephemer
353d0 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  al index to use 
353e0 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
353f0 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
35400 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
35410 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  F_Distinct ){.  
35420 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54    sDistinct.tabT
35430 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
35440 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69  ab++;.    sDisti
35450 6e 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73  nct.addrTnct = s
35460 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
35470 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
35480 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
35490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
354a0 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62     sDistinct.tab
354b0 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Tnct, 0, 0,.    
354c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
354d0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
354e0 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
354f0 69 73 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ist(pParse, p->p
35500 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20 20 20 20  EList,0,0),.    
35510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35520 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
35530 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  NFO);.    sqlite
35540 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
35550 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
35560 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  );.    sDistinct
35570 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45  .eTnctType = WHE
35580 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
35590 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DERED;.  }else{.
355a0 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
355b0 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f  nctType = WHERE_
355c0 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20  DISTINCT_NOOP;. 
355d0 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67   }..  if( !isAgg
355e0 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20   && pGroupBy==0 
355f0 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70  ){.    Window *p
35600 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 20  Win = p->pWin;. 
35610 20 20 20 69 6e 74 20 72 65 67 50 61 72 74 20 3d     int regPart =
35620 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 61   0;..    /* No a
35630 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
35640 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20  ns and no GROUP 
35650 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
35660 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
35670 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54  = (sDistinct.isT
35680 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54  nct ? WHERE_WANT
35690 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a  _DISTINCT : 0);.
356a0 20 20 20 20 61 73 73 65 72 74 28 20 57 48 45 52      assert( WHER
356b0 45 5f 55 53 45 5f 4c 49 4d 49 54 3d 3d 53 46 5f  E_USE_LIMIT==SF_
356c0 46 69 78 65 64 4c 69 6d 69 74 20 29 3b 0a 20 20  FixedLimit );.  
356d0 20 20 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20    wctrlFlags |= 
356e0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
356f0 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a 0a 20 20  _FixedLimit;..  
35700 20 20 69 66 28 20 70 57 69 6e 20 29 7b 0a 20 20    if( pWin ){.  
35710 20 20 20 20 69 6e 74 20 6e 50 61 72 74 20 3d 20      int nPart = 
35720 28 70 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f  (pWin->pPartitio
35730 6e 20 3f 20 70 57 69 6e 2d 3e 70 50 61 72 74 69  n ? pWin->pParti
35740 74 69 6f 6e 2d 3e 6e 45 78 70 72 20 3a 20 30 29  tion->nExpr : 0)
35750 3b 0a 20 20 20 20 20 20 6e 50 61 72 74 20 2b 3d  ;.      nPart +=
35760 20 28 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79   (pWin->pOrderBy
35770 20 3f 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42   ? pWin->pOrderB
35780 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20  y->nExpr : 0);. 
35790 20 20 20 20 20 69 66 28 20 6e 50 61 72 74 20 29       if( nPart )
357a0 7b 0a 20 20 20 20 20 20 20 20 72 65 67 50 61 72  {.        regPar
357b0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  t = pParse->nMem
357c0 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  +1;.        pPar
357d0 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 61 72  se->nMem += nPar
357e0 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  t;.        sqlit
357f0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
35800 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 50  OP_Null, 0, regP
35810 61 72 74 2c 20 72 65 67 50 61 72 74 2b 6e 50 61  art, regPart+nPa
35820 72 74 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rt-1);.      }. 
35830 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 65 67     }..    /* Beg
35840 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
35850 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 53 45 4c  scan. */.    SEL
35860 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73  ECTTRACE(1,pPars
35870 65 2c 70 2c 28 22 57 68 65 72 65 42 65 67 69 6e  e,p,("WhereBegin
35880 5c 6e 22 29 29 3b 0a 20 20 20 20 70 57 49 6e 66  \n"));.    pWInf
35890 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
358a0 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
358b0 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
358c0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 0a  sSort.pOrderBy,.
358d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
358f0 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72 6c 46  ->pEList, wctrlF
35900 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c 65 63 74  lags, p->nSelect
35910 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 57  Row);.    if( pW
35920 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
35930 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69  elect_end;.    i
35940 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f  f( sqlite3WhereO
35950 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57  utputRowCount(pW
35960 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65  Info) < p->nSele
35970 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70  ctRow ){.      p
35980 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
35990 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75  qlite3WhereOutpu
359a0 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f  tRowCount(pWInfo
359b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
359c0 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
359d0 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65 72  t && sqlite3Wher
359e0 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e  eIsDistinct(pWIn
359f0 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69  fo) ){.      sDi
35a00 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
35a10 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49   = sqlite3WhereI
35a20 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f  sDistinct(pWInfo
35a30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
35a40 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
35a50 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 6e  ){.      sSort.n
35a60 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65 33 57  OBSat = sqlite3W
35a70 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
35a80 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 53 6f  Info);.      sSo
35a90 72 74 2e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72  rt.bOrderedInner
35aa0 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 57 68  Loop = sqlite3Wh
35ab0 65 72 65 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ereOrderedInnerL
35ac0 6f 6f 70 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  oop(pWInfo);.   
35ad0 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e 4f 42     if( sSort.nOB
35ae0 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72 64 65  Sat==sSort.pOrde
35af0 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
35b00 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
35b10 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
35b20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
35b30 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  If sorting index
35b40 20 74 68 61 74 20 77 61 73 20 63 72 65 61 74 65   that was create
35b50 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f  d by a prior OP_
35b60 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20  OpenEphemeral . 
35b70 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f     ** instructio
35b80 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62  n ended up not b
35b90 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65  eing needed, the
35ba0 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f  n change the OP_
35bb0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20  OpenEphemeral.  
35bc0 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f    ** into an OP_
35bd0 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Noop..    */.   
35be0 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64 72 53   if( sSort.addrS
35bf0 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 73  ortIndex>=0 && s
35c00 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d 3d 30  Sort.pOrderBy==0
35c10 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
35c20 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
35c30 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53  p(v, sSort.addrS
35c40 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 7d  ortIndex);.    }
35c50 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ..    assert( p-
35c60 3e 70 45 4c 69 73 74 3d 3d 70 45 4c 69 73 74 20  >pEList==pEList 
35c70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 57  );.    if( p->pW
35c80 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  in ){.      int 
35c90 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 75  k;.      int iSu
35ca0 62 43 73 72 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  bCsr = p->pSrc->
35cb0 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[0].iCursor;.  
35cc0 20 20 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 70      int nSub = p
35cd0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
35ce0 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 69  b->nCol;.      i
35cf0 6e 74 20 72 65 67 20 3d 20 70 50 61 72 73 65 2d  nt reg = pParse-
35d00 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 69  >nMem+1;.      i
35d10 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 72  nt regRecord = r
35d20 65 67 2b 6e 53 75 62 3b 0a 20 20 20 20 20 20 69  eg+nSub;.      i
35d30 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 72 65  nt regRowid = re
35d40 67 52 65 63 6f 72 64 2b 31 3b 0a 20 20 20 20 20  gRecord+1;.     
35d50 20 69 6e 74 20 72 65 67 47 6f 73 75 62 20 3d 20   int regGosub = 
35d60 72 65 67 52 6f 77 69 64 2b 31 3b 0a 20 20 20 20  regRowid+1;.    
35d70 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
35d80 20 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 3b    int addrGosub;
35d90 0a 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ..      pParse->
35da0 6e 4d 65 6d 20 2b 3d 20 6e 53 75 62 20 2b 20 33  nMem += nSub + 3
35db0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 61 72 74  ;..      /* Mart
35dc0 69 61 6c 20 74 68 65 20 72 6f 77 20 72 65 74 75  ial the row retu
35dd0 72 6e 65 64 20 62 79 20 74 68 65 20 73 75 62 2d  rned by the sub-
35de0 73 65 6c 65 63 74 20 69 6e 74 6f 20 61 6e 20 61  select into an a
35df0 72 72 61 79 20 6f 66 20 0a 20 20 20 20 20 20 2a  rray of .      *
35e00 2a 20 72 65 67 69 73 74 65 72 73 2e 20 2a 2f 0a  * registers. */.
35e10 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
35e20 3c 6e 53 75 62 3b 20 6b 2b 2b 29 7b 0a 20 20 20  <nSub; k++){.   
35e30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
35e40 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
35e50 75 6d 6e 2c 20 69 53 75 62 43 73 72 2c 20 6b 2c  umn, iSubCsr, k,
35e60 20 72 65 67 2b 6b 29 3b 0a 20 20 20 20 20 20 7d   reg+k);.      }
35e70 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ..      /* Check
35e80 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
35e90 73 74 61 72 74 20 6f 66 20 61 20 6e 65 77 20 70  start of a new p
35ea0 61 72 74 69 74 69 6f 6e 20 6f 72 20 70 65 65 72  artition or peer
35eb0 20 67 72 6f 75 70 2e 20 2a 2f 0a 20 20 20 20 20   group. */.     
35ec0 20 69 66 28 20 72 65 67 50 61 72 74 20 29 7b 0a   if( regPart ){.
35ed0 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
35ee0 20 2a 70 50 61 72 74 20 3d 20 70 57 69 6e 2d 3e   *pPart = pWin->
35ef0 70 50 61 72 74 69 74 69 6f 6e 3b 0a 20 20 20 20  pPartition;.    
35f00 20 20 20 20 69 6e 74 20 6e 50 61 72 74 20 3d 20      int nPart = 
35f10 28 70 50 61 72 74 20 3f 20 70 50 61 72 74 2d 3e  (pPart ? pPart->
35f20 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20  nExpr : 0);.    
35f30 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f      ExprList *pO
35f40 72 64 65 72 42 79 20 3d 20 70 57 69 6e 2d 3e 70  rderBy = pWin->p
35f50 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 20  OrderBy;.       
35f60 20 69 6e 74 20 6e 50 65 65 72 20 3d 20 28 70 4f   int nPeer = (pO
35f70 72 64 65 72 42 79 20 3f 20 70 4f 72 64 65 72 42  rderBy ? pOrderB
35f80 79 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b 0a 20  y->nExpr : 0);. 
35f90 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 47         int addrG
35fa0 6f 74 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  oto = 0;.       
35fb0 20 69 6e 74 20 61 64 64 72 4a 75 6d 70 20 3d 20   int addrJump = 
35fc0 30 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  0;..        if( 
35fd0 70 50 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20  pPart ){.       
35fe0 20 20 20 69 6e 74 20 72 65 67 4e 65 77 50 61 72     int regNewPar
35ff0 74 20 3d 20 72 65 67 20 2b 20 70 57 69 6e 2d 3e  t = reg + pWin->
36000 6e 42 75 66 66 65 72 43 6f 6c 3b 0a 20 20 20 20  nBufferCol;.    
36010 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
36020 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
36030 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
36040 61 72 73 65 2c 20 70 50 61 72 74 2c 20 30 2c 20  arse, pPart, 0, 
36050 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 64  0);.          ad
36060 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
36070 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp3(v, OP_Com
36080 70 61 72 65 2c 20 72 65 67 4e 65 77 50 61 72 74  pare, regNewPart
36090 2c 20 72 65 67 50 61 72 74 2c 20 6e 50 61 72 74  , regPart, nPart
360a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
360b0 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
360c0 28 76 2c 20 28 76 6f 69 64 2a 29 70 4b 65 79 49  (v, (void*)pKeyI
360d0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
360e0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 72  ;.          addr
360f0 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Jump = sqlite3Vd
36100 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
36110 75 6d 70 2c 20 61 64 64 72 2b 32 2c 20 30 2c 20  ump, addr+2, 0, 
36120 61 64 64 72 2b 32 29 3b 0a 20 20 20 20 20 20 20  addr+2);.       
36130 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36140 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69  dOp2(v, OP_AggFi
36150 6e 61 6c 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63  nal, pWin->regAc
36160 63 75 6d 2c 20 70 57 69 6e 2d 3e 6e 41 72 67 29  cum, pWin->nArg)
36170 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
36180 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
36190 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20  v, pWin->pFunc, 
361a0 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
361b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
361c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
361d0 6f 70 79 2c 20 70 57 69 6e 2d 3e 72 65 67 41 63  opy, pWin->regAc
361e0 63 75 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65  cum, pWin->regRe
361f0 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 20  sult);.         
36200 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
36210 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64  .            add
36220 72 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56  rGoto = sqlite3V
36230 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
36240 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Goto);.         
36250 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
36260 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
36270 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  By ){.          
36280 69 6e 74 20 72 65 67 4e 65 77 50 65 65 72 20 3d  int regNewPeer =
36290 20 72 65 67 20 2b 20 70 57 69 6e 2d 3e 6e 42 75   reg + pWin->nBu
362a0 66 66 65 72 43 6f 6c 20 2b 20 6e 50 61 72 74 3b  fferCol + nPart;
362b0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72  .          int r
362c0 65 67 50 65 65 72 20 3d 20 72 65 67 50 61 72 74  egPeer = regPart
362d0 20 2b 20 6e 50 61 72 74 3b 0a 0a 20 20 20 20 20   + nPart;..     
362e0 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
362f0 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
36300 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
36310 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 30  rse, pOrderBy, 0
36320 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
36330 69 66 28 20 61 64 64 72 4a 75 6d 70 20 29 20 73  if( addrJump ) s
36340 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
36350 72 65 28 76 2c 20 61 64 64 72 4a 75 6d 70 29 3b  re(v, addrJump);
36360 0a 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20  .          addr 
36370 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
36380 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op3(v, OP_Compar
36390 65 2c 20 72 65 67 4e 65 77 50 65 65 72 2c 20 72  e, regNewPeer, r
363a0 65 67 50 65 65 72 2c 20 6e 50 65 65 72 29 3b 0a  egPeer, nPeer);.
363b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
363c0 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
363d0 20 28 76 6f 69 64 2a 29 70 4b 65 79 49 6e 66 6f   (void*)pKeyInfo
363e0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
363f0 20 20 20 20 20 20 20 20 20 61 64 64 72 4a 75 6d           addrJum
36400 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
36410 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
36420 2c 20 61 64 64 72 2b 32 2c 20 30 2c 20 61 64 64  , addr+2, 0, add
36430 72 2b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r+2);.          
36440 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36450 33 28 76 2c 20 0a 20 20 20 20 20 20 20 20 20 20  3(v, .          
36460 20 20 20 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c      OP_AggFinal,
36470 20 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c   pWin->regAccum,
36480 20 70 57 69 6e 2d 3e 6e 41 72 67 2c 20 70 57 69   pWin->nArg, pWi
36490 6e 2d 3e 72 65 67 52 65 73 75 6c 74 0a 20 20 20  n->regResult.   
364a0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
364b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
364c0 70 70 65 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d  ppendP4(v, pWin-
364d0 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
364e0 45 46 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  EF);..          
364f0 69 66 28 20 61 64 64 72 47 6f 74 6f 20 29 20 73  if( addrGoto ) s
36500 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
36510 72 65 28 76 2c 20 61 64 64 72 47 6f 74 6f 29 3b  re(v, addrGoto);
36520 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
36530 20 20 20 20 61 64 64 72 47 6f 73 75 62 20 3d 20      addrGosub = 
36540 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36550 31 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  1(v, OP_Gosub, r
36560 65 67 47 6f 73 75 62 29 3b 0a 20 20 20 20 20 20  egGosub);.      
36570 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
36580 4f 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53  Op1(v, OP_ResetS
36590 6f 72 74 65 72 2c 20 70 57 69 6e 2d 3e 69 45 70  orter, pWin->iEp
365a0 68 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 73  hCsr);.        s
365b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
365c0 28 76 2c 4f 50 5f 43 6f 70 79 2c 72 65 67 2b 70  (v,OP_Copy,reg+p
365d0 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 2c  Win->nBufferCol,
365e0 72 65 67 50 61 72 74 2c 6e 50 61 72 74 2b 6e 50  regPart,nPart+nP
365f0 65 65 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20 20  eer-1);..       
36600 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
36610 48 65 72 65 28 76 2c 20 61 64 64 72 4a 75 6d 70  Here(v, addrJump
36620 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
36630 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 73 74 65 70    /* Invoke step
36640 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 77 69   function for wi
36650 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 2a  ndow functions *
36660 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
36670 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
36680 41 67 67 53 74 65 70 30 2c 20 30 2c 20 72 65 67  AggStep0, 0, reg
36690 2b 70 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 2c 20  +pWin->iArgCol, 
366a0 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b  pWin->regAccum);
366b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
366c0 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 57  beAppendP4(v, pW
366d0 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  in->pFunc, P4_FU
366e0 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 73 71  NCDEF);.      sq
366f0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
36700 35 28 76 2c 20 28 75 38 29 70 57 69 6e 2d 3e 6e  5(v, (u8)pWin->n
36710 41 72 67 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  Arg);..      /* 
36720 42 75 66 66 65 72 20 74 68 65 20 63 75 72 72 65  Buffer the curre
36730 6e 74 20 72 6f 77 20 69 6e 20 74 68 65 20 65 70  nt row in the ep
36740 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 2e 20 2a  hemeral table. *
36750 2f 0a 20 20 20 20 20 20 69 66 28 20 70 57 69 6e  /.      if( pWin
36760 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 3e 30 20 29  ->nBufferCol>0 )
36770 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
36780 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
36790 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
367a0 67 2c 20 70 57 69 6e 2d 3e 6e 42 75 66 66 65 72  g, pWin->nBuffer
367b0 43 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Col, regRecord);
367c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
367d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
367e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 42 6c  eAddOp2(v, OP_Bl
367f0 6f 62 2c 20 30 2c 20 72 65 67 52 65 63 6f 72 64  ob, 0, regRecord
36800 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
36810 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
36820 2c 20 28 76 6f 69 64 2a 29 22 22 2c 20 30 29 3b  , (void*)"", 0);
36830 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
36840 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
36850 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
36860 20 70 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20   pWin->iEphCsr, 
36870 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
36880 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36890 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
368a0 20 70 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20   pWin->iEphCsr, 
368b0 72 65 67 52 65 63 6f 72 64 2c 20 72 65 67 52 6f  regRecord, regRo
368c0 77 69 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  wid);..      /* 
368d0 45 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  End the database
368e0 20 73 63 61 6e 20 6c 6f 6f 70 2e 20 2a 2f 0a 20   scan loop. */. 
368f0 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
36900 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 0a 20  eEnd(pWInfo);.. 
36910 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36920 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67  AddOp2(v, OP_Agg
36930 46 69 6e 61 6c 2c 20 70 57 69 6e 2d 3e 72 65 67  Final, pWin->reg
36940 41 63 63 75 6d 2c 20 70 57 69 6e 2d 3e 6e 41 72  Accum, pWin->nAr
36950 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
36960 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
36970 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50 34   pWin->pFunc, P4
36980 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20  _FUNCDEF);.     
36990 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
369a0 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p2(v, OP_Copy, p
369b0 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20 70  Win->regAccum, p
369c0 57 69 6e 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b  Win->regResult);
369d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
369e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
369f0 6f 73 75 62 2c 20 72 65 67 47 6f 73 75 62 2c 20  osub, regGosub, 
36a00 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
36a10 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 0a 20  ntAddr(v)+2);.. 
36a20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36a30 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74  AddOp0(v, OP_Got
36a40 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  o);.      if( re
36a50 67 50 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20  gPart ){.       
36a60 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
36a70 48 65 72 65 28 76 2c 20 61 64 64 72 47 6f 73 75  Here(v, addrGosu
36a80 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
36a90 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
36aa0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
36ab0 5f 52 65 77 69 6e 64 2c 20 70 57 69 6e 2d 3e 69  _Rewind, pWin->i
36ac0 45 70 68 43 73 72 29 3b 0a 20 20 20 20 20 20 73  EphCsr);.      s
36ad0 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
36ae0 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73  Parse, p, -1, &s
36af0 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74  Sort, &sDistinct
36b00 2c 20 70 44 65 73 74 2c 20 61 64 64 72 2b 31 2c  , pDest, addr+1,
36b10 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
36b20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
36b30 4f 50 5f 4e 65 78 74 2c 20 70 57 69 6e 2d 3e 69  OP_Next, pWin->i
36b40 45 70 68 43 73 72 2c 20 61 64 64 72 2b 31 29 3b  EphCsr, addr+1);
36b50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
36b60 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
36b70 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  dr);.      sqlit
36b80 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
36b90 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 47 6f  OP_Return, regGo
36ba0 73 75 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  sub);.      sqli
36bb0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
36bc0 76 2c 20 61 64 64 72 2d 31 29 3b 20 20 20 20 20  v, addr-1);     
36bd0 20 20 2f 2a 20 4f 50 5f 47 6f 74 6f 20 6a 75 6d    /* OP_Goto jum
36be0 70 73 20 68 65 72 65 20 2a 2f 0a 0a 20 20 20 20  ps here */..    
36bf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
36c00 55 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  Use the standard
36c10 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a   inner loop. */.
36c20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
36c30 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
36c40 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44   -1, &sSort, &sD
36c50 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a  istinct, pDest,.
36c60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
36c70 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61  3WhereContinueLa
36c80 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20  bel(pWInfo),.   
36c90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68         sqlite3Wh
36ca0 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57  ereBreakLabel(pW
36cb0 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 20 20 2f  Info));..      /
36cc0 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61  * End the databa
36cd0 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  se scan loop..  
36ce0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
36cf0 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
36d00 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  nfo);.    }.  }e
36d10 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
36d20 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65   case when there
36d30 20 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65   exist aggregate
36d40 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20   functions or a 
36d50 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a  GROUP BY clause.
36d60 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a      ** or both *
36d70 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78  /.    NameContex
36d80 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d  t sNC;    /* Nam
36d90 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72  e context for pr
36da0 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61  ocessing aggrega
36db0 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  te information *
36dc0 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b  /.    int iAMem;
36dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
36de0 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66  st Mem address f
36df0 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65  or storing curre
36e00 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  nt GROUP BY */. 
36e10 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20     int iBMem;   
36e20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
36e30 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
36e40 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42  previous GROUP B
36e50 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73  Y */.    int iUs
36e60 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20  eFlag;       /* 
36e70 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64  Mem address hold
36e80 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74  ing flag indicat
36e90 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73  ing that at leas
36ea0 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
36eb0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65            ** one
36ec0 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75   row of the inpu
36ed0 74 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61  t to the aggrega
36ee0 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20  tor has been.   
36ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f00 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
36f10 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62  d */.    int iAb
36f20 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20  ortFlag;     /* 
36f30 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63  Mem address whic
36f40 68 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61  h causes query a
36f50 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65  bort if positive
36f60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75   */.    int grou
36f70 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52  pBySort;    /* R
36f80 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f  ows come from so
36f90 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59  urce in GROUP BY
36fa0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e   order */.    in
36fb0 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20  t addrEnd;      
36fc0 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63    /* End of proc
36fd0 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20  essing for this 
36fe0 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e  SELECT */.    in
36ff0 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20  t sortPTab = 0; 
37000 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65    /* Pseudotable
37010 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20   used to decode 
37020 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20  sorting results 
37030 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f  */.    int sortO
37040 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75  ut = 0;    /* Ou
37050 74 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72  tput register fr
37060 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f  om the sorter */
37070 0a 20 20 20 20 69 6e 74 20 6f 72 64 65 72 42 79  .    int orderBy
37080 47 72 70 20 3d 20 30 3b 20 2f 2a 20 54 72 75 65  Grp = 0; /* True
37090 20 69 66 20 74 68 65 20 47 52 4f 55 50 20 42 59   if the GROUP BY
370a0 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20 61 72   and ORDER BY ar
370b0 65 20 74 68 65 20 73 61 6d 65 20 2a 2f 0a 0a 20  e the same */.. 
370c0 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79     /* Remove any
370d0 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73   and all aliases
370e0 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73   between the res
370f0 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a  ult set and the.
37100 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20      ** GROUP BY 
37110 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  clause..    */. 
37120 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
37130 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20  ){.      int k; 
37140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37150 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
37160 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
37170 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
37180 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a  item *pItem;  /*
37190 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
371a0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  r expression in 
371b0 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20  a list */..     
371c0 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74   for(k=p->pEList
371d0 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
371e0 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30  ->pEList->a; k>0
371f0 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
37200 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
37210 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  u.x.iAlias = 0;.
37220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
37230 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45  r(k=pGroupBy->nE
37240 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75  xpr, pItem=pGrou
37250 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  pBy->a; k>0; k--
37260 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
37270 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
37280 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
37290 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
372a0 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   66==sqlite3LogE
372b0 73 74 28 31 30 30 29 20 29 3b 0a 20 20 20 20 20  st(100) );.     
372c0 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
372d0 6f 77 3e 36 36 20 29 20 70 2d 3e 6e 53 65 6c 65  ow>66 ) p->nSele
372e0 63 74 52 6f 77 20 3d 20 36 36 3b 0a 20 20 20 20  ctRow = 66;.    
372f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
37300 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c  ert( 0==sqlite3L
37310 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20 20 20  ogEst(1) );.    
37320 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
37330 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
37340 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62  /* If there is b
37350 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59 20 61  oth a GROUP BY a
37360 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  nd an ORDER BY c
37370 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79 20 61  lause and they a
37380 72 65 0a 20 20 20 20 2a 2a 20 69 64 65 6e 74 69  re.    ** identi
37390 63 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  cal, then it may
373a0 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
373b0 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45  disable the ORDE
373c0 52 20 42 59 20 63 6c 61 75 73 65 20 0a 20 20 20  R BY clause .   
373d0 20 2a 2a 20 6f 6e 20 74 68 65 20 67 72 6f 75 6e   ** on the groun
373e0 64 73 20 74 68 61 74 20 74 68 65 20 47 52 4f 55  ds that the GROU
373f0 50 20 42 59 20 77 69 6c 6c 20 63 61 75 73 65 20  P BY will cause 
37400 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65  elements to come
37410 20 6f 75 74 20 0a 20 20 20 20 2a 2a 20 69 6e 20   out .    ** in 
37420 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65  the correct orde
37430 72 2e 20 49 74 20 61 6c 73 6f 20 6d 61 79 20 6e  r. It also may n
37440 6f 74 20 2d 20 74 68 65 20 47 52 4f 55 50 20 42  ot - the GROUP B
37450 59 20 6d 69 67 68 74 20 75 73 65 20 61 0a 20 20  Y might use a.  
37460 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6e    ** database in
37470 64 65 78 20 74 68 61 74 20 63 61 75 73 65 73 20  dex that causes 
37480 72 6f 77 73 20 74 6f 20 62 65 20 67 72 6f 75 70  rows to be group
37490 65 64 20 74 6f 67 65 74 68 65 72 20 61 73 20 72  ed together as r
374a0 65 71 75 69 72 65 64 0a 20 20 20 20 2a 2a 20 62  equired.    ** b
374b0 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ut not actually 
374c0 73 6f 72 74 65 64 2e 20 45 69 74 68 65 72 20 77  sorted. Either w
374d0 61 79 2c 20 72 65 63 6f 72 64 20 74 68 65 20 66  ay, record the f
374e0 61 63 74 20 74 68 61 74 20 74 68 65 0a 20 20 20  act that the.   
374f0 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 61 6e 64   ** ORDER BY and
37500 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
37510 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 62  s are the same b
37520 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 6f 72  y setting the or
37530 64 65 72 42 79 47 72 70 0a 20 20 20 20 2a 2a 20  derByGrp.    ** 
37540 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  variable.  */.  
37550 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
37560 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 47 72  rListCompare(pGr
37570 6f 75 70 42 79 2c 20 73 53 6f 72 74 2e 70 4f 72  oupBy, sSort.pOr
37580 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 20 29 7b  derBy, -1)==0 ){
37590 0a 20 20 20 20 20 20 6f 72 64 65 72 42 79 47 72  .      orderByGr
375a0 70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 0a 20  p = 1;.    }. . 
375b0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c     /* Create a l
375c0 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
375d0 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
375e0 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20  abort the query 
375f0 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d  */.    addrEnd =
37600 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
37610 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
37620 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c  * Convert TK_COL
37630 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54  UMN nodes into T
37640 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64  K_AGG_COLUMN and
37650 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e   make entries in
37660 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f  .    ** sAggInfo
37670 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f   for all TK_AGG_
37680 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69  FUNCTION nodes i
37690 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  n expressions of
376a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45   the.    ** SELE
376b0 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
376c0 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
376d0 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
376e0 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
376f0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
37700 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
37710 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20   = pTabList;.   
37720 20 73 4e 43 2e 75 4e 43 2e 70 41 67 67 49 6e 66   sNC.uNC.pAggInf
37730 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20  o = &sAggInfo;. 
37740 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 73 4e 43     VVA_ONLY( sNC
37750 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f 55 41  .ncFlags = NC_UA
37760 67 67 49 6e 66 6f 3b 20 29 0a 20 20 20 20 73 41  ggInfo; ).    sA
37770 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70  ggInfo.mnReg = p
37780 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
37790 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72     sAggInfo.nSor
377a0 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72  tingColumn = pGr
377b0 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79  oupBy ? pGroupBy
377c0 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20  ->nExpr : 0;.   
377d0 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70   sAggInfo.pGroup
377e0 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20  By = pGroupBy;. 
377f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
37800 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
37810 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  C, pEList);.    
37820 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
37830 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
37840 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 29 3b  sSort.pOrderBy);
37850 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e 67  .    if( pHaving
37860 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 47   ){.      if( pG
37870 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
37880 20 20 61 73 73 65 72 74 28 20 70 57 68 65 72 65    assert( pWhere
37890 3d 3d 70 2d 3e 70 57 68 65 72 65 20 29 3b 0a 20  ==p->pWhere );. 
378a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
378b0 48 61 76 69 6e 67 3d 3d 70 2d 3e 70 48 61 76 69  Having==p->pHavi
378c0 6e 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ng );.        as
378d0 73 65 72 74 28 20 70 47 72 6f 75 70 42 79 3d 3d  sert( pGroupBy==
378e0 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 20  p->pGroupBy );. 
378f0 20 20 20 20 20 20 20 68 61 76 69 6e 67 54 6f 57         havingToW
37900 68 65 72 65 28 70 50 61 72 73 65 2c 20 70 29 3b  here(pParse, p);
37910 0a 20 20 20 20 20 20 20 20 70 57 68 65 72 65 20  .        pWhere 
37920 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20  = p->pWhere;.   
37930 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
37940 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
37950 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48  regates(&sNC, pH
37960 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20  aving);.    }.  
37970 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75    sAggInfo.nAccu
37980 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e  mulator = sAggIn
37990 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  fo.nColumn;.    
379a0 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d  if( p->pGroupBy=
379b0 3d 30 20 26 26 20 70 2d 3e 70 48 61 76 69 6e 67  =0 && p->pHaving
379c0 3d 3d 30 20 26 26 20 73 41 67 67 49 6e 66 6f 2e  ==0 && sAggInfo.
379d0 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20  nFunc==1 ){.    
379e0 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20 6d    minMaxFlag = m
379f0 69 6e 4d 61 78 51 75 65 72 79 28 64 62 2c 20 73  inMaxQuery(db, s
37a00 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d  AggInfo.aFunc[0]
37a10 2e 70 45 78 70 72 2c 20 26 70 4d 69 6e 4d 61 78  .pExpr, &pMinMax
37a20 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 65  OrderBy);.    }e
37a30 6c 73 65 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61  lse{.      minMa
37a40 78 46 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f 52  xFlag = WHERE_OR
37a50 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  DERBY_NORMAL;.  
37a60 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
37a70 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e   i<sAggInfo.nFun
37a80 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  c; i++){.      a
37a90 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
37aa0 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f  roperty(sAggInfo
37ab0 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c  .aFunc[i].pExpr,
37ac0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
37ad0 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c  ;.      sNC.ncFl
37ae0 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46  ags |= NC_InAggF
37af0 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  unc;.      sqlit
37b00 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
37b10 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49  List(&sNC, sAggI
37b20 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
37b30 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
37b40 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
37b50 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63  &= ~NC_InAggFunc
37b60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67  ;.    }.    sAgg
37b70 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61  Info.mxReg = pPa
37b80 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
37b90 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
37ba0 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
37bb0 74 5f 65 6e 64 3b 0a 23 69 66 20 53 45 4c 45 43  t_end;.#if SELEC
37bc0 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
37bd0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
37be0 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34 30  lectTrace & 0x40
37bf0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
37c00 69 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54  i;.      SELECTT
37c10 52 41 43 45 28 30 78 34 30 30 2c 70 50 61 72 73  RACE(0x400,pPars
37c20 65 2c 70 2c 28 22 41 66 74 65 72 20 61 67 67 72  e,p,("After aggr
37c30 65 67 61 74 65 20 61 6e 61 6c 79 73 69 73 3a 5c  egate analysis:\
37c40 6e 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  n"));.      sqli
37c50 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
37c60 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  t(0, p, 0);.    
37c70 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73    for(ii=0; ii<s
37c80 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
37c90 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
37ca0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
37cb0 74 66 28 22 61 67 67 2d 63 6f 6c 75 6d 6e 5b 25  tf("agg-column[%
37cc0 64 5d 20 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20  d] iMem=%d\n",. 
37cd0 20 20 20 20 20 20 20 20 20 20 20 69 69 2c 20 73             ii, s
37ce0 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d  AggInfo.aCol[ii]
37cf0 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  .iMem);.        
37d00 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 45  sqlite3TreeViewE
37d10 78 70 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e  xpr(0, sAggInfo.
37d20 61 43 6f 6c 5b 69 69 5d 2e 70 45 78 70 72 2c 20  aCol[ii].pExpr, 
37d30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
37d40 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73    for(ii=0; ii<s
37d50 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69  AggInfo.nFunc; i
37d60 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
37d70 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
37d80 28 22 61 67 67 2d 66 75 6e 63 5b 25 64 5d 3a 20  ("agg-func[%d]: 
37d90 69 4d 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  iMem=%d\n",.    
37da0 20 20 20 20 20 20 20 20 69 69 2c 20 73 41 67 67          ii, sAgg
37db0 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 69  Info.aFunc[ii].i
37dc0 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Mem);.        sq
37dd0 6c 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70  lite3TreeViewExp
37de0 72 28 30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  r(0, sAggInfo.aF
37df0 75 6e 63 5b 69 69 5d 2e 70 45 78 70 72 2c 20 30  unc[ii].pExpr, 0
37e00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
37e10 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20 2f 2a  .#endif...    /*
37e20 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   Processing for 
37e30 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20  aggregates with 
37e40 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79  GROUP BY is very
37e50 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20   different and. 
37e60 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20     ** much more 
37e70 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67  complex than agg
37e80 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20  regates without 
37e90 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20  a GROUP BY..    
37ea0 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75  */.    if( pGrou
37eb0 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79  pBy ){.      Key
37ec0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20  Info *pKeyInfo; 
37ed0 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72   /* Keying infor
37ee0 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67  mation for the g
37ef0 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a  roup by clause *
37f00 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
37f10 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  1;          /* A
37f20 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f  -vs-B comparisio
37f30 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20  n jump */.      
37f40 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f  int addrOutputRo
37f50 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  w;  /* Start of 
37f60 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20  subroutine that 
37f70 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74  outputs a result
37f80 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e   row */.      in
37f90 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20  t regOutputRow; 
37fa0 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72    /* Return addr
37fb0 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
37fc0 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
37fd0 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ne */.      int 
37fe0 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20  addrSetAbort;   
37ff0 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74  /* Set the abort
38000 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e   flag and return
38010 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
38020 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a  drTopOfLoop;  /*
38030 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75   Top of the inpu
38040 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  t loop */.      
38050 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49  int addrSortingI
38060 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70  dx; /* The OP_Op
38070 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20  enEphemeral for 
38080 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
38090 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  x */.      int a
380a0 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  ddrReset;      /
380b0 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  * Subroutine for
380c0 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61   resetting the a
380d0 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20  ccumulator */.  
380e0 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74      int regReset
380f0 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  ;       /* Retur
38100 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
38110 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62  er for reset sub
38120 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20  routine */..    
38130 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
38140 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
38150 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64  se we might need
38160 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
38170 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70   to.      ** imp
38180 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f  lement it.  Allo
38190 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e  cate that sortin
381a0 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66  g index now.  If
381b0 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20   it turns out.  
381c0 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
381d0 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66  o not need it af
381e0 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f  ter all, the OP_
381f0 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72  SorterOpen instr
38200 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  uction.      ** 
38210 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65  will be converte
38220 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20  d into a Noop.  
38230 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
38240 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
38250 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
38260 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79  ab++;.      pKey
38270 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
38280 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
38290 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20  e, pGroupBy, 0, 
382a0 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
382b0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72  );.      addrSor
382c0 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65  tingIdx = sqlite
382d0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
382e0 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20  P_SorterOpen, . 
382f0 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66           sAggInf
38300 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41  o.sortingIdx, sA
38310 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
38320 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20  olumn, .        
38330 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79    0, (char*)pKey
38340 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
38350 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69  );..      /* Ini
38360 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c  tialize memory l
38370 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79  ocations used by
38380 20 47 52 4f 55 50 20 42 5