/ Hex Artifact Content
Login

Artifact 82aa95aa1cfeadef5ecae1126afff1efca64c49050bbf7116425a8a1d4fc5e6c:


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 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
0ec0: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
0ed0: 43 0a 20 20 20 20 69 66 28 20 4f 4b 5f 49 46 5f  C.    if( OK_IF_
0ee0: 41 4c 57 41 59 53 5f 54 52 55 45 28 70 2d 3e 70  ALWAYS_TRUE(p->p
0ef0: 57 69 6e 44 65 66 6e 29 20 29 7b 0a 20 20 20 20  WinDefn) ){.    
0f00: 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c    sqlite3WindowL
0f10: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
0f20: 3e 70 57 69 6e 44 65 66 6e 29 3b 0a 20 20 20 20  >pWinDefn);.    
0f30: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
0f40: 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52   OK_IF_ALWAYS_TR
0f50: 55 45 28 70 2d 3e 70 57 69 74 68 29 20 29 20 73  UE(p->pWith) ) s
0f60: 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74 65  qlite3WithDelete
0f70: 28 64 62 2c 20 70 2d 3e 70 57 69 74 68 29 3b 0a  (db, p->pWith);.
0f80: 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29 20      if( bFree ) 
0f90: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
0fa0: 64 62 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20  db, p);.    p = 
0fb0: 70 50 72 69 6f 72 3b 0a 20 20 20 20 62 46 72 65  pPrior;.    bFre
0fc0: 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 1;.  }.}../*
0fd0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
0fe0: 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75   SelectDest stru
0ff0: 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cture..*/.void s
1000: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
1010: 49 6e 69 74 28 53 65 6c 65 63 74 44 65 73 74 20  Init(SelectDest 
1020: 2a 70 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73  *pDest, int eDes
1030: 74 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20  t, int iParm){. 
1040: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20   pDest->eDest = 
1050: 28 75 38 29 65 44 65 73 74 3b 0a 20 20 70 44 65  (u8)eDest;.  pDe
1060: 73 74 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69 50  st->iSDParm = iP
1070: 61 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 7a 41  arm;.  pDest->zA
1080: 66 66 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44  ffSdst = 0;.  pD
1090: 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a  est->iSdst = 0;.
10a0: 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
10b0: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c   0;.}.../*.** Al
10c0: 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 53 65 6c  locate a new Sel
10d0: 65 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e  ect structure an
10e0: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
10f0: 65 72 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74  er to that.** st
1100: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65  ructure..*/.Sele
1110: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
1120: 74 4e 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70  tNew(.  Parse *p
1130: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
1140: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
1150: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
1160: 70 45 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77  pEList,     /* w
1170: 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  hich columns to 
1180: 69 6e 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72  include in the r
1190: 65 73 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69  esult */.  SrcLi
11a0: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
11b0: 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   /* the FROM cla
11c0: 75 73 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62  use -- which tab
11d0: 6c 65 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20  les to scan */. 
11e0: 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
11f0: 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48         /* the WH
1200: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1210: 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
1220: 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f  By,   /* the GRO
1230: 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  UP BY clause */.
1240: 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c    Expr *pHaving,
1250: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48          /* the H
1260: 41 56 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a  AVING clause */.
1270: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
1280: 65 72 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f  erBy,   /* the O
1290: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
12a0: 2f 0a 20 20 75 33 32 20 73 65 6c 46 6c 61 67 73  /.  u32 selFlags
12b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61  ,         /* Fla
12c0: 67 20 70 61 72 61 6d 65 74 65 72 73 2c 20 73 75  g parameters, su
12d0: 63 68 20 61 73 20 53 46 5f 44 69 73 74 69 6e 63  ch as SF_Distinc
12e0: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69  t */.  Expr *pLi
12f0: 6d 69 74 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mit          /* 
1300: 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55  LIMIT value.  NU
1310: 4c 4c 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65  LL means not use
1320: 64 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  d */.){.  Select
1330: 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
1340: 20 73 74 61 6e 64 69 6e 3b 0a 20 20 70 4e 65 77   standin;.  pNew
1350: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1360: 6f 63 52 61 77 4e 4e 28 70 50 61 72 73 65 2d 3e  ocRawNN(pParse->
1370: 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
1380: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
1390: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
13a0: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
13b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
13c0: 20 20 70 4e 65 77 20 3d 20 26 73 74 61 6e 64 69    pNew = &standi
13d0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c  n;.  }.  if( pEL
13e0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45  ist==0 ){.    pE
13f0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
1400: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
1410: 72 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  rse, 0,.        
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1440: 65 33 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64  e3Expr(pParse->d
1450: 62 2c 54 4b 5f 41 53 54 45 52 49 53 4b 2c 30 29  b,TK_ASTERISK,0)
1460: 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70  );.  }.  pNew->p
1470: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
1480: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f    pNew->op = TK_
1490: 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e  SELECT;.  pNew->
14a0: 73 65 6c 46 6c 61 67 73 20 3d 20 73 65 6c 46 6c  selFlags = selFl
14b0: 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69  ags;.  pNew->iLi
14c0: 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  mit = 0;.  pNew-
14d0: 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 23 69  >iOffset = 0;.#i
14e0: 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
14f0: 41 42 4c 45 44 0a 20 20 70 4e 65 77 2d 3e 7a 53  ABLED.  pNew->zS
1500: 65 6c 4e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 23  elName[0] = 0;.#
1510: 65 6e 64 69 66 0a 20 20 70 4e 65 77 2d 3e 61 64  endif.  pNew->ad
1520: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
1530: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72  -1;.  pNew->addr
1540: 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 2d 31  OpenEphm[1] = -1
1550: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 6c 65 63  ;.  pNew->nSelec
1560: 74 52 6f 77 20 3d 20 30 3b 0a 20 20 69 66 28 20  tRow = 0;.  if( 
1570: 70 53 72 63 3d 3d 30 20 29 20 70 53 72 63 20 3d  pSrc==0 ) pSrc =
1580: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1590: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c  Zero(pParse->db,
15a0: 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 3b   sizeof(*pSrc));
15b0: 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20  .  pNew->pSrc = 
15c0: 70 53 72 63 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  pSrc;.  pNew->pW
15d0: 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b 0a 20  here = pWhere;. 
15e0: 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
15f0: 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 4e  = pGroupBy;.  pN
1600: 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 70 48  ew->pHaving = pH
1610: 61 76 69 6e 67 3b 0a 20 20 70 4e 65 77 2d 3e 70  aving;.  pNew->p
1620: 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
1630: 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69  By;.  pNew->pPri
1640: 6f 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  or = 0;.  pNew->
1650: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4e 65  pNext = 0;.  pNe
1660: 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d  w->pLimit = pLim
1670: 69 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 69 74  it;.  pNew->pWit
1680: 68 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  h = 0;.#ifndef S
1690: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
16a0: 57 46 55 4e 43 0a 20 20 70 4e 65 77 2d 3e 70 57  WFUNC.  pNew->pW
16b0: 69 6e 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  in = 0;.  pNew->
16c0: 70 57 69 6e 44 65 66 6e 20 3d 20 30 3b 0a 23 65  pWinDefn = 0;.#e
16d0: 6e 64 69 66 0a 20 20 69 66 28 20 70 50 61 72 73  ndif.  if( pPars
16e0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
16f0: 6c 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61  led ) {.    clea
1700: 72 53 65 6c 65 63 74 28 70 50 61 72 73 65 2d 3e  rSelect(pParse->
1710: 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d  db, pNew, pNew!=
1720: 26 73 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70  &standin);.    p
1730: 4e 65 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  New = 0;.  }else
1740: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
1750: 65 77 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70  ew->pSrc!=0 || p
1760: 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b  Parse->nErr>0 );
1770: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1780: 4e 65 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b  New!=&standin );
1790: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
17a0: 7d 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  }..#if SELECTTRA
17b0: 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a  CE_ENABLED./*.**
17c0: 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
17d0: 20 61 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74   a Select object
17e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17f0: 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 53 65  SelectSetName(Se
1800: 6c 65 63 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63  lect *p, const c
1810: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
1820: 66 28 20 70 20 26 26 20 7a 4e 61 6d 65 20 29 7b  f( p && zName ){
1830: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
1840: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
1850: 7a 53 65 6c 4e 61 6d 65 29 2c 20 70 2d 3e 7a 53  zSelName), p->zS
1860: 65 6c 4e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 4e  elName, "%s", zN
1870: 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  ame);.  }.}.#end
1880: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  if.../*.** Delet
1890: 65 20 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65  e the given Sele
18a0: 63 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ct structure and
18b0: 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73   all of its subs
18c0: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f  tructures..*/.vo
18d0: 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
18e0: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
18f0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  db, Select *p){.
1900: 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41    if( OK_IF_ALWA
1910: 59 53 5f 54 52 55 45 28 70 29 20 29 20 63 6c 65  YS_TRUE(p) ) cle
1920: 61 72 53 65 6c 65 63 74 28 64 62 2c 20 70 2c 20  arSelect(db, p, 
1930: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  1);.}../*.** Ret
1940: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1950: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
1960: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1970: 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a   in a compound..
1980: 2a 2f 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74  */.static Select
1990: 20 2a 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28   *findRightmost(
19a0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 77 68  Select *p){.  wh
19b0: 69 6c 65 28 20 70 2d 3e 70 4e 65 78 74 20 29 20  ile( p->pNext ) 
19c0: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
19d0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
19e0: 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20  ** Given 1 to 3 
19f0: 69 64 65 6e 74 69 66 69 65 72 73 20 70 72 65 63  identifiers prec
1a00: 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b  eding the JOIN k
1a10: 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e  eyword, determin
1a20: 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66  e the.** type of
1a30: 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61   join.  Return a
1a40: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
1a50: 6e 74 20 74 68 61 74 20 65 78 70 72 65 73 73 65  nt that expresse
1a60: 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69  s that type.** i
1a70: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
1a80: 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c  ollowing bit val
1a90: 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a  ues:.**.**     J
1aa0: 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a  T_INNER.**     J
1ab0: 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a  T_CROSS.**     J
1ac0: 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a  T_OUTER.**     J
1ad0: 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20  T_NATURAL.**    
1ae0: 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20   JT_LEFT.**     
1af0: 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41  JT_RIGHT.**.** A
1b00: 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e   full outer join
1b10: 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74   is the combinat
1b20: 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61  ion of JT_LEFT a
1b30: 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a  nd JT_RIGHT..**.
1b40: 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c  ** If an illegal
1b50: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
1b60: 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65 65  join type is see
1b70: 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  n, then still re
1b80: 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74  turn.** a join t
1b90: 79 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20  ype, but put an 
1ba0: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61  error in the pPa
1bb0: 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
1bc0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69  /.int sqlite3Joi
1bd0: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
1be0: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20  rse, Token *pA, 
1bf0: 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e  Token *pB, Token
1c00: 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69   *pC){.  int joi
1c10: 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b  ntype = 0;.  Tok
1c20: 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20  en *apAll[3];.  
1c30: 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20  Token *p;.      
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 20 20 20 20 20 20 2f 2a 20 20 20 30 31 32 33         /*   0123
1c60: 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39  456789 123456789
1c70: 20 31 32 33 34 35 36 37 38 39 20 31 32 33 20 2a   123456789 123 *
1c80: 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
1c90: 20 63 68 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d   char zKeyText[]
1ca0: 20 3d 20 22 6e 61 74 75 72 61 6c 65 66 74 6f 75   = "naturaleftou
1cb0: 74 65 72 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72  terightfullinner
1cc0: 63 72 6f 73 73 22 3b 0a 20 20 73 74 61 74 69 63  cross";.  static
1cd0: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
1ce0: 20 20 20 20 75 38 20 69 3b 20 20 20 20 20 20 20      u8 i;       
1cf0: 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66   /* Beginning of
1d00: 20 6b 65 79 77 6f 72 64 20 74 65 78 74 20 69 6e   keyword text in
1d10: 20 7a 4b 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20   zKeyText[] */. 
1d20: 20 20 20 75 38 20 6e 43 68 61 72 3b 20 20 20 20     u8 nChar;    
1d30: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65  /* Length of the
1d40: 20 6b 65 79 77 6f 72 64 20 69 6e 20 63 68 61 72   keyword in char
1d50: 61 63 74 65 72 73 20 2a 2f 0a 20 20 20 20 75 38  acters */.    u8
1d60: 20 63 6f 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f   code;     /* Jo
1d70: 69 6e 20 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a  in type mask */.
1d80: 20 20 7d 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d    } aKeyword[] =
1d90: 20 7b 0a 20 20 20 20 2f 2a 20 6e 61 74 75 72 61   {.    /* natura
1da0: 6c 20 2a 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54  l */ { 0,  7, JT
1db0: 5f 4e 41 54 55 52 41 4c 20 20 20 20 20 20 20 20  _NATURAL        
1dc0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
1dd0: 2a 20 6c 65 66 74 20 20 20 20 2a 2f 20 7b 20 36  * left    */ { 6
1de0: 2c 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54  ,  4, JT_LEFT|JT
1df0: 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 20  _OUTER          
1e00: 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75 74 65 72 20  },.    /* outer 
1e10: 20 20 2a 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54    */ { 10, 5, JT
1e20: 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 20  _OUTER          
1e30: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
1e40: 2a 20 72 69 67 68 74 20 20 20 2a 2f 20 7b 20 31  * right   */ { 1
1e50: 34 2c 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a  4, 5, JT_RIGHT|J
1e60: 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20 20  T_OUTER         
1e70: 7d 2c 0a 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20  },.    /* full  
1e80: 20 20 2a 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54    */ { 19, 4, JT
1e90: 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a  _LEFT|JT_RIGHT|J
1ea0: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f  T_OUTER },.    /
1eb0: 2a 20 69 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32  * inner   */ { 2
1ec0: 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20  3, 5, JT_INNER  
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee0: 7d 2c 0a 20 20 20 20 2f 2a 20 63 72 6f 73 73 20  },.    /* cross 
1ef0: 20 20 2a 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54    */ { 28, 5, JT
1f00: 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20  _INNER|JT_CROSS 
1f10: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a          },.  };.
1f20: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70    int i, j;.  ap
1f30: 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61  All[0] = pA;.  a
1f40: 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20  pAll[1] = pB;.  
1f50: 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20  apAll[2] = pC;. 
1f60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26   for(i=0; i<3 &&
1f70: 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b   apAll[i]; i++){
1f80: 0a 20 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69  .    p = apAll[i
1f90: 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ];.    for(j=0; 
1fa0: 6a 3c 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79  j<ArraySize(aKey
1fb0: 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20  word); j++){.   
1fc0: 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65     if( p->n==aKe
1fd0: 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a  yword[j].nChar .
1fe0: 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
1ff0: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
2000: 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54  ar*)p->z, &zKeyT
2010: 65 78 74 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e  ext[aKeyword[j].
2020: 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a  i], p->n)==0 ){.
2030: 20 20 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65          jointype
2040: 20 7c 3d 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e   |= aKeyword[j].
2050: 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72  code;.        br
2060: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2070: 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
2080: 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c   j==0 || j==1 ||
2090: 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c   j==2 || j==3 ||
20a0: 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c   j==4 || j==5 ||
20b0: 20 6a 3d 3d 36 20 29 3b 0a 20 20 20 20 69 66 28   j==6 );.    if(
20c0: 20 6a 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4b   j>=ArraySize(aK
20d0: 65 79 77 6f 72 64 29 20 29 7b 0a 20 20 20 20 20  eyword) ){.     
20e0: 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f   jointype |= JT_
20f0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
2100: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
2110: 69 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79  if(.     (jointy
2120: 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a  pe & (JT_INNER|J
2130: 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49  T_OUTER))==(JT_I
2140: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c  NNER|JT_OUTER) |
2150: 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  |.     (jointype
2160: 20 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a   & JT_ERROR)!=0.
2170: 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63    ){.    const c
2180: 68 61 72 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a  har *zSp = " ";.
2190: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 21 3d      assert( pB!=
21a0: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 3d  0 );.    if( pC=
21b0: 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20  =0 ){ zSp++; }. 
21c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
21d0: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
21e0: 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  own or unsupport
21f0: 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a  ed join type: ".
2200: 20 20 20 20 20 20 20 22 25 54 20 25 54 25 73 25         "%T %T%s%
2210: 54 22 2c 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c  T", pA, pB, zSp,
2220: 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79   pC);.    jointy
2230: 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20  pe = JT_INNER;. 
2240: 20 7d 65 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e   }else if( (join
2250: 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
2260: 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  !=0 .         &&
2270: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54   (jointype & (JT
2280: 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 29 29  _LEFT|JT_RIGHT))
2290: 21 3d 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20  !=JT_LEFT ){.   
22a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
22b0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
22c0: 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20  "RIGHT and FULL 
22d0: 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20  OUTER JOINs are 
22e0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75  not currently su
22f0: 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a  pported");.    j
2300: 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e  ointype = JT_INN
2310: 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
2320: 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a   jointype;.}../*
2330: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
2340: 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  ndex of a column
2350: 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65   in a table.  Re
2360: 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63  turn -1 if the c
2370: 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20  olumn.** is not 
2380: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
2390: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
23a0: 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65  c int columnInde
23b0: 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  x(Table *pTab, c
23c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29  onst char *zCol)
23d0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
23e0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
23f0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
2400: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
2410: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (pTab->aCol[i].z
2420: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
2430: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
2440: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
2450: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20  *.** Search the 
2460: 66 69 72 73 74 20 4e 20 74 61 62 6c 65 73 20 69  first N tables i
2470: 6e 20 70 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66  n pSrc, from lef
2480: 74 20 74 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b  t to right, look
2490: 69 6e 67 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62  ing for a.** tab
24a0: 6c 65 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  le that has a co
24b0: 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e  lumn named zCol.
24c0: 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f    .**.** When fo
24d0: 75 6e 64 2c 20 73 65 74 20 2a 70 69 54 61 62 20  und, set *piTab 
24e0: 61 6e 64 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68  and *piCol to th
24f0: 65 20 74 61 62 6c 65 20 69 6e 64 65 78 20 61 6e  e table index an
2500: 64 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a  d column index.*
2510: 2a 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e  * of the matchin
2520: 67 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74  g column and ret
2530: 75 72 6e 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20  urn TRUE..**.** 
2540: 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65  If not found, re
2550: 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73  turn FALSE..*/.s
2560: 74 61 74 69 63 20 69 6e 74 20 74 61 62 6c 65 41  tatic int tableA
2570: 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20  ndColumnIndex(. 
2580: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
2590: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
25a0: 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 61 72  f tables to sear
25b0: 63 68 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  ch */.  int N,  
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25d0: 4e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  Number of tables
25e0: 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f   in pSrc->a[] to
25f0: 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e   search */.  con
2600: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20  st char *zCol,  
2610: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2620: 20 63 6f 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c   column we are l
2630: 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  ooking for */.  
2640: 69 6e 74 20 2a 70 69 54 61 62 2c 20 20 20 20 20  int *piTab,     
2650: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e       /* Write in
2660: 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d  dex of pSrc->a[]
2670: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   here */.  int *
2680: 70 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20  piCol           
2690: 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f  /* Write index o
26a0: 66 20 70 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62  f pSrc->a[*piTab
26b0: 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68  ].pTab->aCol[] h
26c0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
26d0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
26e0: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
26f0: 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70  over tables in p
2700: 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  Src */.  int iCo
2710: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l;            /*
2720: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
2730: 20 6d 61 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a   matching zCol *
2740: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 69  /..  assert( (pi
2750: 54 61 62 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d  Tab==0)==(piCol=
2760: 3d 30 29 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20  =0) );  /* Both 
2770: 6f 72 20 6e 65 69 74 68 65 72 20 61 72 65 20 4e  or neither are N
2780: 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ULL */.  for(i=0
2790: 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<N; i++){.   
27a0: 20 69 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e   iCol = columnIn
27b0: 64 65 78 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  dex(pSrc->a[i].p
27c0: 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  Tab, zCol);.    
27d0: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
27e0: 20 20 20 20 20 69 66 28 20 70 69 54 61 62 20 29       if( piTab )
27f0: 7b 0a 20 20 20 20 20 20 20 20 2a 70 69 54 61 62  {.        *piTab
2800: 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 2a 70   = i;.        *p
2810: 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  iCol = iCol;.   
2820: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
2830: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
2840: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2850: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2860: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64  n is used to add
2870: 20 74 65 72 6d 73 20 69 6d 70 6c 69 65 64 20 62   terms implied b
2880: 79 20 4a 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f  y JOIN syntax to
2890: 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
28a0: 61 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  ause expression 
28b0: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
28c0: 65 6d 65 6e 74 2e 20 54 68 65 20 6e 65 77 20 74  ement. The new t
28d0: 65 72 6d 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73  erm, which.** is
28e0: 20 41 4e 44 65 64 20 77 69 74 68 20 74 68 65 20   ANDed with the 
28f0: 65 78 69 73 74 69 6e 67 20 57 48 45 52 45 20 63  existing WHERE c
2900: 6c 61 75 73 65 2c 20 69 73 20 6f 66 20 74 68 65  lause, is of the
2910: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
2920: 28 74 61 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62  (tab1.col1 = tab
2930: 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68  2.col2).**.** wh
2940: 65 72 65 20 74 61 62 31 20 69 73 20 74 68 65 20  ere tab1 is the 
2950: 69 53 72 63 27 74 68 20 74 61 62 6c 65 20 69 6e  iSrc'th table in
2960: 20 53 72 63 4c 69 73 74 20 70 53 72 63 20 61 6e   SrcList pSrc an
2970: 64 20 74 61 62 32 20 69 73 20 74 68 65 20 0a 2a  d tab2 is the .*
2980: 2a 20 28 69 53 72 63 2b 31 29 27 74 68 2e 20 43  * (iSrc+1)'th. C
2990: 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f  olumn col1 is co
29a0: 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66  lumn iColLeft of
29b0: 20 74 61 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20   tab1, and col2 
29c0: 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f  is.** column iCo
29d0: 6c 52 69 67 68 74 20 6f 66 20 74 61 62 32 2e 0a  lRight of tab2..
29e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
29f0: 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20 20 50  ddWhereTerm(.  P
2a00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a20: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
2a30: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
2a40: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
2a50: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
2a60: 66 20 74 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d  f tables in FROM
2a70: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
2a80: 20 69 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20   iLeft,         
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2aa0: 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 74  Index of first t
2ab0: 61 62 6c 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20  able to join in 
2ac0: 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43  pSrc */.  int iC
2ad0: 6f 6c 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20  olLeft,         
2ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2af0: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20  ex of column in 
2b00: 66 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20  first table */. 
2b10: 20 69 6e 74 20 69 52 69 67 68 74 2c 20 20 20 20   int iRight,    
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 65 63   /* Index of sec
2b40: 6f 6e 64 20 74 61 62 6c 65 20 69 6e 20 70 53 72  ond table in pSr
2b50: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52  c */.  int iColR
2b60: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
2b70: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2b80: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63  of column in sec
2b90: 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ond table */.  i
2ba0: 6e 74 20 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20  nt isOuterJoin, 
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bc0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2bd0: 73 20 61 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20  s an OUTER join 
2be0: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68  */.  Expr **ppWh
2bf0: 65 72 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ere             
2c00: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
2c10: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2c20: 20 74 6f 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b   to add to */.){
2c30: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2c40: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
2c50: 78 70 72 20 2a 70 45 31 3b 0a 20 20 45 78 70 72  xpr *pE1;.  Expr
2c60: 20 2a 70 45 32 3b 0a 20 20 45 78 70 72 20 2a 70   *pE2;.  Expr *p
2c70: 45 71 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  Eq;..  assert( i
2c80: 4c 65 66 74 3c 69 52 69 67 68 74 20 29 3b 0a 20  Left<iRight );. 
2c90: 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 6e   assert( pSrc->n
2ca0: 53 72 63 3e 69 52 69 67 68 74 20 29 3b 0a 20 20  Src>iRight );.  
2cb0: 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b  assert( pSrc->a[
2cc0: 69 4c 65 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20  iLeft].pTab );. 
2cd0: 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61   assert( pSrc->a
2ce0: 5b 69 52 69 67 68 74 5d 2e 70 54 61 62 20 29 3b  [iRight].pTab );
2cf0: 0a 0a 20 20 70 45 31 20 3d 20 73 71 6c 69 74 65  ..  pE1 = sqlite
2d00: 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70  3CreateColumnExp
2d10: 72 28 64 62 2c 20 70 53 72 63 2c 20 69 4c 65 66  r(db, pSrc, iLef
2d20: 74 2c 20 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20  t, iColLeft);.  
2d30: 70 45 32 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pE2 = sqlite3Cre
2d40: 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62  ateColumnExpr(db
2d50: 2c 20 70 53 72 63 2c 20 69 52 69 67 68 74 2c 20  , pSrc, iRight, 
2d60: 69 43 6f 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70  iColRight);..  p
2d70: 45 71 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  Eq = sqlite3PExp
2d80: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c  r(pParse, TK_EQ,
2d90: 20 70 45 31 2c 20 70 45 32 29 3b 0a 20 20 69 66   pE1, pE2);.  if
2da0: 28 20 70 45 71 20 26 26 20 69 73 4f 75 74 65 72  ( pEq && isOuter
2db0: 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78 70 72  Join ){.    Expr
2dc0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 71 2c  SetProperty(pEq,
2dd0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
2de0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2df0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 71 2c  HasProperty(pEq,
2e00: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
2e10: 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
2e20: 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
2e30: 72 74 79 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65  rty(pEq, EP_NoRe
2e40: 64 75 63 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e  duce);.    pEq->
2e50: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
2e60: 3d 20 28 69 31 36 29 70 45 32 2d 3e 69 54 61 62  = (i16)pE2->iTab
2e70: 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65  le;.  }.  *ppWhe
2e80: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
2e90: 41 6e 64 28 64 62 2c 20 2a 70 70 57 68 65 72 65  And(db, *ppWhere
2ea0: 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , pEq);.}../*.**
2eb0: 20 53 65 74 20 74 68 65 20 45 50 5f 46 72 6f 6d   Set the EP_From
2ec0: 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e  Join property on
2ed0: 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
2ee0: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
2ef0: 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74  on..** And set t
2f00: 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  he Expr.iRightJo
2f10: 69 6e 54 61 62 6c 65 20 74 6f 20 69 54 61 62 6c  inTable to iTabl
2f20: 65 20 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d  e for every term
2f30: 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72 65   in the.** expre
2f40: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ssion..**.** The
2f50: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f   EP_FromJoin pro
2f60: 70 65 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e  perty is used on
2f70: 20 74 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70   terms of an exp
2f80: 72 65 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a  ression to tell.
2f90: 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45  ** the LEFT OUTE
2fa0: 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e  R JOIN processin
2fb0: 67 20 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69  g logic that thi
2fc0: 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f  s term is part o
2fd0: 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65  f the.** join re
2fe0: 73 74 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66  striction specif
2ff0: 69 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ied in the ON or
3000: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e   USING clause an
3010: 64 20 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20  d not a part.** 
3020: 6f 66 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65  of the more gene
3030: 72 61 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65  ral WHERE clause
3040: 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 61  .  These terms a
3050: 72 65 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f  re moved over to
3060: 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
3070: 61 75 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e  ause during join
3080: 20 70 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20   processing but 
3090: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  we need to remem
30a0: 62 65 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a  ber that they.**
30b0: 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74   originated in t
30c0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
30d0: 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lause..**.** The
30e0: 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e   Expr.iRightJoin
30f0: 54 61 62 6c 65 20 74 65 6c 6c 73 20 74 68 65 20  Table tells the 
3100: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
3110: 63 65 73 73 69 6e 67 20 74 68 61 74 20 74 68 65  cessing that the
3120: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64  .** expression d
3130: 65 70 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20  epends on table 
3140: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
3150: 65 76 65 6e 20 69 66 20 74 68 61 74 20 74 61 62  even if that tab
3160: 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70  le is not.** exp
3170: 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65  licitly mentione
3180: 64 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73  d in the express
3190: 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f 72  ion.  That infor
31a0: 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65 64 65 64  mation is needed
31b0: 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73 20 6c 69  .** for cases li
31c0: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
31d0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
31e0: 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
31f0: 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44  ON t1.a=t2.b AND
3200: 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68   t1.x=5.**.** Th
3210: 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20 6e  e where clause n
3220: 65 65 64 73 20 74 6f 20 64 65 66 65 72 20 74 68  eeds to defer th
3230: 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68  e handling of th
3240: 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d  e t1.x=5.** term
3250: 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65   until after the
3260: 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20   t2 loop of the 
3270: 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61 74 20 77  join.  In that w
3280: 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32  ay, a.** NULL t2
3290: 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e 73   row will be ins
32a0: 65 72 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  erted whenever t
32b0: 31 2e 78 21 3d 35 2e 20 20 49 66 20 77 65 20 64  1.x!=5.  If we d
32c0: 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74  o not.** defer t
32d0: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74  he handling of t
32e0: 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62  1.x=5, it will b
32f0: 65 20 70 72 6f 63 65 73 73 65 64 20 69 6d 6d 65  e processed imme
3300: 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72  diately.** after
3310: 20 74 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64   the t1 loop and
3320: 20 72 6f 77 73 20 77 69 74 68 20 74 31 2e 78 21   rows with t1.x!
3330: 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 70  =5 will never ap
3340: 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f  pear in.** the o
3350: 75 74 70 75 74 2c 20 77 68 69 63 68 20 69 73 20  utput, which is 
3360: 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74  incorrect..*/.st
3370: 61 74 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69  atic void setJoi
3380: 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69  nExpr(Expr *p, i
3390: 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68  nt iTable){.  wh
33a0: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78  ile( p ){.    Ex
33b0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c  prSetProperty(p,
33c0: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20   EP_FromJoin);. 
33d0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
33e0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45  HasProperty(p, E
33f0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
3400: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45  educed) );.    E
3410: 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
3420: 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  y(p, EP_NoReduce
3430: 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69 67 68 74  );.    p->iRight
3440: 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36  JoinTable = (i16
3450: 29 69 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28  )iTable;.    if(
3460: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54   p->op==TK_FUNCT
3470: 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73  ION && p->x.pLis
3480: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
3490: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
34a0: 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e   i<p->x.pList->n
34b0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
34c0: 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
34d0: 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  p->x.pList->a[i]
34e0: 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 29 3b  .pExpr, iTable);
34f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3500: 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70     setJoinExpr(p
3510: 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 29  ->pLeft, iTable)
3520: 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69  ;.    p = p->pRi
3530: 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 20  ght;.  } .}../* 
3540: 55 6e 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  Undo the work of
3550: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 29 2e 20   setJoinExpr(). 
3560: 20 49 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   In the expressi
3570: 6f 6e 20 74 72 65 65 20 70 2c 20 63 6f 6e 76 65  on tree p, conve
3580: 72 74 20 65 76 65 72 79 0a 2a 2a 20 74 65 72 6d  rt every.** term
3590: 20 74 68 61 74 20 69 73 20 6d 61 72 6b 65 64 20   that is marked 
35a0: 77 69 74 68 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  with EP_FromJoin
35b0: 20 61 6e 64 20 69 52 69 67 68 74 4a 6f 69 6e 54   and iRightJoinT
35c0: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 69 6e 74  able==iTable int
35d0: 6f 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79  o.** an ordinary
35e0: 20 74 65 72 6d 20 74 68 61 74 20 6f 6d 69 74 73   term that omits
35f0: 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e   the EP_FromJoin
3600: 20 6d 61 72 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   mark..**.** Thi
3610: 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61  s happens when a
3620: 20 4c 45 46 54 20 4a 4f 49 4e 20 69 73 20 73 69   LEFT JOIN is si
3630: 6d 70 6c 69 66 69 65 64 20 69 6e 74 6f 20 61 6e  mplified into an
3640: 20 6f 72 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 0a   ordinary JOIN..
3650: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
3660: 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70  nsetJoinExpr(Exp
3670: 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  r *p, int iTable
3680: 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  ){.  while( p ){
3690: 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
36a0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
36b0: 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26  romJoin).     &&
36c0: 20 28 69 54 61 62 6c 65 3c 30 20 7c 7c 20 70 2d   (iTable<0 || p-
36d0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
36e0: 3d 3d 69 54 61 62 6c 65 29 20 29 7b 0a 20 20 20  ==iTable) ){.   
36f0: 20 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70     ExprClearProp
3700: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
3710: 6f 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  oin);.    }.    
3720: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55  if( p->op==TK_FU
3730: 4e 43 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70  NCTION && p->x.p
3740: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  List ){.      in
3750: 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
3760: 3d 30 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74  =0; i<p->x.pList
3770: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
3780: 20 20 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e         unsetJoin
3790: 45 78 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d  Expr(p->x.pList-
37a0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61  >a[i].pExpr, iTa
37b0: 62 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ble);.      }.  
37c0: 20 20 7d 0a 20 20 20 20 75 6e 73 65 74 4a 6f 69    }.    unsetJoi
37d0: 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  nExpr(p->pLeft, 
37e0: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d  iTable);.    p =
37f0: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
3800: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
3810: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
3820: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
3830: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
3840: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
3850: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
3860: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
3870: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
3880: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
3890: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
38a0: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
38b0: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
38c0: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
38d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73  .**.** The terms
38e0: 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
38f0: 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  e are contained 
3900: 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  in the Select.pS
3910: 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  rc structure..**
3920: 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74   The left most t
3930: 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73  able is the firs
3940: 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63  t entry in Selec
3950: 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67  t.pSrc.  The rig
3960: 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65  ht-most.** table
3970: 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
3980: 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70  ry.  The join op
3990: 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69  erator is held i
39a0: 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a  n the entry to.*
39b0: 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75  * the left.  Thu
39c0: 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69  s entry 0 contai
39d0: 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ns the join oper
39e0: 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69  ator for the joi
39f0: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74  n between.** ent
3a00: 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41  ries 0 and 1.  A
3a10: 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ny ON or USING c
3a20: 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65  lauses associate
3a30: 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20  d with the join 
3a40: 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61  are.** also atta
3a50: 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
3a60: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
3a70: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
3a80: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
3a90: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
3aa0: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
3ab0: 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  nt sqliteProcess
3ac0: 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  Join(Parse *pPar
3ad0: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
3ae0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b00: 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20    /* All tables 
3b10: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
3b20: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  se */.  int i, j
3b30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3b40: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
3b50: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74  counters */.  st
3b60: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
3b70: 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a  m *pLeft;     /*
3b80: 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e   Left table bein
3b90: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74  g joined */.  st
3ba0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
3bb0: 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a  m *pRight;    /*
3bc0: 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69   Right table bei
3bd0: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20  ng joined */..  
3be0: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
3bf0: 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d    pLeft = &pSrc-
3c00: 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20  >a[0];.  pRight 
3c10: 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66  = &pLeft[1];.  f
3c20: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
3c30: 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69  nSrc-1; i++, pRi
3c40: 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b  ght++, pLeft++){
3c50: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67  .    Table *pRig
3c60: 68 74 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e  htTab = pRight->
3c70: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73  pTab;.    int is
3c80: 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20  Outer;..    if( 
3c90: 4e 45 56 45 52 28 70 4c 65 66 74 2d 3e 70 54 61  NEVER(pLeft->pTa
3ca0: 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61  b==0 || pRightTa
3cb0: 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  b==0) ) continue
3cc0: 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20  ;.    isOuter = 
3cd0: 28 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e  (pRight->fg.join
3ce0: 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
3cf0: 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65  !=0;..    /* Whe
3d00: 6e 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  n the NATURAL ke
3d10: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
3d20: 2c 20 61 64 64 20 57 48 45 52 45 20 63 6c 61 75  , add WHERE clau
3d30: 73 65 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20  se terms for.   
3d40: 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   ** every column
3d50: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 74 61   that the two ta
3d60: 62 6c 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d  bles have in com
3d70: 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mon..    */.    
3d80: 69 66 28 20 70 52 69 67 68 74 2d 3e 66 67 2e 6a  if( pRight->fg.j
3d90: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
3da0: 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66  URAL ){.      if
3db0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c  ( pRight->pOn ||
3dc0: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
3dd0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3de0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
3df0: 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f  e, "a NATURAL jo
3e00: 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  in may not have 
3e10: 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e  ".           "an
3e20: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
3e30: 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  use", 0);.      
3e40: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3e50: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
3e60: 30 3b 20 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e  0; j<pRightTab->
3e70: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
3e80: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
3e90: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f     /* Name of co
3ea0: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 69 67 68  lumn in the righ
3eb0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  t table */.     
3ec0: 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20     int iLeft;   
3ed0: 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65    /* Matching le
3ee0: 66 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ft table */.    
3ef0: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c      int iLeftCol
3f00: 3b 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63  ;  /* Matching c
3f10: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66  olumn in the lef
3f20: 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20  t table */..    
3f30: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67      zName = pRig
3f40: 68 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  htTab->aCol[j].z
3f50: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
3f60: 28 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e  ( tableAndColumn
3f70: 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c  Index(pSrc, i+1,
3f80: 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20   zName, &iLeft, 
3f90: 26 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20  &iLeftCol) ){.  
3fa0: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
3fb0: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72  Term(pParse, pSr
3fc0: 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43  c, iLeft, iLeftC
3fd0: 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20  ol, i+1, j,.    
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ff0: 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e     isOuter, &p->
4000: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20  pWhere);.       
4010: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
4020: 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f  ..    /* Disallo
4030: 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  w both ON and US
4040: 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74  ING clauses in t
4050: 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20  he same join.   
4060: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
4070: 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68  ht->pOn && pRigh
4080: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
4090: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
40a0: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
40b0: 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20  ot have both ON 
40c0: 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20  and USING ".    
40d0: 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20      "clauses in 
40e0: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b  the same join");
40f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
4100: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
4110: 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  dd the ON clause
4120: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
4130: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
4140: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20   connected by.  
4150: 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72    ** an AND oper
4160: 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ator..    */.   
4170: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e   if( pRight->pOn
4180: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
4190: 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e 45  Outer ) setJoinE
41a0: 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c  xpr(pRight->pOn,
41b0: 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72   pRight->iCursor
41c0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65  );.      p->pWhe
41d0: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
41e0: 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  And(pParse->db, 
41f0: 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68  p->pWhere, pRigh
4200: 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70  t->pOn);.      p
4210: 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a  Right->pOn = 0;.
4220: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
4230: 65 61 74 65 20 65 78 74 72 61 20 74 65 72 6d 73  eate extra terms
4240: 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   on the WHERE cl
4250: 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f  ause for each co
4260: 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a  lumn named.    *
4270: 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  * in the USING c
4280: 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a  lause.  Example:
4290: 20 49 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c   If the two tabl
42a0: 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20  es to be joined 
42b0: 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e  are .    ** A an
42c0: 64 20 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e  d B and the USIN
42d0: 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58  G clause names X
42e0: 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e  , Y, and Z, then
42f0: 20 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a   add this.    **
4300: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
4310: 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58  ause:    A.X=B.X
4320: 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44   AND A.Y=B.Y AND
4330: 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20   A.Z=B.Z.    ** 
4340: 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  Report an error 
4350: 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65  if any column me
4360: 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55  ntioned in the U
4370: 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20  SING clause is. 
4380: 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69     ** not contai
4390: 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c  ned in both tabl
43a0: 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e  es to be joined.
43b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
43c0: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
43d0: 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a  {.      IdList *
43e0: 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e  pList = pRight->
43f0: 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f  pUsing;.      fo
4400: 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e  r(j=0; j<pList->
4410: 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nId; j++){.     
4420: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20     char *zName; 
4430: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
4440: 68 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 55  he term in the U
4450: 53 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20  SING clause */. 
4460: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
4470: 3b 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ;       /* Table
4480: 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 77 69 74   on the left wit
4490: 68 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  h matching colum
44a0: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
44b0: 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20    int iLeftCol; 
44c0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
44d0: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
44e0: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65  column on the le
44f0: 66 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ft */.        in
4500: 74 20 69 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f  t iRightCol;   /
4510: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
4520: 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  of matching colu
4530: 6d 6e 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  mn on the right 
4540: 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  */..        zNam
4550: 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  e = pList->a[j].
4560: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
4570: 52 69 67 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d  RightCol = colum
4580: 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62  nIndex(pRightTab
4590: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
45a0: 20 20 69 66 28 20 69 52 69 67 68 74 43 6f 6c 3c    if( iRightCol<
45b0: 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 21 74  0.         || !t
45c0: 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
45d0: 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e  ex(pSrc, i+1, zN
45e0: 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c  ame, &iLeft, &iL
45f0: 65 66 74 43 6f 6c 29 0a 20 20 20 20 20 20 20 20  eftCol).        
4600: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
4610: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4620: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69  rse, "cannot joi
4630: 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25  n using column %
4640: 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20  s - column ".   
4650: 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72           "not pr
4660: 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61  esent in both ta
4670: 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  bles", zName);. 
4680: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
4690: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
46a0: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
46b0: 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  m(pParse, pSrc, 
46c0: 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c  iLeft, iLeftCol,
46d0: 20 69 2b 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c   i+1, iRightCol,
46e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
46f0: 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26        isOuter, &
4700: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
4710: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
4720: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
4730: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
4740: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 68 6f  f this object ho
4750: 6c 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lds information 
4760: 28 62 65 79 6f 6e 64 20 70 50 61 72 73 65 20 61  (beyond pParse a
4770: 6e 64 20 70 53 65 6c 65 63 74 29 0a 2a 2a 20 6e  nd pSelect).** n
4780: 65 65 64 65 64 20 74 6f 20 6c 6f 61 64 20 74 68  eeded to load th
4790: 65 20 6e 65 78 74 20 72 65 73 75 6c 74 20 72 6f  e next result ro
47a0: 77 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  w that is to be 
47b0: 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 6f 72  added to the sor
47c0: 74 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ter..*/.typedef 
47d0: 73 74 72 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e  struct RowLoadIn
47e0: 66 6f 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 0a  fo RowLoadInfo;.
47f0: 73 74 72 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e  struct RowLoadIn
4800: 66 6f 20 7b 0a 20 20 69 6e 74 20 72 65 67 52 65  fo {.  int regRe
4810: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
4820: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73      /* Store res
4830: 75 6c 74 73 20 69 6e 20 61 72 72 61 79 20 6f 66  ults in array of
4840: 20 72 65 67 69 73 74 65 72 73 20 68 65 72 65 20   registers here 
4850: 2a 2f 0a 20 20 75 38 20 65 63 65 6c 46 6c 61 67  */.  u8 ecelFlag
4860: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
4870: 20 20 2f 2a 20 46 6c 61 67 20 61 72 67 75 6d 65    /* Flag argume
4880: 6e 74 20 74 6f 20 45 78 70 72 43 6f 64 65 45 78  nt to ExprCodeEx
4890: 70 72 4c 69 73 74 28 29 20 2a 2f 0a 23 69 66 64  prList() */.#ifd
48a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
48b0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
48c0: 45 53 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ES.  ExprList *p
48d0: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
48e0: 20 20 2f 2a 20 45 78 74 72 61 20 63 6f 6c 75 6d    /* Extra colum
48f0: 6e 73 20 6e 65 65 64 65 64 20 62 79 20 73 6f 72  ns needed by sor
4900: 74 65 72 20 72 65 66 73 20 2a 2f 0a 20 20 69 6e  ter refs */.  in
4910: 74 20 72 65 67 45 78 74 72 61 52 65 73 75 6c 74  t regExtraResult
4920: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ;          /* Wh
4930: 65 72 65 20 74 6f 20 6c 6f 61 64 20 74 68 65 20  ere to load the 
4940: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 2a 2f  extra columns */
4950: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
4960: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
4970: 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  oes the work of 
4980: 6c 6f 61 64 69 6e 67 20 71 75 65 72 79 20 64 61  loading query da
4990: 74 61 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79  ta into an array
49a0: 20 6f 66 0a 2a 2a 20 72 65 67 69 73 74 65 72 73   of.** registers
49b0: 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20   so that it can 
49c0: 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
49d0: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
49e0: 63 20 76 6f 69 64 20 69 6e 6e 65 72 4c 6f 6f 70  c void innerLoop
49f0: 4c 6f 61 64 52 6f 77 28 0a 20 20 50 61 72 73 65  LoadRow(.  Parse
4a00: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
4a10: 20 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65        /* Stateme
4a20: 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
4a30: 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ction */.  Selec
4a40: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
4a50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71 75 65        /* The que
4a60: 72 79 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a  ry being coded *
4a70: 2f 0a 20 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20  /.  RowLoadInfo 
4a80: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
4a90: 2a 20 49 6e 66 6f 20 6e 65 65 64 65 64 20 74 6f  * Info needed to
4aa0: 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 72 6f   complete the ro
4ab0: 77 20 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 73  w load */.){.  s
4ac0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
4ad0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
4ae0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20  Select->pEList, 
4af0: 70 49 6e 66 6f 2d 3e 72 65 67 52 65 73 75 6c 74  pInfo->regResult
4b00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70              0, p
4b20: 49 6e 66 6f 2d 3e 65 63 65 6c 46 6c 61 67 73 29  Info->ecelFlags)
4b30: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
4b40: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
4b50: 46 45 52 45 4e 43 45 53 0a 20 20 69 66 28 20 70  FERENCES.  if( p
4b60: 49 6e 66 6f 2d 3e 70 45 78 74 72 61 20 29 7b 0a  Info->pExtra ){.
4b70: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
4b80: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
4b90: 73 65 2c 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72  se, pInfo->pExtr
4ba0: 61 2c 20 70 49 6e 66 6f 2d 3e 72 65 67 45 78 74  a, pInfo->regExt
4bb0: 72 61 52 65 73 75 6c 74 2c 20 30 2c 20 30 29 3b  raResult, 0, 0);
4bc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
4bd0: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
4be0: 65 2d 3e 64 62 2c 20 70 49 6e 66 6f 2d 3e 70 45  e->db, pInfo->pE
4bf0: 78 74 72 61 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  xtra);.  }.#endi
4c00: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  f.}../*.** Code 
4c10: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
4c20: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  d instruction th
4c30: 61 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  at generates the
4c40: 20 65 6e 74 72 79 20 74 6f 20 62 65 0a 2a 2a 20   entry to be.** 
4c50: 61 64 64 65 64 20 69 6e 74 6f 20 74 68 65 20 73  added into the s
4c60: 6f 72 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  orter..**.** Ret
4c70: 75 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72  urn the register
4c80: 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 72 65   in which the re
4c90: 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 2e 0a  sult is stored..
4ca0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61  */.static int ma
4cb0: 6b 65 53 6f 72 74 65 72 52 65 63 6f 72 64 28 0a  keSorterRecord(.
4cc0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4cd0: 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72  .  SortCtx *pSor
4ce0: 74 2c 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  t,.  Select *pSe
4cf0: 6c 65 63 74 2c 0a 20 20 69 6e 74 20 72 65 67 42  lect,.  int regB
4d00: 61 73 65 2c 0a 20 20 69 6e 74 20 6e 42 61 73 65  ase,.  int nBase
4d10: 0a 29 7b 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74  .){.  int nOBSat
4d20: 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74   = pSort->nOBSat
4d30: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
4d40: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
4d50: 6e 74 20 72 65 67 4f 75 74 20 3d 20 2b 2b 70 50  nt regOut = ++pP
4d60: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 69 66  arse->nMem;.  if
4d70: 28 20 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72  ( pSort->pDeferr
4d80: 65 64 52 6f 77 4c 6f 61 64 20 29 7b 0a 20 20 20  edRowLoad ){.   
4d90: 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f   innerLoopLoadRo
4da0: 77 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  w(pParse, pSelec
4db0: 74 2c 20 70 53 6f 72 74 2d 3e 70 44 65 66 65 72  t, pSort->pDefer
4dc0: 72 65 64 52 6f 77 4c 6f 61 64 29 3b 0a 20 20 7d  redRowLoad);.  }
4dd0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
4de0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
4df0: 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2b 6e  ecord, regBase+n
4e00: 4f 42 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42  OBSat, nBase-nOB
4e10: 53 61 74 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20  Sat, regOut);.  
4e20: 72 65 74 75 72 6e 20 72 65 67 4f 75 74 3b 0a 7d  return regOut;.}
4e30: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
4e40: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
4e50: 70 75 73 68 20 74 68 65 20 72 65 63 6f 72 64 20  push the record 
4e60: 69 6e 20 72 65 67 69 73 74 65 72 73 20 72 65 67  in registers reg
4e70: 44 61 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20  Data.** through 
4e80: 72 65 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20  regData+nData-1 
4e90: 6f 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e  onto the sorter.
4ea0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4eb0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a  pushOntoSorter(.
4ec0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
4ee0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
4ef0: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20  SortCtx *pSort, 
4f00: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d         /* Inform
4f10: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
4f20: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
4f30: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
4f40: 6c 65 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  lect,       /* T
4f50: 68 65 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20  he whole SELECT 
4f60: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
4f70: 6e 74 20 72 65 67 44 61 74 61 2c 20 20 20 20 20  nt regData,     
4f80: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72        /* First r
4f90: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
4fa0: 64 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65  data to be sorte
4fb0: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72  d */.  int regOr
4fc0: 69 67 44 61 74 61 2c 20 20 20 20 20 20 20 2f 2a  igData,       /*
4fd0: 20 46 69 72 73 74 20 72 65 67 69 73 74 65 72 20   First register 
4fe0: 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 62 65 66  holding data bef
4ff0: 6f 72 65 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20  ore packing */. 
5000: 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20   int nData,     
5010: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5020: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
5030: 20 74 68 65 20 72 65 67 44 61 74 61 20 64 61 74   the regData dat
5040: 61 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  a array */.  int
5050: 20 6e 50 72 65 66 69 78 52 65 67 20 20 20 20 20   nPrefixReg     
5060: 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65      /* No. of re
5070: 67 20 70 72 69 6f 72 20 74 6f 20 72 65 67 44 61  g prior to regDa
5080: 74 61 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ta available for
5090: 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62   use */.){.  Vdb
50a0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
50b0: 56 64 62 65 3b 20 20 20 20 20 20 20 20 20 20 20  Vdbe;           
50c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
50d0: 20 53 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73   Stmt under cons
50e0: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
50f0: 74 20 62 53 65 71 20 3d 20 28 28 70 53 6f 72 74  t bSeq = ((pSort
5100: 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f  ->sortFlags & SO
5110: 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72  RTFLAG_UseSorter
5120: 29 3d 3d 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78  )==0);.  int nEx
5130: 70 72 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64  pr = pSort->pOrd
5140: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20  erBy->nExpr;    
5150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e            /* No.
5160: 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72   of ORDER BY ter
5170: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73  ms */.  int nBas
5180: 65 20 3d 20 6e 45 78 70 72 20 2b 20 62 53 65 71  e = nExpr + bSeq
5190: 20 2b 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20   + nData;       
51a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c           /* Fiel
51b0: 64 73 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63  ds in sorter rec
51c0: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ord */.  int reg
51d0: 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  Base;           
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
5200: 73 20 66 6f 72 20 73 6f 72 74 65 72 20 72 65 63  s for sorter rec
5210: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ord */.  int reg
5220: 52 65 63 6f 72 64 20 3d 20 30 3b 20 20 20 20 20  Record = 0;     
5230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
5250: 65 6d 62 6c 65 64 20 73 6f 72 74 65 72 20 72 65  embled sorter re
5260: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  cord */.  int nO
5270: 42 53 61 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f  BSat = pSort->nO
5280: 42 53 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  BSat;           
5290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52             /* OR
52a0: 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20  DER BY terms to 
52b0: 73 6b 69 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  skip */.  int op
52c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
52e0: 4f 70 63 6f 64 65 20 74 6f 20 61 64 64 20 73 6f  Opcode to add so
52f0: 72 74 65 72 20 72 65 63 6f 72 64 20 74 6f 20 73  rter record to s
5300: 6f 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  orter */.  int i
5310: 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20  Limit;          
5320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5330: 20 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 20 2a   LIMIT counter *
5340: 2f 0a 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20  /.  int iSkip = 
5350: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
5360: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
5370: 20 74 68 65 20 73 6f 72 74 65 72 20 69 6e 73 65   the sorter inse
5380: 72 74 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 61 73  rt loop */..  as
5390: 73 65 72 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c  sert( bSeq==0 ||
53a0: 20 62 53 65 71 3d 3d 31 20 29 3b 0a 0a 20 20 2f   bSeq==1 );..  /
53b0: 2a 20 54 68 72 65 65 20 63 61 73 65 73 3a 0a 20  * Three cases:. 
53c0: 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20 64 61   **   (1) The da
53d0: 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  ta to be sorted 
53e0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
53f0: 20 70 61 63 6b 65 64 20 69 6e 74 6f 20 61 20 52   packed into a R
5400: 65 63 6f 72 64 0a 20 20 2a 2a 20 20 20 20 20 20  ecord.  **      
5410: 20 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4d   by a prior OP_M
5420: 61 6b 65 52 65 63 6f 72 64 2e 20 20 49 6e 20 74  akeRecord.  In t
5430: 68 69 73 20 63 61 73 65 20 6e 44 61 74 61 3d 3d  his case nData==
5440: 31 20 61 6e 64 20 72 65 67 44 61 74 61 0a 20 20  1 and regData.  
5450: 2a 2a 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65  **       will be
5460: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 72 65   completely unre
5470: 6c 61 74 65 64 20 74 6f 20 72 65 67 4f 72 69 67  lated to regOrig
5480: 44 61 74 61 2e 0a 20 20 2a 2a 20 20 20 28 32 29  Data..  **   (2)
5490: 20 41 6c 6c 20 6f 75 74 70 75 74 20 63 6f 6c 75   All output colu
54a0: 6d 6e 73 20 61 72 65 20 69 6e 63 6c 75 64 65 64  mns are included
54b0: 20 69 6e 20 74 68 65 20 73 6f 72 74 20 72 65 63   in the sort rec
54c0: 6f 72 64 2e 20 20 49 6e 20 74 68 61 74 0a 20 20  ord.  In that.  
54d0: 2a 2a 20 20 20 20 20 20 20 63 61 73 65 20 72 65  **       case re
54e0: 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67 44 61  gData==regOrigDa
54f0: 74 61 2e 0a 20 20 2a 2a 20 20 20 28 33 29 20 53  ta..  **   (3) S
5500: 6f 6d 65 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d  ome output colum
5510: 6e 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 66  ns are omitted f
5520: 72 6f 6d 20 74 68 65 20 73 6f 72 74 20 72 65 63  rom the sort rec
5530: 6f 72 64 20 64 75 65 20 74 6f 0a 20 20 2a 2a 20  ord due to.  ** 
5540: 20 20 20 20 20 20 74 68 65 20 53 51 4c 49 54 45        the SQLITE
5550: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
5560: 45 46 45 52 45 4e 43 45 20 6f 70 74 69 6d 69 7a  EFERENCE optimiz
5570: 61 74 69 6f 6e 2c 20 6f 72 20 64 75 65 20 74 6f  ation, or due to
5580: 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 20   the.  **       
5590: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54  SQLITE_ECEL_OMIT
55a0: 52 45 46 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  REF optimization
55b0: 2c 20 6f 72 20 64 75 65 20 74 6f 20 74 68 65 20  , or due to the 
55c0: 0a 20 20 2a 2a 20 20 20 20 20 20 20 53 6f 72 74  .  **       Sort
55d0: 43 74 78 2e 70 44 65 66 65 72 72 65 64 52 6f 77  Ctx.pDeferredRow
55e0: 4c 6f 61 64 20 6f 70 74 69 6d 69 61 74 69 6f 6e  Load optimiation
55f0: 2e 20 20 49 6e 20 61 6e 79 20 6f 66 20 74 68 65  .  In any of the
5600: 73 65 20 63 61 73 65 73 0a 20 20 2a 2a 20 20 20  se cases.  **   
5610: 20 20 20 20 72 65 67 4f 72 69 67 44 61 74 61 20      regOrigData 
5620: 69 73 20 30 20 74 6f 20 70 72 65 76 65 6e 74 20  is 0 to prevent 
5630: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f  this routine fro
5640: 6d 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 70 79  m trying to copy
5650: 0a 20 20 2a 2a 20 20 20 20 20 20 20 76 61 6c 75  .  **       valu
5660: 65 73 20 74 68 61 74 20 6d 69 67 68 74 20 6e 6f  es that might no
5670: 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a  t yet exist..  *
5680: 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 44 61 74  /.  assert( nDat
5690: 61 3d 3d 31 20 7c 7c 20 72 65 67 44 61 74 61 3d  a==1 || regData=
56a0: 3d 72 65 67 4f 72 69 67 44 61 74 61 20 7c 7c 20  =regOrigData || 
56b0: 72 65 67 4f 72 69 67 44 61 74 61 3d 3d 30 20 29  regOrigData==0 )
56c0: 3b 0a 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78  ;..  if( nPrefix
56d0: 52 65 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Reg ){.    asser
56e0: 74 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 6e  t( nPrefixReg==n
56f0: 45 78 70 72 2b 62 53 65 71 20 29 3b 0a 20 20 20  Expr+bSeq );.   
5700: 20 72 65 67 42 61 73 65 20 3d 20 72 65 67 44 61   regBase = regDa
5710: 74 61 20 2d 20 6e 50 72 65 66 69 78 52 65 67 3b  ta - nPrefixReg;
5720: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
5730: 67 42 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e  gBase = pParse->
5740: 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50  nMem + 1;.    pP
5750: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42  arse->nMem += nB
5760: 61 73 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ase;.  }.  asser
5770: 74 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66  t( pSelect->iOff
5780: 73 65 74 3d 3d 30 20 7c 7c 20 70 53 65 6c 65 63  set==0 || pSelec
5790: 74 2d 3e 69 4c 69 6d 69 74 21 3d 30 20 29 3b 0a  t->iLimit!=0 );.
57a0: 20 20 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65    iLimit = pSele
57b0: 63 74 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 53  ct->iOffset ? pS
57c0: 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31  elect->iOffset+1
57d0: 20 3a 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d   : pSelect->iLim
57e0: 69 74 3b 0a 20 20 70 53 6f 72 74 2d 3e 6c 61 62  it;.  pSort->lab
57f0: 65 6c 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33  elDone = sqlite3
5800: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
5810: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
5820: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
5830: 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65  se, pSort->pOrde
5840: 72 42 79 2c 20 72 65 67 42 61 73 65 2c 20 72 65  rBy, regBase, re
5850: 67 4f 72 69 67 44 61 74 61 2c 0a 20 20 20 20 20  gOrigData,.     
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5870: 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c       SQLITE_ECEL
5880: 5f 44 55 50 20 7c 20 28 72 65 67 4f 72 69 67 44  _DUP | (regOrigD
5890: 61 74 61 3f 20 53 51 4c 49 54 45 5f 45 43 45 4c  ata? SQLITE_ECEL
58a0: 5f 52 45 46 20 3a 20 30 29 29 3b 0a 20 20 69 66  _REF : 0));.  if
58b0: 28 20 62 53 65 71 20 29 7b 0a 20 20 20 20 73 71  ( bSeq ){.    sq
58c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
58d0: 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20  v, OP_Sequence, 
58e0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c  pSort->iECursor,
58f0: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
5900: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 72 65 66  .  }.  if( nPref
5910: 69 78 52 65 67 3d 3d 30 20 26 26 20 6e 44 61 74  ixReg==0 && nDat
5920: 61 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  a>0 ){.    sqlit
5930: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
5940: 50 61 72 73 65 2c 20 72 65 67 44 61 74 61 2c 20  Parse, regData, 
5950: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 2b 62 53  regBase+nExpr+bS
5960: 65 71 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a  eq, nData);.  }.
5970: 20 20 69 66 28 20 6e 4f 42 53 61 74 3e 30 20 29    if( nOBSat>0 )
5980: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 50 72 65  {.    int regPre
5990: 76 4b 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 66  vKey;   /* The f
59a0: 69 72 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75  irst nOBSat colu
59b0: 6d 6e 73 20 6f 66 20 74 68 65 20 70 72 65 76 69  mns of the previ
59c0: 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69  ous row */.    i
59d0: 6e 74 20 61 64 64 72 46 69 72 73 74 3b 20 20 20  nt addrFirst;   
59e0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
59f0: 68 65 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f  he OP_IfNot opco
5a00: 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64  de */.    int ad
5a10: 64 72 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41  drJmp;      /* A
5a20: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50  ddress of the OP
5a30: 5f 4a 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a  _Jump opcode */.
5a40: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
5a50: 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20        /* Opcode 
5a60: 74 68 61 74 20 6f 70 65 6e 73 20 74 68 65 20 73  that opens the s
5a70: 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  orter */.    int
5a80: 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f   nKey;         /
5a90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72 74  * Number of sort
5aa0: 69 6e 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c  ing key columns,
5ab0: 20 69 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65   including OP_Se
5ac0: 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65  quence */.    Ke
5ad0: 79 49 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20  yInfo *pKI;     
5ae0: 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49  /* Original KeyI
5af0: 6e 66 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74 65  nfo on the sorte
5b00: 72 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20  r table */..    
5b10: 72 65 67 52 65 63 6f 72 64 20 3d 20 6d 61 6b 65  regRecord = make
5b20: 53 6f 72 74 65 72 52 65 63 6f 72 64 28 70 50 61  SorterRecord(pPa
5b30: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 53 65 6c  rse, pSort, pSel
5b40: 65 63 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 42  ect, regBase, nB
5b50: 61 73 65 29 3b 0a 20 20 20 20 72 65 67 50 72 65  ase);.    regPre
5b60: 76 4b 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e  vKey = pParse->n
5b70: 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
5b80: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74  e->nMem += pSort
5b90: 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b  ->nOBSat;.    nK
5ba0: 65 79 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f  ey = nExpr - pSo
5bb0: 72 74 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65  rt->nOBSat + bSe
5bc0: 71 3b 0a 20 20 20 20 69 66 28 20 62 53 65 71 20  q;.    if( bSeq 
5bd0: 29 7b 0a 20 20 20 20 20 20 61 64 64 72 46 69 72  ){.      addrFir
5be0: 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
5bf0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e  AddOp1(v, OP_IfN
5c00: 6f 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70  ot, regBase+nExp
5c10: 72 29 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  r); .    }else{.
5c20: 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74 20        addrFirst 
5c30: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
5c40: 4f 70 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e  Op1(v, OP_Sequen
5c50: 63 65 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69  ceTest, pSort->i
5c60: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  ECursor);.    }.
5c70: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
5c80: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
5c90: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5ca0: 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65  _Compare, regPre
5cb0: 76 4b 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70  vKey, regBase, p
5cc0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20  Sort->nOBSat);. 
5cd0: 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
5ce0: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f  VdbeGetOp(v, pSo
5cf0: 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65  rt->addrSortInde
5d00: 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72  x);.    if( pPar
5d10: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
5d20: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
5d30: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65     pOp->p2 = nKe
5d40: 79 20 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70  y + nData;.    p
5d50: 4b 49 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  KI = pOp->p4.pKe
5d60: 79 49 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65  yInfo;.    memse
5d70: 74 28 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65  t(pKI->aSortOrde
5d80: 72 2c 20 30 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46  r, 0, pKI->nKeyF
5d90: 69 65 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20  ield); /* Makes 
5da0: 4f 50 5f 4a 75 6d 70 20 74 65 73 74 61 62 6c 65  OP_Jump testable
5db0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
5dc0: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
5dd0: 31 2c 20 28 63 68 61 72 2a 29 70 4b 49 2c 20 50  1, (char*)pKI, P
5de0: 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
5df0: 74 65 73 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e  testcase( pKI->n
5e00: 41 6c 6c 46 69 65 6c 64 20 3e 20 70 4b 49 2d 3e  AllField > pKI->
5e10: 6e 4b 65 79 46 69 65 6c 64 2b 32 20 29 3b 0a 20  nKeyField+2 );. 
5e20: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49     pOp->p4.pKeyI
5e30: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
5e40: 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
5e50: 28 70 50 61 72 73 65 2c 70 53 6f 72 74 2d 3e 70  (pParse,pSort->p
5e60: 4f 72 64 65 72 42 79 2c 6e 4f 42 53 61 74 2c 0a  OrderBy,nOBSat,.
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 20 20 20 20 20 20 20 20 20 20 20 70 4b 49 2d 3e             pKI->
5ea0: 6e 41 6c 6c 46 69 65 6c 64 2d 70 4b 49 2d 3e 6e  nAllField-pKI->n
5eb0: 4b 65 79 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20  KeyField-1);.   
5ec0: 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74   addrJmp = sqlit
5ed0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
5ee0: 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
5ef0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5f00: 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b  P_Jump, addrJmp+
5f10: 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29  1, 0, addrJmp+1)
5f20: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
5f30: 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61  );.    pSort->la
5f40: 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74  belBkOut = sqlit
5f50: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
5f60: 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72  v);.    pSort->r
5f70: 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
5f80: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
5f90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5fa0: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53  (v, OP_Gosub, pS
5fb0: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  ort->regReturn, 
5fc0: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
5fd0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
5fe0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
5ff0: 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f  ResetSorter, pSo
6000: 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  rt->iECursor);. 
6010: 20 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29 7b     if( iLimit ){
6020: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6030: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6040: 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 70 53  fNot, iLimit, pS
6050: 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b  ort->labelDone);
6060: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
6070: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
6080: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
6090: 70 48 65 72 65 28 76 2c 20 61 64 64 72 46 69 72  pHere(v, addrFir
60a0: 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
60b0: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
60c0: 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65  rse, regBase, re
60d0: 67 50 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d  gPrevKey, pSort-
60e0: 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71  >nOBSat);.    sq
60f0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
6100: 65 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20  e(v, addrJmp);. 
6110: 20 7d 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 20   }.  if( iLimit 
6120: 29 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  ){.    /* At thi
6130: 73 20 70 6f 69 6e 74 20 74 68 65 20 76 61 6c 75  s point the valu
6140: 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  es for the new s
6150: 6f 72 74 65 72 20 65 6e 74 72 79 20 61 72 65 20  orter entry are 
6160: 73 74 6f 72 65 64 0a 20 20 20 20 2a 2a 20 69 6e  stored.    ** in
6170: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
6180: 69 73 74 65 72 73 2e 20 54 68 65 79 20 6e 65 65  isters. They nee
6190: 64 20 74 6f 20 62 65 20 63 6f 6d 70 6f 73 65 64  d to be composed
61a0: 20 69 6e 74 6f 20 61 20 72 65 63 6f 72 64 0a 20   into a record. 
61b0: 20 20 20 2a 2a 20 61 6e 64 20 69 6e 73 65 72 74     ** and insert
61c0: 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ed into the sort
61d0: 65 72 20 69 66 20 65 69 74 68 65 72 20 28 61 29  er if either (a)
61e0: 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65   there are curre
61f0: 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6c 65 73 73  ntly.    ** less
6200: 20 74 68 61 6e 20 4c 49 4d 49 54 2b 4f 46 46 53   than LIMIT+OFFS
6210: 45 54 20 69 74 65 6d 73 20 6f 72 20 28 62 29 20  ET items or (b) 
6220: 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 69  the new record i
6230: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
6240: 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 72 67 65      ** the large
6250: 73 74 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e  st record curren
6260: 74 6c 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65  tly in the sorte
6270: 72 2e 20 49 66 20 28 62 29 20 69 73 20 74 72 75  r. If (b) is tru
6280: 65 20 61 6e 64 20 74 68 65 72 65 0a 20 20 20 20  e and there.    
6290: 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20 4c  ** are already L
62a0: 49 4d 49 54 2b 4f 46 46 53 45 54 20 69 74 65 6d  IMIT+OFFSET item
62b0: 73 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2c  s in the sorter,
62c0: 20 64 65 6c 65 74 65 20 74 68 65 20 6c 61 72 67   delete the larg
62d0: 65 73 74 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79  est.    ** entry
62e0: 20 62 65 66 6f 72 65 20 69 6e 73 65 72 74 69 6e   before insertin
62f0: 67 20 74 68 65 20 6e 65 77 20 6f 6e 65 2e 20 54  g the new one. T
6300: 68 69 73 20 77 61 79 20 74 68 65 72 65 20 61 72  his way there ar
6310: 65 20 6e 65 76 65 72 20 6d 6f 72 65 20 0a 20 20  e never more .  
6320: 20 20 2a 2a 20 74 68 61 6e 20 4c 49 4d 49 54 2b    ** than LIMIT+
6330: 4f 46 46 53 45 54 20 69 74 65 6d 73 20 69 6e 20  OFFSET items in 
6340: 74 68 65 20 73 6f 72 74 65 72 2e 0a 20 20 20 20  the sorter..    
6350: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
6360: 20 6e 65 77 20 72 65 63 6f 72 64 20 64 6f 65 73   new record does
6370: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
6380: 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
6390: 65 20 73 6f 72 74 65 72 2c 0a 20 20 20 20 2a 2a  e sorter,.    **
63a0: 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78   jump to the nex
63b0: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
63c0: 68 65 20 6c 6f 6f 70 2e 20 4f 72 2c 20 69 66 20  he loop. Or, if 
63d0: 74 68 65 0a 20 20 20 20 2a 2a 20 70 53 6f 72 74  the.    ** pSort
63e0: 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ->bOrderedInnerL
63f0: 6f 6f 70 20 66 6c 61 67 20 69 73 20 73 65 74 20  oop flag is set 
6400: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
6410: 20 74 68 65 20 69 6e 6e 65 72 0a 20 20 20 20 2a   the inner.    *
6420: 2a 20 6c 6f 6f 70 20 64 65 6c 69 76 65 72 73 20  * loop delivers 
6430: 69 74 65 6d 73 20 69 6e 20 73 6f 72 74 65 64 20  items in sorted 
6440: 6f 72 64 65 72 2c 20 6a 75 6d 70 20 74 6f 20 74  order, jump to t
6450: 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
6460: 6e 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  n.    ** of the 
6470: 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 20 20  outer loop..    
6480: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72 20  */.    int iCsr 
6490: 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  = pSort->iECurso
64a0: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  r;.    sqlite3Vd
64b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
64c0: 66 4e 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74  fNotZero, iLimit
64d0: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
64e0: 72 65 6e 74 41 64 64 72 28 76 29 2b 34 29 3b 0a  rentAddr(v)+4);.
64f0: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
6500: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
6510: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6520: 5f 4c 61 73 74 2c 20 69 43 73 72 2c 20 30 29 3b  _Last, iCsr, 0);
6530: 0a 20 20 20 20 69 53 6b 69 70 20 3d 20 73 71 6c  .    iSkip = sql
6540: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
6550: 74 28 76 2c 20 4f 50 5f 49 64 78 4c 45 2c 0a 20  t(v, OP_IdxLE,. 
6560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6580: 69 43 73 72 2c 20 30 2c 20 72 65 67 42 61 73 65  iCsr, 0, regBase
6590: 2b 6e 4f 42 53 61 74 2c 20 6e 45 78 70 72 2d 6e  +nOBSat, nExpr-n
65a0: 4f 42 53 61 74 29 3b 0a 20 20 20 20 56 64 62 65  OBSat);.    Vdbe
65b0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
65c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
65d0: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
65e0: 20 69 43 73 72 29 3b 0a 20 20 7d 0a 20 20 69 66   iCsr);.  }.  if
65f0: 28 20 72 65 67 52 65 63 6f 72 64 3d 3d 30 20 29  ( regRecord==0 )
6600: 7b 0a 20 20 20 20 72 65 67 52 65 63 6f 72 64 20  {.    regRecord 
6610: 3d 20 6d 61 6b 65 53 6f 72 74 65 72 52 65 63 6f  = makeSorterReco
6620: 72 64 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  rd(pParse, pSort
6630: 2c 20 70 53 65 6c 65 63 74 2c 20 72 65 67 42 61  , pSelect, regBa
6640: 73 65 2c 20 6e 42 61 73 65 29 3b 0a 20 20 7d 0a  se, nBase);.  }.
6650: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72    if( pSort->sor
6660: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
6670: 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  G_UseSorter ){. 
6680: 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65     op = OP_Sorte
6690: 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65  rInsert;.  }else
66a0: 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64  {.    op = OP_Id
66b0: 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73  xInsert;.  }.  s
66c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
66d0: 49 6e 74 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74  Int(v, op, pSort
66e0: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52  ->iECursor, regR
66f0: 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ecord,.         
6700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
6710: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
6720: 61 73 65 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 69  ase-nOBSat);.  i
6730: 66 28 20 69 53 6b 69 70 20 29 7b 0a 20 20 20 20  f( iSkip ){.    
6740: 61 73 73 65 72 74 28 20 70 53 6f 72 74 2d 3e 62  assert( pSort->b
6750: 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70  OrderedInnerLoop
6760: 3d 3d 30 20 7c 7c 20 70 53 6f 72 74 2d 3e 62 4f  ==0 || pSort->bO
6770: 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3d  rderedInnerLoop=
6780: 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =1 );.    sqlite
6790: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
67a0: 20 69 53 6b 69 70 2c 0a 20 20 20 20 20 20 20 20   iSkip,.        
67b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
67c0: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 70 53 6f  entAddr(v) + pSo
67d0: 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65  rt->bOrderedInne
67e0: 72 4c 6f 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  rLoop);.  }.}../
67f0: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f  *.** Add code to
6800: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f   implement the O
6810: 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20  FFSET.*/.static 
6820: 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28  void codeOffset(
6830: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
6840: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
6850: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
6860: 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66  VM */.  int iOff
6870: 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65 67  set,      /* Reg
6880: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  ister holding th
6890: 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72  e offset counter
68a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
68b0: 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  nue     /* Jump 
68c0: 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65  here to skip the
68d0: 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20   current record 
68e0: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66 66  */.){.  if( iOff
68f0: 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  set>0 ){.    sql
6900: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6910: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66  , OP_IfPos, iOff
6920: 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  set, iContinue, 
6930: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
6940: 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  (v);.    VdbeCom
6950: 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54  ment((v, "OFFSET
6960: 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  "));.  }.}../*.*
6970: 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20  * Add code that 
6980: 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61  will check to ma
6990: 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65  ke sure the N re
69a0: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
69b0: 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d   at iMem.** form
69c0: 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72   a distinct entr
69d0: 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f  y.  iTab is a so
69e0: 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
69f0: 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c   holds previousl
6a00: 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e  y.** seen combin
6a10: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20  ations of the N 
6a20: 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65  values.  A new e
6a30: 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20  ntry is made in 
6a40: 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63  iTab.** if the c
6a50: 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20  urrent N values 
6a60: 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41  are new..**.** A
6a70: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70   jump to addrRep
6a80: 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20  eat is made and 
6a90: 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61  the N+1 values a
6aa0: 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  re popped from t
6ab0: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74  he.** stack if t
6ac0: 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74  he top N element
6ad0: 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e  s are not distin
6ae0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
6af0: 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28  id codeDistinct(
6b00: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6b10: 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
6b20: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
6b30: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
6b40: 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20    int iTab,     
6b50: 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e       /* A sortin
6b60: 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20  g index used to 
6b70: 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63  test for distinc
6b80: 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61  tness */.  int a
6b90: 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a  ddrRepeat,    /*
6ba0: 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66   Jump to here if
6bb0: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f   not distinct */
6bc0: 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
6bd0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6be0: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  of elements */. 
6bf0: 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20   int iMem       
6c00: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65      /* First ele
6c10: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  ment */.){.  Vdb
6c20: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a  e *v;.  int r1;.
6c30: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
6c40: 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c  Vdbe;.  r1 = sql
6c50: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
6c60: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
6c70: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
6c80: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62  , OP_Found, iTab
6c90: 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d  , addrRepeat, iM
6ca0: 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76 65  em, N); VdbeCove
6cb0: 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
6cc0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6cd0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69  OP_MakeRecord, i
6ce0: 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73  Mem, N, r1);.  s
6cf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
6d00: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
6d10: 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c 20 69  ert, iTab, r1, i
6d20: 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74  Mem, N);.  sqlit
6d30: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
6d40: 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
6d50: 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74  RESULT);.  sqlit
6d60: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
6d70: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
6d80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6d90: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
6da0: 45 52 45 4e 43 45 53 0a 2f 2a 0a 2a 2a 20 54 68  ERENCES./*.** Th
6db0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
6dc0: 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
6dd0: 20 69 6e 6e 65 72 2d 6c 6f 6f 70 20 67 65 6e 65   inner-loop gene
6de0: 72 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c  ration for a SEL
6df0: 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
6e00: 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
6e10: 59 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 70  Y that is not op
6e20: 74 69 6d 69 7a 65 64 20 62 79 20 61 6e 20 69 6e  timized by an in
6e30: 64 65 78 2e 20 49 74 20 0a 2a 2a 20 64 65 74 65  dex. It .** dete
6e40: 72 6d 69 6e 65 73 20 74 68 65 20 65 78 70 72 65  rmines the expre
6e50: 73 73 69 6f 6e 73 2c 20 69 66 20 61 6e 79 2c 20  ssions, if any, 
6e60: 74 68 61 74 20 74 68 65 20 73 6f 72 74 65 72 2d  that the sorter-
6e70: 72 65 66 65 72 65 6e 63 65 20 0a 2a 2a 20 6f 70  reference .** op
6e80: 74 69 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c  timization shoul
6e90: 64 20 62 65 20 75 73 65 64 20 66 6f 72 2e 20 54  d be used for. T
6ea0: 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65  he sorter-refere
6eb0: 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  nce optimization
6ec0: 0a 2a 2a 20 69 73 20 75 73 65 64 20 66 6f 72 20  .** is used for 
6ed0: 53 45 4c 45 43 54 20 71 75 65 72 69 65 73 20 6c  SELECT queries l
6ee0: 69 6b 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ike:.**.**   SEL
6ef0: 45 43 54 20 61 2c 20 62 69 67 62 6c 6f 62 20 46  ECT a, bigblob F
6f00: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
6f10: 61 20 4c 49 4d 49 54 20 31 30 0a 2a 2a 0a 2a 2a  a LIMIT 10.**.**
6f20: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
6f30: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
6f40: 20 65 78 70 72 65 73 73 69 6f 6e 20 22 62 69 67   expression "big
6f50: 62 6c 6f 62 22 2c 20 74 68 65 6e 20 69 6e 73 74  blob", then inst
6f60: 65 61 64 20 6f 66 0a 2a 2a 20 73 74 6f 72 69 6e  ead of.** storin
6f70: 67 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  g values read fr
6f80: 6f 6d 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  om that column i
6f90: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 72 65 63  n the sorter rec
6fa0: 6f 72 64 73 2c 20 74 68 65 20 50 4b 20 6f 66 0a  ords, the PK of.
6fb0: 2a 2a 20 74 68 65 20 72 6f 77 20 66 72 6f 6d 20  ** the row from 
6fc0: 74 61 62 6c 65 20 74 31 20 69 73 20 73 74 6f 72  table t1 is stor
6fd0: 65 64 20 69 6e 73 74 65 61 64 2e 20 54 68 65 6e  ed instead. Then
6fe0: 2c 20 61 73 20 72 65 63 6f 72 64 73 20 61 72 65  , as records are
6ff0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 0a   extracted from.
7000: 2a 2a 20 74 68 65 20 73 6f 72 74 65 72 20 74 6f  ** the sorter to
7010: 20 72 65 74 75 72 6e 20 74 6f 20 74 68 65 20 75   return to the u
7020: 73 65 72 2c 20 74 68 65 20 72 65 71 75 69 72 65  ser, the require
7030: 64 20 76 61 6c 75 65 20 6f 66 20 62 69 67 62 6c  d value of bigbl
7040: 6f 62 20 69 73 0a 2a 2a 20 72 65 74 72 69 65 76  ob is.** retriev
7050: 65 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  ed directly from
7060: 20 74 61 62 6c 65 20 74 31 2e 20 49 66 20 74 68   table t1. If th
7070: 65 20 76 61 6c 75 65 73 20 61 72 65 20 76 65 72  e values are ver
7080: 79 20 6c 61 72 67 65 2c 20 74 68 69 73 20 0a 2a  y large, this .*
7090: 2a 20 63 61 6e 20 62 65 20 6d 6f 72 65 20 65 66  * can be more ef
70a0: 66 69 63 69 65 6e 74 20 74 68 61 6e 20 73 74 6f  ficient than sto
70b0: 72 69 6e 67 20 74 68 65 6d 20 64 69 72 65 63 74  ring them direct
70c0: 6c 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72  ly in the sorter
70d0: 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20   records..**.** 
70e0: 54 68 65 20 45 78 70 72 4c 69 73 74 5f 69 74 65  The ExprList_ite
70f0: 6d 2e 62 53 6f 72 74 65 72 52 65 66 20 66 6c 61  m.bSorterRef fla
7100: 67 20 69 73 20 73 65 74 20 66 6f 72 20 65 61 63  g is set for eac
7110: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
7120: 70 45 4c 69 73 74 20 0a 2a 2a 20 66 6f 72 20 77  pEList .** for w
7130: 68 69 63 68 20 74 68 65 20 73 6f 72 74 65 72 2d  hich the sorter-
7140: 72 65 66 65 72 65 6e 63 65 20 6f 70 74 69 6d 69  reference optimi
7150: 7a 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  zation should be
7160: 20 65 6e 61 62 6c 65 64 2e 20 0a 2a 2a 20 41 64   enabled. .** Ad
7170: 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20  ditionally, the 
7180: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 5d 20  pSort->aDefer[] 
7190: 61 72 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74  array is populat
71a0: 65 64 20 77 69 74 68 20 65 6e 74 72 69 65 73 0a  ed with entries.
71b0: 2a 2a 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  ** for all curso
71c0: 72 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  rs required to e
71d0: 76 61 6c 75 61 74 65 20 61 6c 6c 20 73 65 6c 65  valuate all sele
71e0: 63 74 65 64 20 65 78 70 72 65 73 73 69 6f 6e 73  cted expressions
71f0: 2e 20 46 69 6e 61 6c 6c 79 2e 0a 2a 2a 20 6f 75  . Finally..** ou
7200: 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 28 2a  tput variable (*
7210: 70 70 45 78 74 72 61 29 20 69 73 20 73 65 74 20  ppExtra) is set 
7220: 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  to an expression
7230: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
7240: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
7250: 66 6f 72 20 61 6c 6c 20 65 78 74 72 61 20 50 4b  for all extra PK
7260: 20 76 61 6c 75 65 73 20 74 68 61 74 20 73 68 6f   values that sho
7270: 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e  uld be stored in
7280: 20 74 68 65 0a 2a 2a 20 73 6f 72 74 65 72 20 72   the.** sorter r
7290: 65 63 6f 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ecords..*/.stati
72a0: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 45 78 70  c void selectExp
72b0: 72 44 65 66 65 72 28 0a 20 20 50 61 72 73 65 20  rDefer(.  Parse 
72c0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
72d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61            /* Lea
72e0: 76 65 20 61 6e 79 20 65 72 72 6f 72 20 68 65 72  ve any error her
72f0: 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  e */.  SortCtx *
7300: 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 20  pSort,          
7310: 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72         /* Sorter
7320: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
7330: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
7340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7350: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 73   Expressions des
7360: 74 69 6e 65 64 20 66 6f 72 20 73 6f 72 74 65 72  tined for sorter
7370: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
7380: 2a 70 70 45 78 74 72 61 20 20 20 20 20 20 20 20  *ppExtra        
7390: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
73a0: 69 6f 6e 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ions to append t
73b0: 6f 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  o sorter record 
73c0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
73d0: 20 69 6e 74 20 6e 44 65 66 65 72 20 3d 20 30 3b   int nDefer = 0;
73e0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78  .  ExprList *pEx
73f0: 74 72 61 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  tra = 0;.  for(i
7400: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
7410: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
7420: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
7430: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 45  tem *pItem = &pE
7440: 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
7450: 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  if( pItem->u.x.i
7460: 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 7b  OrderByCol==0 ){
7470: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
7480: 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  pr = pItem->pExp
7490: 72 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  r;.      Table *
74a0: 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
74b0: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  ab;.      if( pE
74c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
74d0: 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f  MN && pExpr->iCo
74e0: 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 54 61 62 20  lumn>=0 && pTab 
74f0: 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54  && !IsVirtual(pT
7500: 61 62 29 0a 20 20 20 20 20 20 20 26 26 20 28 70  ab).       && (p
7510: 54 61 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d  Tab->aCol[pExpr-
7520: 3e 69 43 6f 6c 75 6d 6e 5d 2e 63 6f 6c 46 6c 61  >iColumn].colFla
7530: 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 53 4f 52  gs & COLFLAG_SOR
7540: 54 45 52 52 45 46 29 0a 20 20 20 20 20 20 29 7b  TERREF).      ){
7550: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
7560: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
7570: 20 6a 3c 6e 44 65 66 65 72 3b 20 6a 2b 2b 29 7b   j<nDefer; j++){
7580: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
7590: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6a 5d 2e  Sort->aDefer[j].
75a0: 69 43 73 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61  iCsr==pExpr->iTa
75b0: 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ble ) break;.   
75c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
75d0: 66 28 20 6a 3d 3d 6e 44 65 66 65 72 20 29 7b 0a  f( j==nDefer ){.
75e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 44            if( nD
75f0: 65 66 65 72 3d 3d 41 72 72 61 79 53 69 7a 65 28  efer==ArraySize(
7600: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 29 20 29  pSort->aDefer) )
7610: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
7620: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
7630: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7640: 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20       int nKey = 
7650: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  1;.            i
7660: 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
7670: 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30    Index *pPk = 0
7680: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
7690: 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
76a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
76b0: 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33     pPk = sqlite3
76c0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
76d0: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20  pTab);.         
76e0: 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 50 6b 2d       nKey = pPk-
76f0: 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20  >nKeyCol;.      
7700: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7710: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
7720: 4b 65 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  Key; k++){.     
7730: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
7740: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78  New = sqlite3PEx
7750: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 43 4f  pr(pParse, TK_CO
7760: 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  LUMN, 0, 0);.   
7770: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
7780: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
7790: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 54 61         pNew->iTa
77a0: 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  ble = pExpr->iTa
77b0: 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ble;.           
77c0: 20 20 20 20 20 70 4e 65 77 2d 3e 70 54 61 62 20       pNew->pTab 
77d0: 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20  = pExpr->pTab;. 
77e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
77f0: 4e 65 77 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  New->iColumn = p
7800: 50 6b 20 3f 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  Pk ? pPk->aiColu
7810: 6d 6e 5b 6b 5d 20 3a 20 2d 31 3b 0a 20 20 20 20  mn[k] : -1;.    
7820: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 74              pExt
7830: 72 61 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ra = sqlite3Expr
7840: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
7850: 65 2c 20 70 45 78 74 72 61 2c 20 70 4e 65 77 29  e, pExtra, pNew)
7860: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7870: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
7880: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 6f 72              pSor
7890: 74 2d 3e 61 44 65 66 65 72 5b 6e 44 65 66 65 72  t->aDefer[nDefer
78a0: 5d 2e 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e  ].pTab = pExpr->
78b0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
78c0: 20 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b    pSort->aDefer[
78d0: 6e 44 65 66 65 72 5d 2e 69 43 73 72 20 3d 20 70  nDefer].iCsr = p
78e0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
78f0: 20 20 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d            pSort-
7900: 3e 61 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e  >aDefer[nDefer].
7910: 6e 4b 65 79 20 3d 20 6e 4b 65 79 3b 0a 20 20 20  nKey = nKey;.   
7920: 20 20 20 20 20 20 20 20 20 6e 44 65 66 65 72 2b           nDefer+
7930: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
7940: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7950: 20 70 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52   pItem->bSorterR
7960: 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ef = 1;.      }.
7970: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 53 6f 72      }.  }.  pSor
7980: 74 2d 3e 6e 44 65 66 65 72 20 3d 20 28 75 38 29  t->nDefer = (u8)
7990: 6e 44 65 66 65 72 3b 0a 20 20 2a 70 70 45 78 74  nDefer;.  *ppExt
79a0: 72 61 20 3d 20 70 45 78 74 72 61 3b 0a 7d 0a 23  ra = pExtra;.}.#
79b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
79c0: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
79d0: 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
79e0: 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74   the inside of t
79f0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
7a00: 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a   of a SELECT..**
7a10: 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 69 73  .** If srcTab is
7a20: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
7a30: 74 68 65 20 70 2d 3e 70 45 4c 69 73 74 20 65 78  the p->pEList ex
7a40: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  pressions.** are
7a50: 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72   evaluated in or
7a60: 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64  der to get the d
7a70: 61 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77  ata for this row
7a80: 2e 20 20 49 66 20 73 72 63 54 61 62 20 69 73 0a  .  If srcTab is.
7a90: 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c  ** zero or more,
7aa0: 20 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75   then data is pu
7ab0: 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62  lled from srcTab
7ac0: 20 61 6e 64 20 70 2d 3e 70 45 4c 69 73 74 20 69   and p->pEList i
7ad0: 73 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20  s used only .** 
7ae0: 74 6f 20 67 65 74 20 74 68 65 20 6e 75 6d 62 65  to get the numbe
7af0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64  r of columns and
7b00: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
7b10: 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68  equence for each
7b20: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
7b30: 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e  ic void selectIn
7b40: 6e 65 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65  nerLoop(.  Parse
7b50: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
7b60: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
7b70: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
7b80: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
7b90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
7ba0: 70 6c 65 74 65 20 73 65 6c 65 63 74 20 73 74 61  plete select sta
7bb0: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
7bc0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54  ed */.  int srcT
7bd0: 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
7be0: 2f 2a 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f  /* Pull data fro
7bf0: 6d 20 74 68 69 73 20 74 61 62 6c 65 20 69 66 20  m this table if 
7c00: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20 2a 2f 0a  non-negative */.
7c10: 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74    SortCtx *pSort
7c20: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ,         /* If 
7c30: 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f  not NULL, info o
7c40: 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73  n how to process
7c50: 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 44   ORDER BY */.  D
7c60: 69 73 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73  istinctCtx *pDis
7c70: 74 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74  tinct, /* If not
7c80: 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68   NULL, info on h
7c90: 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49  ow to process DI
7ca0: 53 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65  STINCT */.  Sele
7cb0: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
7cc0: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
7cd0: 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
7ce0: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ults */.  int iC
7cf0: 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20  ontinue,        
7d00: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
7d10: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
7d20: 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  next row */.  in
7d30: 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
7d40: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
7d50: 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
7d60: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
7d70: 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  p */.){.  Vdbe *
7d80: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
7d90: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
7da0: 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20  t hasDistinct;  
7db0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7dc0: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
7dd0: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
7de0: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44  sent */.  int eD
7df0: 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65  est = pDest->eDe
7e00: 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20  st;   /* How to 
7e10: 64 69 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c  dispose of resul
7e20: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ts */.  int iPar
7e30: 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61  m = pDest->iSDPa
7e40: 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20 61 72 67  rm; /* First arg
7e50: 75 6d 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61  ument to disposa
7e60: 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e  l method */.  in
7e70: 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20  t nResultCol;   
7e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e90: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
7ea0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  lumns */.  int n
7eb0: 50 72 65 66 69 78 52 65 67 20 3d 20 30 3b 20 20  PrefixReg = 0;  
7ec0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7ed0: 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74   of extra regist
7ee0: 65 72 73 20 62 65 66 6f 72 65 20 72 65 67 52 65  ers before regRe
7ef0: 73 75 6c 74 20 2a 2f 0a 20 20 52 6f 77 4c 6f 61  sult */.  RowLoa
7f00: 64 49 6e 66 6f 20 73 52 6f 77 4c 6f 61 64 49 6e  dInfo sRowLoadIn
7f10: 66 6f 3b 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f  fo;   /* Info fo
7f20: 72 20 64 65 66 65 72 72 65 64 20 72 6f 77 20 6c  r deferred row l
7f30: 6f 61 64 69 6e 67 20 2a 2f 0a 0a 20 20 2f 2a 20  oading */..  /* 
7f40: 55 73 75 61 6c 6c 79 2c 20 72 65 67 52 65 73 75  Usually, regResu
7f50: 6c 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  lt is the first 
7f60: 63 65 6c 6c 20 69 6e 20 61 6e 20 61 72 72 61 79  cell in an array
7f70: 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73   of memory cells
7f80: 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67  .  ** containing
7f90: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73   the current res
7fa0: 75 6c 74 20 72 6f 77 2e 20 49 6e 20 74 68 69 73  ult row. In this
7fb0: 20 63 61 73 65 20 72 65 67 4f 72 69 67 20 69 73   case regOrig is
7fc0: 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a   set to the.  **
7fd0: 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 48 6f 77   same value. How
7fe0: 65 76 65 72 2c 20 69 66 20 74 68 65 20 72 65 73  ever, if the res
7ff0: 75 6c 74 73 20 61 72 65 20 62 65 69 6e 67 20 73  ults are being s
8000: 65 6e 74 20 74 6f 20 74 68 65 20 73 6f 72 74 65  ent to the sorte
8010: 72 2c 20 74 68 65 0a 20 20 2a 2a 20 76 61 6c 75  r, the.  ** valu
8020: 65 73 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65  es for any expre
8030: 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ssions that are 
8040: 61 6c 73 6f 20 70 61 72 74 20 6f 66 20 74 68 65  also part of the
8050: 20 73 6f 72 74 2d 6b 65 79 20 61 72 65 20 6f 6d   sort-key are om
8060: 69 74 74 65 64 0a 20 20 2a 2a 20 66 72 6f 6d 20  itted.  ** from 
8070: 74 68 69 73 20 61 72 72 61 79 2e 20 49 6e 20 74  this array. In t
8080: 68 69 73 20 63 61 73 65 20 72 65 67 4f 72 69 67  his case regOrig
8090: 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
80a0: 20 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65    */.  int regRe
80b0: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
80c0: 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d     /* Start of m
80d0: 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 63 75  emory holding cu
80e0: 72 72 65 6e 74 20 72 65 73 75 6c 74 73 20 2a 2f  rrent results */
80f0: 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67 3b 20  .  int regOrig; 
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8110: 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72  * Start of memor
8120: 79 20 68 6f 6c 64 69 6e 67 20 66 75 6c 6c 20 72  y holding full r
8130: 65 73 75 6c 74 20 28 6f 72 20 30 29 20 2a 2f 0a  esult (or 0) */.
8140: 0a 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a  .  assert( v );.
8150: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
8160: 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44  ist!=0 );.  hasD
8170: 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69  istinct = pDisti
8180: 6e 63 74 20 3f 20 70 44 69 73 74 69 6e 63 74 2d  nct ? pDistinct-
8190: 3e 65 54 6e 63 74 54 79 70 65 20 3a 20 57 48 45  >eTnctType : WHE
81a0: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
81b0: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 20 26 26  ;.  if( pSort &&
81c0: 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79   pSort->pOrderBy
81d0: 3d 3d 30 20 29 20 70 53 6f 72 74 20 3d 20 30 3b  ==0 ) pSort = 0;
81e0: 0a 20 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20  .  if( pSort==0 
81f0: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
8200: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
8210: 43 6f 6e 74 69 6e 75 65 21 3d 30 20 29 3b 0a 20  Continue!=0 );. 
8220: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
8230: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f   p->iOffset, iCo
8240: 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20 20  ntinue);.  }..  
8250: 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71 75  /* Pull the requ
8260: 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ested columns.. 
8270: 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f 6c   */.  nResultCol
8280: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
8290: 78 70 72 3b 0a 0a 20 20 69 66 28 20 70 44 65 73  xpr;..  if( pDes
82a0: 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20  t->iSdst==0 ){. 
82b0: 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a     if( pSort ){.
82c0: 20 20 20 20 20 20 6e 50 72 65 66 69 78 52 65 67        nPrefixReg
82d0: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
82e0: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
82f0: 20 69 66 28 20 21 28 70 53 6f 72 74 2d 3e 73 6f   if( !(pSort->so
8300: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
8310: 41 47 5f 55 73 65 53 6f 72 74 65 72 29 20 29 20  AG_UseSorter) ) 
8320: 6e 50 72 65 66 69 78 52 65 67 2b 2b 3b 0a 20 20  nPrefixReg++;.  
8330: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
8340: 20 2b 3d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a   += nPrefixReg;.
8350: 20 20 20 20 7d 0a 20 20 20 20 70 44 65 73 74 2d      }.    pDest-
8360: 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73 65 2d  >iSdst = pParse-
8370: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
8380: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
8390: 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65  sultCol;.  }else
83a0: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
83b0: 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70  t+nResultCol > p
83c0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20  Parse->nMem ){. 
83d0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e     /* This is an
83e0: 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
83f0: 20 74 68 61 74 20 63 61 6e 20 72 65 73 75 6c 74   that can result
8400: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
8410: 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20 20 20  hen a SELECT.   
8420: 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67 68 74   ** on the right
8430: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 6e  -hand side of an
8440: 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69 6e 73   INSERT contains
8450: 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c   more result col
8460: 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a  umns than.    **
8470: 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c 75 6d   there are colum
8480: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
8490: 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  on the left.  Th
84a0: 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
84b0: 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e  caught.    ** an
84c0: 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72  d reported later
84d0: 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 74  .  But we need t
84e0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e 6f 75  o make sure enou
84f0: 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c  gh memory is all
8500: 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f  ocated.    ** to
8510: 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73 70 75   avoid other spu
8520: 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69 6e 20  rious errors in 
8530: 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f  the meantime. */
8540: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
8550: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
8560: 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53  .  }.  pDest->nS
8570: 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  dst = nResultCol
8580: 3b 0a 20 20 72 65 67 4f 72 69 67 20 3d 20 72 65  ;.  regOrig = re
8590: 67 52 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d  gResult = pDest-
85a0: 3e 69 53 64 73 74 3b 0a 20 20 69 66 28 20 73 72  >iSdst;.  if( sr
85b0: 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20 20 20 66  cTab>=0 ){.    f
85c0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c  or(i=0; i<nResul
85d0: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
85e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
85f0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
8600: 2c 20 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67  , srcTab, i, reg
8610: 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 20  Result+i);.     
8620: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
8630: 20 22 25 73 22 2c 20 70 2d 3e 70 45 4c 69 73 74   "%s", p->pEList
8640: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a  ->a[i].zName));.
8650: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
8660: 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69  ( eDest!=SRT_Exi
8670: 73 74 73 20 29 7b 0a 23 69 66 64 65 66 20 53 51  sts ){.#ifdef SQ
8680: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
8690: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
86a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 74    ExprList *pExt
86b0: 72 61 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  ra = 0;.#endif. 
86c0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73     /* If the des
86d0: 74 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45  tination is an E
86e0: 58 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65  XISTS(...) expre
86f0: 73 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61  ssion, the actua
8700: 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  l.    ** values 
8710: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
8720: 53 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72  SELECT are not r
8730: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
8740: 20 20 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73      u8 ecelFlags
8750: 3b 20 20 20 20 2f 2a 20 22 65 63 65 6c 22 20 69  ;    /* "ecel" i
8760: 73 20 61 6e 20 61 62 62 72 65 76 69 61 74 69 6f  s an abbreviatio
8770: 6e 20 6f 66 20 22 45 78 70 72 43 6f 64 65 45 78  n of "ExprCodeEx
8780: 70 72 4c 69 73 74 22 20 2a 2f 0a 20 20 20 20 45  prList" */.    E
8790: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
87a0: 0a 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d  .    if( eDest==
87b0: 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
87c0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
87d0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
87e0: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 65 63  tine ){.      ec
87f0: 65 6c 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  elFlags = SQLITE
8800: 5f 45 43 45 4c 5f 44 55 50 3b 0a 20 20 20 20 7d  _ECEL_DUP;.    }
8810: 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 63 65 6c  else{.      ecel
8820: 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d  Flags = 0;.    }
8830: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 26  .    if( pSort &
8840: 26 20 68 61 73 44 69 73 74 69 6e 63 74 3d 3d 30  & hasDistinct==0
8850: 20 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 45   && eDest!=SRT_E
8860: 70 68 65 6d 54 61 62 20 26 26 20 65 44 65 73 74  phemTab && eDest
8870: 21 3d 53 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20  !=SRT_Table ){. 
8880: 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63 68       /* For each
8890: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 70   expression in p
88a0: 2d 3e 70 45 4c 69 73 74 20 74 68 61 74 20 69 73  ->pEList that is
88b0: 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 20 65 78   a copy of an ex
88c0: 70 72 65 73 73 69 6f 6e 20 69 6e 0a 20 20 20 20  pression in.    
88d0: 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42    ** the ORDER B
88e0: 59 20 63 6c 61 75 73 65 20 28 70 53 6f 72 74 2d  Y clause (pSort-
88f0: 3e 70 4f 72 64 65 72 42 79 29 2c 20 73 65 74 20  >pOrderBy), set 
8900: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a  the associated .
8910: 20 20 20 20 20 20 2a 2a 20 69 4f 72 64 65 72 42        ** iOrderB
8920: 79 43 6f 6c 20 76 61 6c 75 65 20 74 6f 20 6f 6e  yCol value to on
8930: 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20  e more than the 
8940: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 44  index of the ORD
8950: 45 52 20 42 59 20 0a 20 20 20 20 20 20 2a 2a 20  ER BY .      ** 
8960: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 69  expression withi
8970: 6e 20 74 68 65 20 73 6f 72 74 2d 6b 65 79 20 74  n the sort-key t
8980: 68 61 74 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74  hat pushOntoSort
8990: 65 72 28 29 20 77 69 6c 6c 20 67 65 6e 65 72 61  er() will genera
89a0: 74 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  te..      ** Thi
89b0: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 70 2d 3e  s allows the p->
89c0: 70 45 4c 69 73 74 20 66 69 65 6c 64 20 74 6f 20  pEList field to 
89d0: 62 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  be omitted from 
89e0: 74 68 65 20 73 6f 72 74 65 64 20 72 65 63 6f 72  the sorted recor
89f0: 64 2c 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 69  d,.      ** savi
8a00: 6e 67 20 73 70 61 63 65 20 61 6e 64 20 43 50 55  ng space and CPU
8a10: 20 63 79 63 6c 65 73 2e 20 20 2a 2f 0a 20 20 20   cycles.  */.   
8a20: 20 20 20 65 63 65 6c 46 6c 61 67 73 20 7c 3d 20     ecelFlags |= 
8a30: 28 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49  (SQLITE_ECEL_OMI
8a40: 54 52 45 46 7c 53 51 4c 49 54 45 5f 45 43 45 4c  TREF|SQLITE_ECEL
8a50: 5f 52 45 46 29 3b 0a 0a 20 20 20 20 20 20 66 6f  _REF);..      fo
8a60: 72 28 69 3d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  r(i=pSort->nOBSa
8a70: 74 3b 20 69 3c 70 53 6f 72 74 2d 3e 70 4f 72 64  t; i<pSort->pOrd
8a80: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
8a90: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  ){.        int j
8aa0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6a  ;.        if( (j
8ab0: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
8ac0: 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  By->a[i].u.x.iOr
8ad0: 64 65 72 42 79 43 6f 6c 29 3e 30 20 29 7b 0a 20  derByCol)>0 ){. 
8ae0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69           p->pELi
8af0: 73 74 2d 3e 61 5b 6a 2d 31 5d 2e 75 2e 78 2e 69  st->a[j-1].u.x.i
8b00: 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 69 2b 31  OrderByCol = i+1
8b10: 2d 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a  -pSort->nOBSat;.
8b20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8b30: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
8b40: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
8b50: 46 45 52 45 4e 43 45 53 0a 20 20 20 20 20 20 73  FERENCES.      s
8b60: 65 6c 65 63 74 45 78 70 72 44 65 66 65 72 28 70  electExprDefer(p
8b70: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2d  Parse, pSort, p-
8b80: 3e 70 45 4c 69 73 74 2c 20 26 70 45 78 74 72 61  >pEList, &pExtra
8b90: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
8ba0: 74 72 61 20 26 26 20 70 50 61 72 73 65 2d 3e 64  tra && pParse->d
8bb0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
8bc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
8bd0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
8be0: 79 20 65 78 74 72 61 20 50 4b 20 63 6f 6c 75 6d  y extra PK colum
8bf0: 6e 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65  ns to add to the
8c00: 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 73 2c   sorter records,
8c10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
8c20: 63 61 74 65 20 65 78 74 72 61 20 6d 65 6d 6f 72  cate extra memor
8c30: 79 20 63 65 6c 6c 73 20 61 6e 64 20 61 64 6a 75  y cells and adju
8c40: 73 74 20 74 68 65 20 4f 70 65 6e 45 70 68 65 6d  st the OpenEphem
8c50: 65 72 61 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a  eral .        **
8c60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
8c70: 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
8c80: 6c 61 72 67 65 72 20 72 65 63 6f 72 64 73 2e 20  larger records. 
8c90: 54 68 69 73 20 69 73 20 6f 6e 6c 79 0a 20 20 20  This is only.   
8ca0: 20 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64       ** required
8cb0: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e   if there are on
8cc0: 65 20 6f 72 20 6d 6f 72 65 20 57 49 54 48 4f 55  e or more WITHOU
8cd0: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 77  T ROWID tables w
8ce0: 69 74 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  ith.        ** c
8cf0: 6f 6d 70 6f 73 69 74 65 20 70 72 69 6d 61 72 79  omposite primary
8d00: 20 6b 65 79 73 20 69 6e 20 74 68 65 20 53 6f 72   keys in the Sor
8d10: 74 43 74 78 2e 61 44 65 66 65 72 5b 5d 20 61 72  tCtx.aDefer[] ar
8d20: 72 61 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ray.  */.       
8d30: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 73   VdbeOp *pOp = s
8d40: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
8d50: 76 2c 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f  v, pSort->addrSo
8d60: 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  rtIndex);.      
8d70: 20 20 70 4f 70 2d 3e 70 32 20 2b 3d 20 28 70 45    pOp->p2 += (pE
8d80: 78 74 72 61 2d 3e 6e 45 78 70 72 20 2d 20 70 53  xtra->nExpr - pS
8d90: 6f 72 74 2d 3e 6e 44 65 66 65 72 29 3b 0a 20 20  ort->nDefer);.  
8da0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b        pOp->p4.pK
8db0: 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c  eyInfo->nAllFiel
8dc0: 64 20 2b 3d 20 28 70 45 78 74 72 61 2d 3e 6e 45  d += (pExtra->nE
8dd0: 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 44 65  xpr - pSort->nDe
8de0: 66 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50  fer);.        pP
8df0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 45  arse->nMem += pE
8e00: 78 74 72 61 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  xtra->nExpr;.   
8e10: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
8e20: 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e 52 65     /* Adjust nRe
8e30: 73 75 6c 74 43 6f 6c 20 74 6f 20 61 63 63 6f 75  sultCol to accou
8e40: 6e 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 73 20 74  nt for columns t
8e50: 68 61 74 20 61 72 65 20 6f 6d 69 74 74 65 64 0a  hat are omitted.
8e60: 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
8e70: 65 20 73 6f 72 74 65 72 20 62 79 20 74 68 65 20  e sorter by the 
8e80: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e  optimizations in
8e90: 20 74 68 69 73 20 62 72 61 6e 63 68 20 2a 2f 0a   this branch */.
8ea0: 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
8eb0: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  ->pEList;.      
8ec0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
8ed0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
8ee0: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 4c 69          if( pELi
8ef0: 73 74 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  st->a[i].u.x.iOr
8f00: 64 65 72 42 79 43 6f 6c 3e 30 0a 23 69 66 64 65  derByCol>0.#ifde
8f10: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8f20: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
8f30: 53 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45  S.         || pE
8f40: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 62 53 6f 72 74  List->a[i].bSort
8f50: 65 72 52 65 66 0a 23 65 6e 64 69 66 0a 20 20 20  erRef.#endif.   
8f60: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
8f70: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 2d 3b 0a    nResultCol--;.
8f80: 20 20 20 20 20 20 20 20 20 20 72 65 67 4f 72 69            regOri
8f90: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  g = 0;.        }
8fa0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
8fb0: 74 65 73 74 63 61 73 65 28 20 72 65 67 4f 72 69  testcase( regOri
8fc0: 67 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  g );.      testc
8fd0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
8fe0: 53 65 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Set );.      tes
8ff0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
9000: 54 5f 4d 65 6d 20 29 3b 0a 20 20 20 20 20 20 74  T_Mem );.      t
9010: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
9020: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
9030: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9040: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
9050: 75 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ut );.      asse
9060: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53  rt( eDest==SRT_S
9070: 65 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  et || eDest==SRT
9080: 5f 4d 65 6d 20 0a 20 20 20 20 20 20 20 20 20 20  _Mem .          
9090: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
90a0: 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73  oroutine || eDes
90b0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
90c0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 52 6f 77 4c  .    }.    sRowL
90d0: 6f 61 64 49 6e 66 6f 2e 72 65 67 52 65 73 75 6c  oadInfo.regResul
90e0: 74 20 3d 20 72 65 67 52 65 73 75 6c 74 3b 0a 20  t = regResult;. 
90f0: 20 20 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e     sRowLoadInfo.
9100: 65 63 65 6c 46 6c 61 67 73 20 3d 20 65 63 65 6c  ecelFlags = ecel
9110: 46 6c 61 67 73 3b 0a 23 69 66 64 65 66 20 53 51  Flags;.#ifdef SQ
9120: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
9130: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
9140: 20 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 70    sRowLoadInfo.p
9150: 45 78 74 72 61 20 3d 20 70 45 78 74 72 61 3b 0a  Extra = pExtra;.
9160: 20 20 20 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f      sRowLoadInfo
9170: 2e 72 65 67 45 78 74 72 61 52 65 73 75 6c 74 20  .regExtraResult 
9180: 3d 20 72 65 67 52 65 73 75 6c 74 20 2b 20 6e 52  = regResult + nR
9190: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 69 66  esultCol;.    if
91a0: 28 20 70 45 78 74 72 61 20 29 20 6e 52 65 73 75  ( pExtra ) nResu
91b0: 6c 74 43 6f 6c 20 2b 3d 20 70 45 78 74 72 61 2d  ltCol += pExtra-
91c0: 3e 6e 45 78 70 72 3b 0a 23 65 6e 64 69 66 0a 20  >nExpr;.#endif. 
91d0: 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74     if( p->iLimit
91e0: 0a 20 20 20 20 20 26 26 20 28 65 63 65 6c 46 6c  .     && (ecelFl
91f0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 45 43 45  ags & SQLITE_ECE
9200: 4c 5f 4f 4d 49 54 52 45 46 29 21 3d 30 20 0a 20  L_OMITREF)!=0 . 
9210: 20 20 20 20 26 26 20 6e 50 72 65 66 69 78 52 65      && nPrefixRe
9220: 67 3e 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  g>0.    ){.     
9230: 20 61 73 73 65 72 74 28 20 70 53 6f 72 74 21 3d   assert( pSort!=
9240: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
9250: 74 28 20 68 61 73 44 69 73 74 69 6e 63 74 3d 3d  t( hasDistinct==
9260: 30 20 29 3b 0a 20 20 20 20 20 20 70 53 6f 72 74  0 );.      pSort
9270: 2d 3e 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f  ->pDeferredRowLo
9280: 61 64 20 3d 20 26 73 52 6f 77 4c 6f 61 64 49 6e  ad = &sRowLoadIn
9290: 66 6f 3b 0a 20 20 20 20 20 20 72 65 67 4f 72 69  fo;.      regOri
92a0: 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 0;.    }else
92b0: 7b 0a 20 20 20 20 20 20 69 6e 6e 65 72 4c 6f 6f  {.      innerLoo
92c0: 70 4c 6f 61 64 52 6f 77 28 70 50 61 72 73 65 2c  pLoadRow(pParse,
92d0: 20 70 2c 20 26 73 52 6f 77 4c 6f 61 64 49 6e 66   p, &sRowLoadInf
92e0: 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  o);.    }.  }.. 
92f0: 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53 54 49   /* If the DISTI
9300: 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20  NCT keyword was 
9310: 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53  present on the S
9320: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
9330: 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f    ** and this ro
9340: 77 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20  w has been seen 
9350: 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20  before, then do 
9360: 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f  not make this ro
9370: 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74  w.  ** part of t
9380: 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a  he result..  */.
9390: 20 20 69 66 28 20 68 61 73 44 69 73 74 69 6e 63    if( hasDistinc
93a0: 74 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  t ){.    switch(
93b0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63   pDistinct->eTnc
93c0: 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  tType ){.      c
93d0: 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
93e0: 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20  CT_ORDERED: {.  
93f0: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
9400: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
9410: 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69   No longer requi
9420: 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65 72 61  red OpenEphemera
9430: 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20  l instr. */.    
9440: 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b 20 20      int iJump;  
9450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
9460: 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
9470: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
9480: 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  egPrev;         
9490: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
94a0: 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  ow content */.. 
94b0: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
94c0: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
94d0: 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f   previous row */
94e0: 0a 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76  .        regPrev
94f0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
9500: 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  1;.        pPars
9510: 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75  e->nMem += nResu
9520: 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20  ltCol;..        
9530: 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 4f 50  /* Change the OP
9540: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 63  _OpenEphemeral c
9550: 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74 6f 20  oded earlier to 
9560: 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20  an OP_Null.     
9570: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 4d     ** sets the M
9580: 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74 20 6f  EM_Cleared bit o
9590: 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  n the first regi
95a0: 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20  ster of the.    
95b0: 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
95c0: 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77 69 6c  value.  This wil
95d0: 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50 5f 4e  l cause the OP_N
95e0: 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79  e below to alway
95f0: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61 69  s.        ** fai
9600: 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69  l on the first i
9610: 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
9620: 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74 68 65  loop even if the
9630: 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a   first.        *
9640: 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c  * row is all NUL
9650: 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  Ls..        */. 
9660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9670: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
9680: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
9690: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
96a0: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
96b0: 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73 74 69  eGetOp(v, pDisti
96c0: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
96d0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
96e0: 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20  ode = OP_Null;. 
96f0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
9700: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   1;.        pOp-
9710: 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a  >p2 = regPrev;..
9720: 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20 3d 20          iJump = 
9730: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
9740: 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 52 65 73  ntAddr(v) + nRes
9750: 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ultCol;.        
9760: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75  for(i=0; i<nResu
9770: 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ltCol; i++){.   
9780: 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
9790: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
97a0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
97b0: 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  e, p->pEList->a[
97c0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
97d0: 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73 75       if( i<nResu
97e0: 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  ltCol-1 ){.     
97f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9800: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
9810: 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  e, regResult+i, 
9820: 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b 69  iJump, regPrev+i
9830: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 56  );.            V
9840: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
9850: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
9860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
9870: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
9880: 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75  , OP_Eq, regResu
9890: 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  lt+i, iContinue,
98a0: 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20   regPrev+i);.   
98b0: 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
98c0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
98d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
98e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
98f0: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
9900: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
9910: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
9920: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9930: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
9940: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
9950: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9960: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9970: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
9980: 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70 50 61  v)==iJump || pPa
9990: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
99a0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
99b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
99c0: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
99d0: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
99e0: 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29  v, nResultCol-1)
99f0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9a00: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
9a10: 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
9a20: 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20  NCT_UNIQUE: {.  
9a30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9a40: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
9a50: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
9a60: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Tnct);.        b
9a70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
9a80: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
9a90: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9aa0: 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74  pDistinct->eTnct
9ab0: 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
9ac0: 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
9ad0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44 69  ;.        codeDi
9ae0: 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
9af0: 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63  Distinct->tabTnc
9b00: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52  t, iContinue, nR
9b10: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
9b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
9b30: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
9b40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9b50: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
9b60: 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pSort==0 ){.    
9b70: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
9b80: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
9b90: 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  tinue);.    }.  
9ba0: 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65  }..  switch( eDe
9bb0: 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  st ){.    /* In 
9bc0: 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65  this mode, write
9bd0: 20 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75   each query resu
9be0: 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66  lt to the key of
9bf0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20   the temporary. 
9c00: 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72     ** table iPar
9c10: 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  m..    */.#ifnde
9c20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
9c30: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
9c40: 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e    case SRT_Union
9c50: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
9c60: 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
9c70: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
9c80: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
9c90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9ca0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
9cb0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
9cc0: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20  sultCol, r1);.  
9cd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9ce0: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49  ddOp4Int(v, OP_I
9cf0: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
9d00: 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74 2c 20   r1, regResult, 
9d10: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
9d20: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
9d30: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
9d40: 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
9d50: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
9d60: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63   Construct a rec
9d70: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65  ord from the que
9d80: 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69  ry result, but i
9d90: 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
9da0: 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65 63   saving that rec
9db0: 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20 61  ord, use it as a
9dc0: 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65   key to delete e
9dd0: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20  lements from.   
9de0: 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72   ** the temporar
9df0: 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20  y table iParm.. 
9e00: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
9e10: 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20  RT_Except: {.   
9e20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9e30: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65  dOp3(v, OP_IdxDe
9e40: 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67  lete, iParm, reg
9e50: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
9e60: 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ol);.      break
9e70: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
9e80: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
9e90: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f  MPOUND_SELECT */
9ea0: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  ..    /* Store t
9eb0: 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
9ec0: 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
9ed0: 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
9ee0: 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f 3a 0a   case SRT_Fifo:.
9ef0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
9f00: 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73 65 20  tFifo:.    case 
9f10: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
9f20: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
9f30: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31  : {.      int r1
9f40: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
9f50: 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
9f60: 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20 20  PrefixReg+1);.  
9f70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
9f80: 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29  est==SRT_Table )
9f90: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9fa0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  ( eDest==SRT_Eph
9fb0: 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 74  emTab );.      t
9fc0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
9fd0: 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 20 20  SRT_Fifo );.    
9fe0: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
9ff0: 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20  t==SRT_DistFifo 
a000: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
a010: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
a020: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
a030: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
a040: 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78 52 65  ol, r1+nPrefixRe
a050: 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  g);.#ifndef SQLI
a060: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
a070: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
a080: 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20 20 20  _DistFifo ){.   
a090: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
a0a0: 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44 69  estination is Di
a0b0: 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63 75 72  stFifo, then cur
a0c0: 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73  sor (iParm+1) is
a0d0: 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   open.        **
a0e0: 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c   on an ephemeral
a0f0: 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63   index. If the c
a100: 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c  urrent row is al
a110: 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20  ready present.  
a120: 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
a130: 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72  index, do not wr
a140: 69 74 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75  ite it to the ou
a150: 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64  tput. If not, ad
a160: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
a170: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20   current row to 
a180: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72  the index and pr
a190: 6f 63 65 65 64 20 77 69 74 68 20 77 72 69 74 69  oceed with writi
a1a0: 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20  ng it to the.   
a1b0: 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74       ** output t
a1c0: 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a  able as well.  *
a1d0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
a1e0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
a1f0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
a200: 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   4;.        sqli
a210: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
a220: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
a230: 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c  arm+1, addr, r1,
a240: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   0);.        Vdb
a250: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
a260: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a270: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
a280: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
a290: 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73 75 6c  m+1, r1,regResul
a2a0: 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  t,nResultCol);. 
a2b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a2c0: 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sort==0 );.     
a2d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
a2e0: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
a2f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67       assert( reg
a300: 52 65 73 75 6c 74 3d 3d 72 65 67 4f 72 69 67 20  Result==regOrig 
a310: 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  );.        pushO
a320: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
a330: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 31 2b 6e  , pSort, p, r1+n
a340: 50 72 65 66 69 78 52 65 67 2c 20 72 65 67 4f 72  PrefixReg, regOr
a350: 69 67 2c 20 31 2c 20 6e 50 72 65 66 69 78 52 65  ig, 1, nPrefixRe
a360: 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
a370: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 20  .        int r2 
a380: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
a390: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
a3a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a3b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
a3c0: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 32  Rowid, iParm, r2
a3d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a3e0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
a3f0: 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  OP_Insert, iParm
a400: 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
a410: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
a420: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
a430: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
a440: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
a450: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
a460: 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r2);.      }.   
a470: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
a480: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
a490: 65 2c 20 72 31 2c 20 6e 50 72 65 66 69 78 52 65  e, r1, nPrefixRe
a4a0: 67 2b 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  g+1);.      brea
a4b0: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  k;.    }..#ifnde
a4c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
a4d0: 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66  BQUERY.    /* If
a4e0: 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67   we are creating
a4f0: 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65   a set for an "e
a500: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
a510: 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a  ..)" construct,.
a520: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
a530: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69  e should be a si
a540: 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65  ngle item on the
a550: 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74   stack.  Write t
a560: 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20  his.    ** item 
a570: 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62  into the set tab
a580: 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61  le with bogus da
a590: 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ta..    */.    c
a5a0: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
a5b0: 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29       if( pSort )
a5c0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
a5d0: 66 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75  first glance you
a5e0: 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20   would think we 
a5f0: 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f  could optimize o
a600: 75 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ut the.        *
a610: 2a 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68  * ORDER BY in th
a620: 69 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68  is case since th
a630: 65 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69  e order of entri
a640: 65 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20  es in the set.  
a650: 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f        ** does no
a660: 74 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74  t matter.  But t
a670: 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20  here might be a 
a680: 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e  LIMIT clause, in
a690: 20 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a   which.        *
a6a0: 2a 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72  * case the order
a6b0: 20 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a   does matter */.
a6c0: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
a6d0: 53 6f 72 74 65 72 28 0a 20 20 20 20 20 20 20 20  Sorter(.        
a6e0: 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 6f 72      pParse, pSor
a6f0: 74 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 2c  t, p, regResult,
a700: 20 72 65 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c   regOrig, nResul
a710: 74 43 6f 6c 2c 20 6e 50 72 65 66 69 78 52 65 67  tCol, nPrefixReg
a720: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a730: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
a740: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
a750: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
a760: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
a770: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 65 73  te3Strlen30(pDes
a780: 74 2d 3e 7a 41 66 66 53 64 73 74 29 3d 3d 6e 52  t->zAffSdst)==nR
a790: 65 73 75 6c 74 43 6f 6c 20 29 3b 0a 20 20 20 20  esultCol );.    
a7a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a7b0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
a7c0: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
a7d0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 0a  t, nResultCol, .
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
a7f0: 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c  pDest->zAffSdst,
a800: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
a810: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
a820: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
a830: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
a840: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
a850: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
a860: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
a870: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
a880: 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65  t, iParm, r1, re
a890: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
a8a0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
a8b0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
a8c0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
a8d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
a8e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
a8f0: 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65   /* If any row e
a900: 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75  xist in the resu
a910: 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74  lt set, record t
a920: 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f  hat fact and abo
a930: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rt..    */.    c
a940: 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20  ase SRT_Exists: 
a950: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
a960: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a970: 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72  Integer, 1, iPar
a980: 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  m);.      /* The
a990: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
a9a0: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
a9b0: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
a9c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a9d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
a9e0: 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
a9f0: 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
aa00: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
aa10: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
aa20: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
aa30: 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
aa40: 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
aa50: 6c 20 6f 72 20 61 72 72 61 79 20 6f 66 20 0a 20  l or array of . 
aa60: 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 65 6c     ** memory cel
aa70: 6c 73 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ls and break out
aa80: 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
aa90: 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
aaa0: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
aab0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
aac0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
aad0: 20 6e 52 65 73 75 6c 74 43 6f 6c 3c 3d 70 44 65   nResultCol<=pDe
aae0: 73 74 2d 3e 6e 53 64 73 74 20 29 3b 0a 20 20 20  st->nSdst );.   
aaf0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
ab00: 74 65 72 28 0a 20 20 20 20 20 20 20 20 20 20 20  ter(.           
ab10: 20 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20   pParse, pSort, 
ab20: 70 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  p, regResult, re
ab30: 67 4f 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f  gOrig, nResultCo
ab40: 6c 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a  l, nPrefixReg);.
ab50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ab60: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65       assert( nRe
ab70: 73 75 6c 74 43 6f 6c 3d 3d 70 44 65 73 74 2d 3e  sultCol==pDest->
ab80: 6e 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20  nSdst );.       
ab90: 20 61 73 73 65 72 74 28 20 72 65 67 52 65 73 75   assert( regResu
aba0: 6c 74 3d 3d 69 50 61 72 6d 20 29 3b 0a 20 20 20  lt==iParm );.   
abb0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
abc0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75  T clause will ju
abd0: 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  mp out of the lo
abe0: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
abf0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
ac00: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
ac10: 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
ac20: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
ac30: 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  /..    case SRT_
ac40: 43 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20  Coroutine:      
ac50: 20 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f   /* Send data to
ac60: 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f   a co-routine */
ac70: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75  .    case SRT_Ou
ac80: 74 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f  tput: {        /
ac90: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73  * Return the res
aca0: 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65  ults */.      te
acb0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
acc0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a  RT_Coroutine );.
acd0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ace0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
acf0: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
ad00: 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
ad10: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
ad20: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c  Parse, pSort, p,
ad30: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f   regResult, regO
ad40: 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  rig, nResultCol,
ad50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ad60: 20 20 20 20 20 20 20 20 6e 50 72 65 66 69 78 52          nPrefixR
ad70: 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eg);.      }else
ad80: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
ad90: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
ada0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
adb0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
adc0: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
add0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  rm);.      }else
ade0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
adf0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
ae00: 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67  P_ResultRow, reg
ae10: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
ae20: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
ae30: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
ae40: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
ae50: 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  se, regResult, n
ae60: 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20  ResultCol);.    
ae70: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
ae80: 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
ae90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
aea0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
aeb0: 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61 20   results into a 
aec0: 70 72 69 6f 72 69 74 79 20 71 75 65 75 65 20 74  priority queue t
aed0: 68 61 74 20 69 73 20 6f 72 64 65 72 20 61 63 63  hat is order acc
aee0: 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a  ording to.    **
aef0: 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79   pDest->pOrderBy
af00: 20 28 69 6e 20 70 53 4f 29 2e 20 20 70 44 65 73   (in pSO).  pDes
af10: 74 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e 20 69  t->iSDParm (in i
af20: 50 61 72 6d 29 20 69 73 20 74 68 65 20 63 75 72  Parm) is the cur
af30: 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20 20 2a  sor for an.    *
af40: 2a 20 69 6e 64 65 78 20 77 69 74 68 20 70 53 4f  * index with pSO
af50: 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d 6e  ->nExpr+2 column
af60: 73 2e 20 20 42 75 69 6c 64 20 61 20 6b 65 79 20  s.  Build a key 
af70: 75 73 69 6e 67 20 70 53 4f 20 66 6f 72 20 74 68  using pSO for th
af80: 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 70  e first.    ** p
af90: 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d 6e  SO->nExpr column
afa0: 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  s, then make sur
afb0: 65 20 61 6c 6c 20 6b 65 79 73 20 61 72 65 20 75  e all keys are u
afc0: 6e 69 71 75 65 20 62 79 20 61 64 64 69 6e 67 20  nique by adding 
afd0: 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20 4f  a.    ** final O
afe0: 50 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c 75 6d  P_Sequence colum
aff0: 6e 2e 20 20 54 68 65 20 6c 61 73 74 20 63 6f 6c  n.  The last col
b000: 75 6d 6e 20 69 73 20 74 68 65 20 72 65 63 6f 72  umn is the recor
b010: 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20 20  d as a blob..   
b020: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
b030: 5f 44 69 73 74 51 75 65 75 65 3a 0a 20 20 20 20  _DistQueue:.    
b040: 63 61 73 65 20 53 52 54 5f 51 75 65 75 65 3a 20  case SRT_Queue: 
b050: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79  {.      int nKey
b060: 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20  ;.      int r1, 
b070: 72 32 2c 20 72 33 3b 0a 20 20 20 20 20 20 69 6e  r2, r3;.      in
b080: 74 20 61 64 64 72 54 65 73 74 20 3d 20 30 3b 0a  t addrTest = 0;.
b090: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
b0a0: 70 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20 3d  pSO;.      pSO =
b0b0: 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42 79   pDest->pOrderBy
b0c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b0d0: 70 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b 65  pSO );.      nKe
b0e0: 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b 0a  y = pSO->nExpr;.
b0f0: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
b100: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
b110: 72 73 65 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  rse);.      r2 =
b120: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
b130: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 4b 65  ange(pParse, nKe
b140: 79 2b 32 29 3b 0a 20 20 20 20 20 20 72 33 20 3d  y+2);.      r3 =
b150: 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20 20   r2+nKey+1;.    
b160: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
b170: 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20  _DistQueue ){.  
b180: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
b190: 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 44  destination is D
b1a0: 69 73 74 51 75 65 75 65 2c 20 74 68 65 6e 20 63  istQueue, then c
b1b0: 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20  ursor (iParm+1) 
b1c0: 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  is open.        
b1d0: 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20 65  ** on a second e
b1e0: 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74  phemeral index t
b1f0: 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76 61  hat holds all va
b200: 6c 75 65 73 20 65 76 65 72 79 20 70 72 65 76 69  lues every previ
b210: 6f 75 73 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a  ously.        **
b220: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 71 75   added to the qu
b230: 65 75 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  eue. */.        
b240: 61 64 64 72 54 65 73 74 20 3d 20 73 71 6c 69 74  addrTest = sqlit
b250: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
b260: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61  v, OP_Found, iPa
b270: 72 6d 2b 31 2c 20 30 2c 20 0a 20 20 20 20 20 20  rm+1, 0, .      
b280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2a0: 20 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65    regResult, nRe
b2b0: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
b2c0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
b2d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b2e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b2f0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
b300: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
b310: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33 29 3b  nResultCol, r3);
b320: 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74  .      if( eDest
b330: 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  ==SRT_DistQueue 
b340: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b350: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b360: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
b370: 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20 20  arm+1, r3);.    
b380: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
b390: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
b3a0: 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
b3b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b3c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b  for(i=0; i<nKey;
b3d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
b3e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b3f0: 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20  (v, OP_SCopy,.  
b400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b410: 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c          regResul
b420: 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e  t + pSO->a[i].u.
b430: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20  x.iOrderByCol - 
b440: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
b450: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 32 2b               r2+
b460: 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
b470: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b480: 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e  Op2(v, OP_Sequen
b490: 63 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e 4b  ce, iParm, r2+nK
b4a0: 65 79 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ey);.      sqlit
b4b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
b4c0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
b4d0: 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b 0a  2, nKey+2, r1);.
b4e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b4f0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
b500: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
b510: 6d 2c 20 72 31 2c 20 72 32 2c 20 6e 4b 65 79 2b  m, r1, r2, nKey+
b520: 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 64  2);.      if( ad
b530: 64 72 54 65 73 74 20 29 20 73 71 6c 69 74 65 33  drTest ) sqlite3
b540: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
b550: 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20 20 20  addrTest);.     
b560: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
b570: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
b580: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
b590: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
b5a0: 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20 6e 4b  e(pParse, r2, nK
b5b0: 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62 72 65  ey+2);.      bre
b5c0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
b5d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
b5e0: 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64  CTE */....#if !d
b5f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
b600: 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20  IT_TRIGGER).    
b610: 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 72  /* Discard the r
b620: 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69 73  esults.  This is
b630: 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43 54   used for SELECT
b640: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73 69   statements insi
b650: 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6f  de.    ** the bo
b660: 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52 2e  dy of a TRIGGER.
b670: 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66    The purpose of
b680: 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69 73   such selects is
b690: 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20   to call.    ** 
b6a0: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
b6b0: 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65  ctions that have
b6c0: 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20 20   side effects.  
b6d0: 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 20  We do not care. 
b6e0: 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65 20     ** about the 
b6f0: 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20 6f  actual results o
b700: 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20 20  f the select..  
b710: 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
b720: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
b730: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
b740: 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62 72  card );.      br
b750: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
b760: 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  f.  }..  /* Jump
b770: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
b780: 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
b790: 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
b7a0: 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20 20 2a    Except, if.  *
b7b0: 2a 20 74 68 65 72 65 20 69 73 20 61 20 73 6f 72  * there is a sor
b7c0: 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20 63 61  ter, in which ca
b7d0: 73 65 20 74 68 65 20 73 6f 72 74 65 72 20 68 61  se the sorter ha
b7e0: 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69 74 65  s already limite
b7f0: 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70 75  d.  ** the outpu
b800: 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a 20  t for us..  */. 
b810: 20 69 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26   if( pSort==0 &&
b820: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
b830: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b840: 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75  Op2(v, OP_DecrJu
b850: 6d 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  mpZero, p->iLimi
b860: 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65  t, iBreak); Vdbe
b870: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
b880: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
b890: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  te a KeyInfo obj
b8a0: 65 63 74 20 73 75 66 66 69 63 69 65 6e 74 20 66  ect sufficient f
b8b0: 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66 20 4e  or an index of N
b8c0: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64   key columns and
b8d0: 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f 6c 75  .** X extra colu
b8e0: 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  mns..*/.KeyInfo 
b8f0: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41  *sqlite3KeyInfoA
b900: 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a 64 62  lloc(sqlite3 *db
b910: 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58 29 7b  , int N, int X){
b920: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20  .  int nExtra = 
b930: 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f  (N+X)*(sizeof(Co
b940: 6c 6c 53 65 71 2a 29 2b 31 29 20 2d 20 73 69 7a  llSeq*)+1) - siz
b950: 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 3b 0a 20  eof(CollSeq*);. 
b960: 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d 20 73 71   KeyInfo *p = sq
b970: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
b980: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 4b 65  NN(db, sizeof(Ke
b990: 79 49 6e 66 6f 29 20 2b 20 6e 45 78 74 72 61 29  yInfo) + nExtra)
b9a0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
b9b0: 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d   p->aSortOrder =
b9c0: 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b   (u8*)&p->aColl[
b9d0: 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65  N+X];.    p->nKe
b9e0: 79 46 69 65 6c 64 20 3d 20 28 75 31 36 29 4e 3b  yField = (u16)N;
b9f0: 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 46 69 65 6c  .    p->nAllFiel
ba00: 64 20 3d 20 28 75 31 36 29 28 4e 2b 58 29 3b 0a  d = (u16)(N+X);.
ba10: 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43      p->enc = ENC
ba20: 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20  (db);.    p->db 
ba30: 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  = db;.    p->nRe
ba40: 66 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65  f = 1;.    memse
ba50: 74 28 26 70 5b 31 5d 2c 20 30 2c 20 6e 45 78 74  t(&p[1], 0, nExt
ba60: 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ra);.  }else{.  
ba70: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
ba80: 74 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74  t(db);.  }.  ret
ba90: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
baa0: 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79  Deallocate a Key
bab0: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76  Info object.*/.v
bac0: 6f 69 64 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  oid sqlite3KeyIn
bad0: 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20  foUnref(KeyInfo 
bae0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
baf0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
bb00: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e  Ref>0 );.    p->
bb10: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
bb20: 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c  p->nRef==0 ) sql
bb30: 69 74 65 33 44 62 46 72 65 65 4e 4e 28 70 2d 3e  ite3DbFreeNN(p->
bb40: 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  db, p);.  }.}../
bb50: 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20  *.** Make a new 
bb60: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79  pointer to a Key
bb70: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b  Info object.*/.K
bb80: 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b  eyInfo *sqlite3K
bb90: 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66  eyInfoRef(KeyInf
bba0: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
bbb0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
bbc0: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
bbd0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
bbe0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66  return p;.}..#if
bbf0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
bc00: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
bc10: 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66 6f 20  UE if a KeyInfo 
bc20: 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20 63 68  object can be ch
bc30: 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79 49 6e  ange.  The KeyIn
bc40: 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e  fo object.** can
bc50: 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67 65 64   only be changed
bc60: 20 69 66 20 74 68 69 73 20 69 73 20 6a 75 73 74   if this is just
bc70: 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65 72 65   a single refere
bc80: 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a 65 63  nce to the objec
bc90: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
bca0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e  utine is used on
bcb0: 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ly inside of ass
bcc0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
bcd0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
bce0: 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
bcf0: 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20  le(KeyInfo *p){ 
bd00: 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d  return p->nRef==
bd10: 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1; }.#endif /* S
bd20: 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
bd30: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65  /*.** Given an e
bd40: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
bd50: 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e  generate a KeyIn
bd60: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
bd70: 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  t records.** the
bd80: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
bd90: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78 70  nce for each exp
bda0: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20  ression in that 
bdb0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
bdc0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78  .**.** If the Ex
bdd0: 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44  prList is an ORD
bde0: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
bdf0: 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68  Y clause then th
be00: 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b  e resulting.** K
be10: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
be20: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
be30: 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  for initializing
be40: 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
be50: 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
be60: 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49   that clause.  I
be70: 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69  f the ExprList i
be80: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
be90: 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20   of a SELECT.** 
bea0: 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f  then the KeyInfo
beb0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
bec0: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
bed0: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
bee0: 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f  tual.** index to
bef0: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53   implement a DIS
bf00: 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a  TINCT test..**.*
bf10: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
bf20: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
bf30: 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 65  cture is obtaine
bf40: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20  d from malloc.  
bf50: 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  The calling.** f
bf60: 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f  unction is respo
bf70: 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e  nsible for seein
bf80: 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75  g that this stru
bf90: 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61  cture is eventua
bfa0: 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f  lly.** freed..*/
bfb0: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
bfc0: 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
bfd0: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
bfe0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
bff0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
c000: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
c010: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72  List,     /* For
c020: 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62  m the KeyInfo ob
c030: 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45  ject from this E
c040: 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  xprList */.  int
c050: 20 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20   iStart,        
c060: 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20    /* Begin with 
c070: 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70  this column of p
c080: 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  List */.  int nE
c090: 78 74 72 61 20 20 20 20 20 20 20 20 20 20 20 2f  xtra           /
c0a0: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
c0b0: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f  extra columns to
c0c0: 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 7b 0a 20   the end */.){. 
c0d0: 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65   int nExpr;.  Ke
c0e0: 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20  yInfo *pInfo;.  
c0f0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
c100: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73  item *pItem;.  s
c110: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
c120: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
c130: 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69  ;..  nExpr = pLi
c140: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
c150: 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
c160: 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78  nfoAlloc(db, nEx
c170: 70 72 2d 69 53 74 61 72 74 2c 20 6e 45 78 74 72  pr-iStart, nExtr
c180: 61 2b 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 66  a+1);.  if( pInf
c190: 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  o ){.    assert(
c1a0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
c1b0: 73 57 72 69 74 65 61 62 6c 65 28 70 49 6e 66 6f  sWriteable(pInfo
c1c0: 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 69  ) );.    for(i=i
c1d0: 53 74 61 72 74 2c 20 70 49 74 65 6d 3d 70 4c 69  Start, pItem=pLi
c1e0: 73 74 2d 3e 61 2b 69 53 74 61 72 74 3b 20 69 3c  st->a+iStart; i<
c1f0: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
c200: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49 6e 66  m++){.      pInf
c210: 6f 2d 3e 61 43 6f 6c 6c 5b 69 2d 69 53 74 61 72  o->aColl[i-iStar
c220: 74 5d 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  t] = sqlite3Expr
c230: 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  NNCollSeq(pParse
c240: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
c250: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53  .      pInfo->aS
c260: 6f 72 74 4f 72 64 65 72 5b 69 2d 69 53 74 61 72  ortOrder[i-iStar
c270: 74 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74  t] = pItem->sort
c280: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
c290: 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b  .  return pInfo;
c2a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f  .}../*.** Name o
c2b0: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
c2c0: 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20   operator, used 
c2d0: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
c2e0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
c2f0: 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74  nst char *select
c300: 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a  OpName(int id){.
c310: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69    char *z;.  swi
c320: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63  tch( id ){.    c
c330: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
c340: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c    z = "UNION ALL
c350: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
c360: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
c370: 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43  T: z = "INTERSEC
c380: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
c390: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
c3a0: 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22      z = "EXCEPT"
c3b0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
c3c0: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
c3d0: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22       z = "UNION"
c3e0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
c3f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
c400: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c410: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
c420: 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45  .** Unless an "E
c430: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
c440: 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65  N" command is be
c450: 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74  ing processed, t
c460: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
c470: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  is a no-op. Othe
c480: 72 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61  rwise, it adds a
c490: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f   single row of o
c4a0: 75 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50  utput to the EQP
c4b0: 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72   result,.** wher
c4c0: 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73  e the caption is
c4d0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a   of the form:.**
c4e0: 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20  .**   "USE TEMP 
c4f0: 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a  B-TREE FOR xxx".
c500: 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20  **.** where xxx 
c510: 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49  is one of "DISTI
c520: 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22  NCT", "ORDER BY"
c530: 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20   or "GROUP BY". 
c540: 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a  Exactly which.**
c550: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
c560: 79 20 74 68 65 20 7a 55 73 61 67 65 20 61 72 67  y the zUsage arg
c570: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
c580: 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d   void explainTem
c590: 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
c5a0: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
c5b0: 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 45 78 70   *zUsage){.  Exp
c5c0: 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
c5d0: 50 61 72 73 65 2c 20 30 2c 20 22 55 53 45 20 54  Parse, 0, "USE T
c5e0: 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25  EMP B-TREE FOR %
c5f0: 73 22 2c 20 7a 55 73 61 67 65 29 29 3b 0a 7d 0a  s", zUsage));.}.
c600: 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78  ./*.** Assign ex
c610: 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76  pression b to lv
c620: 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f 6e 64  alue a. A second
c630: 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e  , no-op, version
c640: 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a   of this macro.*
c650: 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20 77 68  * is provided wh
c660: 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  en SQLITE_OMIT_E
c670: 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69 6e 65  XPLAIN is define
c680: 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  d. This allows t
c690: 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71  he code.** in sq
c6a0: 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 74 6f  lite3Select() to
c6b0: 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73 20 74   assign values t
c6c0: 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65 6d 62  o structure memb
c6d0: 65 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  er variables tha
c6e0: 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20  t.** only exist 
c6f0: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  if SQLITE_OMIT_E
c700: 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64 65  XPLAIN is not de
c710: 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20 70 6f  fined without po
c720: 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63  lluting the.** c
c730: 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64 65 66  ode with #ifndef
c740: 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a   directives..*/.
c750: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
c760: 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20 62 29  SetInteger(a, b)
c770: 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a   a = b..#else./*
c780: 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20   No-op versions 
c790: 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58  of the explainXX
c7a0: 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  X() functions an
c7b0: 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64  d macros. */.# d
c7c0: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d  efine explainTem
c7d0: 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65  pTable(y,z).# de
c7e0: 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49  fine explainSetI
c7f0: 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64  nteger(y,z).#end
c800: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  if.../*.** If th
c810: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73  e inner loop was
c820: 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67   generated using
c830: 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64   a non-null pOrd
c840: 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  erBy argument,.*
c850: 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  * then the resul
c860: 74 73 20 77 65 72 65 20 70 6c 61 63 65 64 20 69  ts were placed i
c870: 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74  n a sorter.  Aft
c880: 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74  er the loop is t
c890: 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20  erminated.** we 
c8a0: 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20  need to run the 
c8b0: 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75  sorter and outpu
c8c0: 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  t the results.  
c8d0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  The following.**
c8e0: 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
c8f0: 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64  es the code need
c900: 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ed to do that..*
c910: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
c920: 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a  nerateSortTail(.
c930: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c940: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
c950: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
c960: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a  ct *p,        /*
c970: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
c980: 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 6f 72 74 43  ement */.  SortC
c990: 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 2f 2a 20  tx *pSort,   /* 
c9a0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74  Information on t
c9b0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
c9c0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  se */.  int nCol
c9d0: 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d  umn,      /* Num
c9e0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f  ber of columns o
c9f0: 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  f data */.  Sele
ca00: 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a  ctDest *pDest /*
ca10: 20 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65   Write the sorte
ca20: 64 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  d results here *
ca30: 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
ca40: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca60: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
ca70: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
ca80: 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b  .  int addrBreak
ca90: 20 3d 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 44   = pSort->labelD
caa0: 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  one;            
cab0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
cac0: 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  exit loop */.  i
cad0: 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20  nt addrContinue 
cae0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
caf0: 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a  eLabel(v);  /* J
cb00: 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78  ump here for nex
cb10: 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74  t cycle */.  int
cb20: 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20   addr;          
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cb40: 54 6f 70 20 6f 66 20 6f 75 74 70 75 74 20 6c 6f  Top of output lo
cb50: 6f 70 2e 20 4a 75 6d 70 20 66 6f 72 20 4e 65 78  op. Jump for Nex
cb60: 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  t. */.  int addr
cb70: 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Once = 0;.  int 
cb80: 69 54 61 62 3b 0a 20 20 45 78 70 72 4c 69 73 74  iTab;.  ExprList
cb90: 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53 6f   *pOrderBy = pSo
cba0: 72 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  rt->pOrderBy;.  
cbb0: 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73  int eDest = pDes
cbc0: 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20  t->eDest;.  int 
cbd0: 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69  iParm = pDest->i
cbe0: 53 44 50 61 72 6d 3b 0a 20 20 69 6e 74 20 72 65  SDParm;.  int re
cbf0: 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52  gRow;.  int regR
cc00: 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69 43 6f 6c  owid;.  int iCol
cc10: 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20  ;.  int nKey;   
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
cc40: 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   key columns in 
cc50: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
cc60: 0a 20 20 69 6e 74 20 69 53 6f 72 74 54 61 62 3b  .  int iSortTab;
cc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc80: 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63 75 72     /* Sorter cur
cc90: 73 6f 72 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  sor to read from
cca0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   */.  int i;.  i
ccb0: 6e 74 20 62 53 65 71 3b 20 20 20 20 20 20 20 20  nt bSeq;        
ccc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ccd0: 2a 20 54 72 75 65 20 69 66 20 73 6f 72 74 65 72  * True if sorter
cce0: 20 72 65 63 6f 72 64 20 69 6e 63 6c 75 64 65 73   record includes
ccf0: 20 73 65 71 2e 20 6e 6f 2e 20 2a 2f 0a 20 20 69   seq. no. */.  i
cd00: 6e 74 20 6e 52 65 66 4b 65 79 20 3d 20 30 3b 0a  nt nRefKey = 0;.
cd10: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
cd20: 74 5f 69 74 65 6d 20 2a 61 4f 75 74 45 78 20 3d  t_item *aOutEx =
cd30: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 0a   p->pEList->a;..
cd40: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 42 72    assert( addrBr
cd50: 65 61 6b 3c 30 20 29 3b 0a 20 20 69 66 28 20 70  eak<0 );.  if( p
cd60: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
cd70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
cd80: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cd90: 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65  Gosub, pSort->re
cda0: 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  gReturn, pSort->
cdb0: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20  labelBkOut);.   
cdc0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
cdd0: 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  (v, addrBreak);.
cde0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
cdf0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
ce00: 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74  Sort->labelBkOut
ce10: 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  );.  }..#ifdef S
ce20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
ce30: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20  TER_REFERENCES. 
ce40: 20 2f 2a 20 4f 70 65 6e 20 61 6e 79 20 63 75 72   /* Open any cur
ce50: 73 6f 72 73 20 6e 65 65 64 65 64 20 66 6f 72 20  sors needed for 
ce60: 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63 65  sorter-reference
ce70: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
ce80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 6f    for(i=0; i<pSo
ce90: 72 74 2d 3e 6e 44 65 66 65 72 3b 20 69 2b 2b 29  rt->nDefer; i++)
cea0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
ceb0: 62 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65  b = pSort->aDefe
cec0: 72 5b 69 5d 2e 70 54 61 62 3b 0a 20 20 20 20 69  r[i].pTab;.    i
ced0: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
cee0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
cef0: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
cf00: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 73 71  pSchema);.    sq
cf10: 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
cf20: 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 61 44  Parse, pSort->aD
cf30: 65 66 65 72 5b 69 5d 2e 69 43 73 72 2c 20 69 44  efer[i].iCsr, iD
cf40: 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
cf50: 52 65 61 64 29 3b 0a 20 20 20 20 6e 52 65 66 4b  Read);.    nRefK
cf60: 65 79 20 3d 20 4d 41 58 28 6e 52 65 66 4b 65 79  ey = MAX(nRefKey
cf70: 2c 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b  , pSort->aDefer[
cf80: 69 5d 2e 6e 4b 65 79 29 3b 0a 20 20 7d 0a 23 65  i].nKey);.  }.#e
cf90: 6e 64 69 66 0a 0a 20 20 69 54 61 62 20 3d 20 70  ndif..  iTab = p
cfa0: 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b 0a  Sort->iECursor;.
cfb0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
cfc0: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
cfd0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
cfe0: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65  || eDest==SRT_Me
cff0: 6d 20 29 7b 0a 20 20 20 20 72 65 67 52 6f 77 69  m ){.    regRowi
d000: 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 67 52 6f  d = 0;.    regRo
d010: 77 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74  w = pDest->iSdst
d020: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
d030: 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  egRowid = sqlite
d040: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
d050: 73 65 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 20  se);.    regRow 
d060: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
d070: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
d080: 6f 6c 75 6d 6e 29 3b 0a 20 20 7d 0a 20 20 6e 4b  olumn);.  }.  nK
d090: 65 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ey = pOrderBy->n
d0a0: 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 4f  Expr - pSort->nO
d0b0: 42 53 61 74 3b 0a 20 20 69 66 28 20 70 53 6f 72  BSat;.  if( pSor
d0c0: 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26 20 53  t->sortFlags & S
d0d0: 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65  ORTFLAG_UseSorte
d0e0: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  r ){.    int reg
d0f0: 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72  SortOut = ++pPar
d100: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 53  se->nMem;.    iS
d110: 6f 72 74 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ortTab = pParse-
d120: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 69 66 28  >nTab++;.    if(
d130: 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f   pSort->labelBkO
d140: 75 74 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  ut ){.      addr
d150: 4f 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Once = sqlite3Vd
d160: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
d170: 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
d180: 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ge(v);.    }.   
d190: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d1a0: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
d1b0: 75 64 6f 2c 20 69 53 6f 72 74 54 61 62 2c 20 72  udo, iSortTab, r
d1c0: 65 67 53 6f 72 74 4f 75 74 2c 20 0a 20 20 20 20  egSortOut, .    
d1d0: 20 20 20 20 6e 4b 65 79 2b 31 2b 6e 43 6f 6c 75      nKey+1+nColu
d1e0: 6d 6e 2b 6e 52 65 66 4b 65 79 29 3b 0a 20 20 20  mn+nRefKey);.   
d1f0: 20 69 66 28 20 61 64 64 72 4f 6e 63 65 20 29 20   if( addrOnce ) 
d200: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
d210: 65 72 65 28 76 2c 20 61 64 64 72 4f 6e 63 65 29  ere(v, addrOnce)
d220: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b  ;.    addr = 1 +
d230: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d240: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
d250: 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42  ort, iTab, addrB
d260: 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43  reak);.    VdbeC
d270: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
d280: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d  codeOffset(v, p-
d290: 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  >iOffset, addrCo
d2a0: 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c  ntinue);.    sql
d2b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
d2c0: 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c  , OP_SorterData,
d2d0: 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75   iTab, regSortOu
d2e0: 74 2c 20 69 53 6f 72 74 54 61 62 29 3b 0a 20 20  t, iSortTab);.  
d2f0: 20 20 62 53 65 71 20 3d 20 30 3b 0a 20 20 7d 65    bSeq = 0;.  }e
d300: 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  lse{.    addr = 
d310: 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
d320: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
d330: 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61  , iTab, addrBrea
d340: 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
d350: 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  (v);.    codeOff
d360: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
d370: 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  t, addrContinue)
d380: 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20 3d  ;.    iSortTab =
d390: 20 69 54 61 62 3b 0a 20 20 20 20 62 53 65 71 20   iTab;.    bSeq 
d3a0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  = 1;.  }.  for(i
d3b0: 3d 30 2c 20 69 43 6f 6c 3d 6e 4b 65 79 2b 62 53  =0, iCol=nKey+bS
d3c0: 65 71 2d 31 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  eq-1; i<nColumn;
d3d0: 20 69 2b 2b 29 7b 0a 23 69 66 64 65 66 20 53 51   i++){.#ifdef SQ
d3e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
d3f0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
d400: 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e    if( aOutEx[i].
d410: 62 53 6f 72 74 65 72 52 65 66 20 29 20 63 6f 6e  bSorterRef ) con
d420: 74 69 6e 75 65 3b 0a 23 65 6e 64 69 66 0a 20 20  tinue;.#endif.  
d430: 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e    if( aOutEx[i].
d440: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
d450: 3d 30 20 29 20 69 43 6f 6c 2b 2b 3b 0a 20 20 7d  =0 ) iCol++;.  }
d460: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d470: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
d480: 45 52 45 4e 43 45 53 0a 20 20 69 66 28 20 70 53  ERENCES.  if( pS
d490: 6f 72 74 2d 3e 6e 44 65 66 65 72 20 29 7b 0a 20  ort->nDefer ){. 
d4a0: 20 20 20 69 6e 74 20 69 4b 65 79 20 3d 20 69 43     int iKey = iC
d4b0: 6f 6c 2b 31 3b 0a 20 20 20 20 69 6e 74 20 72 65  ol+1;.    int re
d4c0: 67 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 47 65  gKey = sqlite3Ge
d4d0: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
d4e0: 65 2c 20 6e 52 65 66 4b 65 79 29 3b 0a 0a 20 20  e, nRefKey);..  
d4f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 6f    for(i=0; i<pSo
d500: 72 74 2d 3e 6e 44 65 66 65 72 3b 20 69 2b 2b 29  rt->nDefer; i++)
d510: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 73 72  {.      int iCsr
d520: 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72   = pSort->aDefer
d530: 5b 69 5d 2e 69 43 73 72 3b 0a 20 20 20 20 20 20  [i].iCsr;.      
d540: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53  Table *pTab = pS
d550: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 70  ort->aDefer[i].p
d560: 54 61 62 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  Tab;.      int n
d570: 4b 65 79 20 3d 20 70 53 6f 72 74 2d 3e 61 44 65  Key = pSort->aDe
d580: 66 65 72 5b 69 5d 2e 6e 4b 65 79 3b 0a 0a 20 20  fer[i].nKey;..  
d590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d5a0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
d5b0: 52 6f 77 2c 20 69 43 73 72 29 3b 0a 20 20 20 20  Row, iCsr);.    
d5c0: 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
d5d0: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
d5e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d5f0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
d600: 69 53 6f 72 74 54 61 62 2c 20 69 4b 65 79 2b 2b  iSortTab, iKey++
d610: 2c 20 72 65 67 4b 65 79 29 3b 0a 20 20 20 20 20  , regKey);.     
d620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d630: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 65 6b 52  dOp3(v, OP_SeekR
d640: 6f 77 69 64 2c 20 69 43 73 72 2c 20 0a 20 20 20  owid, iCsr, .   
d650: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d660: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
d670: 76 29 2b 31 2c 20 72 65 67 4b 65 79 29 3b 0a 20  v)+1, regKey);. 
d680: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d690: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
d6a0: 20 20 20 69 6e 74 20 69 4a 6d 70 3b 0a 20 20 20     int iJmp;.   
d6b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
d6c0: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
d6d0: 64 65 78 28 70 54 61 62 29 2d 3e 6e 4b 65 79 43  dex(pTab)->nKeyC
d6e0: 6f 6c 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ol==nKey );.    
d6f0: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e      for(k=0; k<n
d700: 4b 65 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  Key; k++){.     
d710: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d720: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
d730: 75 6d 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69  umn, iSortTab, i
d740: 4b 65 79 2b 2b 2c 20 72 65 67 4b 65 79 2b 6b 29  Key++, regKey+k)
d750: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d760: 20 20 20 20 69 4a 6d 70 20 3d 20 73 71 6c 69 74      iJmp = sqlit
d770: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
d780: 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  r(v);.        sq
d790: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
d7a0: 6e 74 28 76 2c 20 4f 50 5f 53 65 65 6b 47 45 2c  nt(v, OP_SeekGE,
d7b0: 20 69 43 73 72 2c 20 69 4a 6d 70 2b 32 2c 20 72   iCsr, iJmp+2, r
d7c0: 65 67 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20  egKey, nKey);.  
d7d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d7e0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
d7f0: 5f 49 64 78 4c 45 2c 20 69 43 73 72 2c 20 69 4a  _IdxLE, iCsr, iJ
d800: 6d 70 2b 33 2c 20 72 65 67 4b 65 79 2c 20 6e 4b  mp+3, regKey, nK
d810: 65 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ey);.        sql
d820: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
d830: 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43  , OP_NullRow, iC
d840: 73 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sr);.      }.   
d850: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65   }.    sqlite3Re
d860: 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
d870: 50 61 72 73 65 2c 20 72 65 67 4b 65 79 2c 20 6e  Parse, regKey, n
d880: 52 65 66 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e  RefKey);.  }.#en
d890: 64 69 66 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 6c  dif.  for(i=nCol
d8a0: 75 6d 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  umn-1; i>=0; i--
d8b0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
d8c0: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
d8d0: 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66  EFERENCES.    if
d8e0: 28 20 61 4f 75 74 45 78 5b 69 5d 2e 62 53 6f 72  ( aOutEx[i].bSor
d8f0: 74 65 72 52 65 66 20 29 7b 0a 20 20 20 20 20 20  terRef ){.      
d900: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
d910: 70 50 61 72 73 65 2c 20 61 4f 75 74 45 78 5b 69  pParse, aOutEx[i
d920: 5d 2e 70 45 78 70 72 2c 20 72 65 67 52 6f 77 2b  ].pExpr, regRow+
d930: 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  i);.    }else.#e
d940: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
d950: 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20 20 20   int iRead;.    
d960: 20 20 69 66 28 20 61 4f 75 74 45 78 5b 69 5d 2e    if( aOutEx[i].
d970: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
d980: 29 7b 0a 20 20 20 20 20 20 20 20 69 52 65 61 64  ){.        iRead
d990: 20 3d 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78   = aOutEx[i].u.x
d9a0: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 3b 0a  .iOrderByCol-1;.
d9b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d9c0: 20 20 20 20 20 69 52 65 61 64 20 3d 20 69 43 6f       iRead = iCo
d9d0: 6c 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  l--;.      }.   
d9e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d9f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
da00: 6e 2c 20 69 53 6f 72 74 54 61 62 2c 20 69 52 65  n, iSortTab, iRe
da10: 61 64 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20  ad, regRow+i);. 
da20: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
da30: 28 28 76 2c 20 22 25 73 22 2c 20 61 4f 75 74 45  ((v, "%s", aOutE
da40: 78 5b 69 5d 2e 7a 4e 61 6d 65 3f 61 4f 75 74 45  x[i].zName?aOutE
da50: 78 5b 69 5d 2e 7a 4e 61 6d 65 20 3a 20 61 4f 75  x[i].zName : aOu
da60: 74 45 78 5b 69 5d 2e 7a 53 70 61 6e 29 29 3b 0a  tEx[i].zSpan));.
da70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 77 69 74      }.  }.  swit
da80: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
da90: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
daa0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
dab0: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
dac0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
dad0: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
dae0: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69  , iParm, regRowi
daf0: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
db00: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
db10: 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  P_Insert, iParm,
db20: 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f 77 69   regRow, regRowi
db30: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
db40: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
db50: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
db60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
db70: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
db80: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
db90: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
dba0: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
dbb0: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 73 71 6c 69  t( nColumn==sqli
dbc0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 65 73  te3Strlen30(pDes
dbd0: 74 2d 3e 7a 41 66 66 53 64 73 74 29 20 29 3b 0a  t->zAffSdst) );.
dbe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dbf0: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
dc00: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77  keRecord, regRow
dc10: 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 6f  , nColumn, regRo
dc20: 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  wid,.           
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
dc40: 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 43  st->zAffSdst, nC
dc50: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71  olumn);.      sq
dc60: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
dc70: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
dc80: 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f  rse, regRow, nCo
dc90: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  lumn);.      sql
dca0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
dcb0: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
dcc0: 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  t, iParm, regRow
dcd0: 69 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c  id, regRow, nCol
dce0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  umn);.      brea
dcf0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
dd00: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
dd10: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
dd20: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
dd30: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
dd40: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
dd50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
dd60: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
dd70: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
dd80: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
dd90: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
dda0: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20  Coroutine ); .  
ddb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
ddc0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
ddd0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
dde0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
ddf0: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
de00: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
de10: 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
de20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
de30: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
de40: 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73  Row, pDest->iSds
de50: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
de60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
de70: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
de80: 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73  nge(pParse, pDes
de90: 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  t->iSdst, nColum
dea0: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
deb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
dec0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
ded0: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
dee0: 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d  SDParm);.      }
def0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
df00: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 65    }.  }.  if( re
df10: 67 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69 66  gRowid ){.    if
df20: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74  ( eDest==SRT_Set
df30: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
df40: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
df50: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  e(pParse, regRow
df60: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
df70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
df80: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
df90: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
dfa0: 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  w);.    }.    sq
dfb0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
dfc0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
dfd0: 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  owid);.  }.  /* 
dfe0: 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68  The bottom of th
dff0: 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71  e loop.  */.  sq
e000: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
e010: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e  Label(v, addrCon
e020: 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 53  tinue);.  if( pS
e030: 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73 20 26  ort->sortFlags &
e040: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
e050: 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ter ){.    sqlit
e060: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
e070: 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69  OP_SorterNext, i
e080: 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62 65  Tab, addr); Vdbe
e090: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
e0a0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
e0b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e0c0: 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
e0d0: 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  dr); VdbeCoverag
e0e0: 65 28 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e(v);.  }.  if( 
e0f0: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
e100: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   ) sqlite3VdbeAd
e110: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
e120: 6e 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74  n, pSort->regRet
e130: 75 72 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  urn);.  sqlite3V
e140: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
e150: 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 7d  v, addrBreak);.}
e160: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
e170: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
e180: 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ring containing 
e190: 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e  the 'declaration
e1a0: 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a   type' of the.**
e1b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
e1c0: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61  r. The string ma
e1d0: 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20  y be treated as 
e1e0: 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61  static by the ca
e1f0: 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  ller..**.** Also
e200: 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65   try to estimate
e210: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
e220: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
e230: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74 0a  and return that.
e240: 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70 45  ** result in *pE
e250: 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54  stWidth..**.** T
e260: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
e270: 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74  ype is the exact
e280: 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69   datatype defini
e290: 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66  tion extracted f
e2a0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69  rom the.** origi
e2b0: 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45  nal CREATE TABLE
e2c0: 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68   statement if th
e2d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
e2e0: 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a  a column. The.**
e2f0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
e300: 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69  e for a ROWID fi
e310: 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20  eld is INTEGER. 
e320: 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20  Exactly when an 
e330: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
e340: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f   considered a co
e350: 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70  lumn can be comp
e360: 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65  lex in the prese
e370: 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65  nce of subquerie
e380: 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74  s. The.** result
e390: 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20  -set expression 
e3a0: 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  in all of the fo
e3b0: 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73  llowing SELECT s
e3c0: 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a  tatements is .**
e3d0: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f   considered a co
e3e0: 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e  lumn by this fun
e3f0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  ction..**.**   S
e400: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
e410: 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  bl;.**   SELECT 
e420: 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d  (SELECT col FROM
e430: 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43   tbl;.**   SELEC
e440: 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52  T (SELECT col FR
e450: 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45  OM tbl);.**   SE
e460: 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53  LECT abc FROM (S
e470: 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63  ELECT col AS abc
e480: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a   FROM tbl);.** .
e490: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
e4a0: 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20  on type for any 
e4b0: 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72  expression other
e4c0: 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69   than a column i
e4d0: 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
e4e0: 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 65  is routine has e
e4f0: 69 74 68 65 72 20 33 20 6f 72 20 36 20 70 61 72  ither 3 or 6 par
e500: 61 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69 6e  ameters dependin
e510: 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
e520: 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  not.** the SQLIT
e530: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
e540: 4d 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c 65  METADATA compile
e550: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
e560: 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  used..*/.#ifdef 
e570: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
e580: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20  LUMN_METADATA.# 
e590: 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70  define columnTyp
e5a0: 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63 6f 6c  e(A,B,C,D,E) col
e5b0: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c  umnTypeImpl(A,B,
e5c0: 43 2c 44 2c 45 29 0a 23 65 6c 73 65 20 2f 2a 20  C,D,E).#else /* 
e5d0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
e5e0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
e5f0: 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20  _METADATA) */.# 
e600: 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70  define columnTyp
e610: 65 28 41 2c 42 2c 43 2c 44 2c 45 29 20 63 6f 6c  e(A,B,C,D,E) col
e620: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 29  umnTypeImpl(A,B)
e630: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 63  .#endif.static c
e640: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
e650: 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d  nTypeImpl(.  Nam
e660: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a  eContext *pNC, .
e670: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
e680: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
e690: 41 44 41 54 41 0a 20 20 45 78 70 72 20 2a 70 45  ADATA.  Expr *pE
e6a0: 78 70 72 0a 23 65 6c 73 65 0a 20 20 45 78 70 72  xpr.#else.  Expr
e6b0: 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74   *pExpr,.  const
e6c0: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62   char **pzOrigDb
e6d0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e6e0: 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f  *pzOrigTab,.  co
e6f0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
e700: 67 43 6f 6c 0a 23 65 6e 64 69 66 0a 29 7b 0a 20  gCol.#endif.){. 
e710: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79   char const *zTy
e720: 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  pe = 0;.  int j;
e730: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e740: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
e750: 41 44 41 54 41 0a 20 20 63 68 61 72 20 63 6f 6e  ADATA.  char con
e760: 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  st *zOrigDb = 0;
e770: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
e780: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63  OrigTab = 0;.  c
e790: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
e7a0: 43 6f 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Col = 0;.#endif.
e7b0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
e7c0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e7d0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 21 3d   pNC->pSrcList!=
e7e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
e7f0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
e800: 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 54  _COLUMN );  /* T
e810: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 65  his routine rune
e820: 73 20 62 65 66 6f 72 65 20 61 67 67 72 65 67 61  s before aggrega
e830: 74 65 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  tes.            
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e850: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72             ** ar
e860: 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  e processed */. 
e870: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
e880: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
e890: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
e8a0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
e8b0: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
e8c0: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
e8d0: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  e the column is 
e8e0: 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65  being.      ** e
e8f0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e  xtracted from in
e900: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72   NameContext.pSr
e910: 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c  cList. This tabl
e920: 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20  e may be real.  
e930: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
e940: 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75  table or a subqu
e950: 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ery..      */.  
e960: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
e970: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
e980: 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  /* Table structu
e990: 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  re column is ext
e9a0: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
e9b0: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
e9c0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
e9d0: 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63   /* Select the c
e9e0: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
e9f0: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
ea00: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
ea10: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20  r->iColumn;  /* 
ea20: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
ea30: 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20  in pTab */.     
ea40: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21   while( pNC && !
ea50: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
ea60: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
ea70: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
ea80: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  t;.        for(j
ea90: 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  =0;j<pTabList->n
eaa0: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
eab0: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
eac0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b  Expr->iTable;j++
ead0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
eae0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
eaf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
eb00: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
eb10: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  j].pTab;.       
eb20: 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74     pS = pTabList
eb30: 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[j].pSelect;.
eb40: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
eb50: 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70           pNC = p
eb60: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  NC->pNext;.     
eb70: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
eb80: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
eb90: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
eba0: 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20   one time, code 
ebb0: 73 75 63 68 20 61 73 20 22 53 45 4c 45 43 54 20  such as "SELECT 
ebc0: 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20  new.x" within a 
ebd0: 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20  trigger would.  
ebe0: 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74        ** cause t
ebf0: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f  his condition to
ec00: 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65   run.  Since the
ec10: 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73 74 72  n, we have restr
ec20: 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20  uctured how.    
ec30: 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63      ** trigger c
ec40: 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
ec50: 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e   and so this con
ec60: 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e  dition is no lon
ec70: 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ger .        ** 
ec80: 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65  possible. Howeve
ec90: 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20  r, it can still 
eca0: 62 65 20 74 72 75 65 20 66 6f 72 20 73 74 61 74  be true for stat
ecb0: 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20  ements like.    
ecc0: 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
ecd0: 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a  wing:.        **
ece0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52  .        **   CR
ecf0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f  EATE TABLE t1(co
ed00: 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20  l INTEGER);.    
ed10: 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
ed20: 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20  (SELECT t1.col) 
ed30: 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20  FROM FROM t1;.  
ed40: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
ed50: 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54   ** when columnT
ed60: 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ype() is called 
ed70: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
ed80: 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68  n "t1.col" in th
ed90: 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75  e .        ** su
eda0: 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69  b-select. In thi
edb0: 73 20 63 61 73 65 2c 20 73 65 74 20 74 68 65 20  s case, set the 
edc0: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e  column type to N
edd0: 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20  ULL, even.      
ede0: 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73    ** though it s
edf0: 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20  hould really be 
ee00: 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20  "INTEGER"..     
ee10: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
ee20: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70   This is not a p
ee30: 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63  roblem, as the c
ee40: 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74  olumn type of "t
ee50: 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a  1.col" is never.
ee60: 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e          ** used.
ee70: 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65   When columnType
ee80: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
ee90: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a  the expression .
eea0: 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c          ** "(SEL
eeb0: 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68  ECT t1.col)", th
eec0: 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 20 69  e correct type i
eed0: 73 20 72 65 74 75 72 6e 65 64 20 28 73 65 65 20  s returned (see 
eee0: 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20  the TK_SELECT.  
eef0: 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20        ** branch 
ef00: 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20  below.  */.     
ef10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ef20: 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
ef30: 20 70 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e   pTab && pExpr->
ef40: 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20  pTab==pTab );.  
ef50: 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20      if( pS ){.  
ef60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61        /* The "ta
ef70: 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79  ble" is actually
ef80: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72   a sub-select or
ef90: 20 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46   a view in the F
efa0: 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20  ROM clause.     
efb0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c     ** of the SEL
efc0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52  ECT statement. R
efd0: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
efe0: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f  ation type and o
eff0: 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  rigin.        **
f000: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65   data for the re
f010: 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20  sult-set column 
f020: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
f030: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
f040: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
f050: 30 20 26 26 20 69 43 6f 6c 3c 70 53 2d 3e 70 45  0 && iCol<pS->pE
f060: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
f070: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69           /* If i
f080: 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  Col is less than
f090: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
f0a0: 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65  expression reque
f0b0: 73 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  sts the.        
f0c0: 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68    ** rowid of th
f0d0: 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  e sub-select or 
f0e0: 76 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65  view. This expre
f0f0: 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28  ssion is legal (
f100: 73 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  see .          *
f110: 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63  * test case misc
f120: 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61  2.2.2) - it alwa
f130: 79 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  ys evaluates to 
f140: 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20  NULL..          
f150: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d  */.          Nam
f160: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
f170: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20          Expr *p 
f180: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
f190: 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20  iCol].pExpr;.   
f1a0: 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c         sNC.pSrcL
f1b0: 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a  ist = pS->pSrc;.
f1c0: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e            sNC.pN
f1d0: 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20  ext = pNC;.     
f1e0: 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20       sNC.pParse 
f1f0: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
f200: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
f210: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
f220: 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f  , p,&zOrigDb,&zO
f230: 72 69 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c  rigTab,&zOrigCol
f240: 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ); .        }.  
f250: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f260: 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62     /* A real tab
f270: 6c 65 20 6f 72 20 61 20 43 54 45 20 74 61 62 6c  le or a CTE tabl
f280: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
f290: 65 72 74 28 20 21 70 53 20 29 3b 0a 23 69 66 64  ert( !pS );.#ifd
f2a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f2b0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
f2c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
f2d0: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
f2e0: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
f2f0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
f300: 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43 6f  XN_ROWID || (iCo
f310: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
f320: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
f330: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
f340: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
f350: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
f360: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
f370: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
f380: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f390: 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d        zOrigCol =
f3a0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
f3b0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
f3c0: 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74     zType = sqlit
f3d0: 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54  e3ColumnType(&pT
f3e0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30  ab->aCol[iCol],0
f3f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f400: 20 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20       zOrigTab = 
f410: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
f420: 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50       if( pNC->pP
f430: 61 72 73 65 20 26 26 20 70 54 61 62 2d 3e 70 53  arse && pTab->pS
f440: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
f450: 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
f460: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
f470: 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  x(pNC->pParse->d
f480: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
f490: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72  );.          zOr
f4a0: 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72  igDb = pNC->pPar
f4b0: 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
f4c0: 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 20  .zDbSName;.     
f4d0: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20     }.#else.     
f4e0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
f4f0: 3d 58 4e 5f 52 4f 57 49 44 20 7c 7c 20 28 69 43  =XN_ROWID || (iC
f500: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
f510: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20  ab->nCol) );.   
f520: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
f530: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
f540: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
f550: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
f560: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
f570: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79   sqlite3ColumnTy
f580: 70 65 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  pe(&pTab->aCol[i
f590: 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20 20 20 20  Col],0);.       
f5a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
f5b0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
f5c0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
f5d0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
f5e0: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
f5f0: 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LECT: {.      /*
f600: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
f610: 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e  is a sub-select.
f620: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
f630: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
f640: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  .      ** origin
f650: 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69   info for the si
f660: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ngle column in t
f670: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
f680: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
f690: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a    ** statement..
f6a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e        */.      N
f6b0: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
f6c0: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
f6d0: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
f6e0: 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ect;.      Expr 
f6f0: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
f700: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
f710: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
f720: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
f730: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
f740: 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72  );.      sNC.pSr
f750: 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63  cList = pS->pSrc
f760: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78  ;.      sNC.pNex
f770: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73  t = pNC;.      s
f780: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
f790: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a  >pParse;.      z
f7a0: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
f7b0: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
f7c0: 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20  gDb, &zOrigTab, 
f7d0: 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20  &zOrigCol); .   
f7e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f7f0: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64  #endif.  }..#ifd
f800: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f810: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
f820: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44    .  if( pzOrigD
f830: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
f840: 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a   pzOrigTab && pz
f850: 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a  OrigCol );.    *
f860: 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67  pzOrigDb = zOrig
f870: 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54  Db;.    *pzOrigT
f880: 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20  ab = zOrigTab;. 
f890: 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20     *pzOrigCol = 
f8a0: 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65  zOrigCol;.  }.#e
f8b0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 7a 54  ndif.  return zT
f8c0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ype;.}../*.** Ge
f8d0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
f8e0: 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56   will tell the V
f8f0: 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61 74  DBE the declarat
f900: 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c  ion types of col
f910: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
f920: 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74  esult set..*/.st
f930: 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61  atic void genera
f940: 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20  teColumnTypes(. 
f950: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
f960: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63       /* Parser c
f970: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
f980: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
f990: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
f9a0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
f9b0: 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78  *pEList    /* Ex
f9c0: 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69  pressions defini
f9d0: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ng the result se
f9e0: 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  t */.){.#ifndef 
f9f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
fa00: 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d  TYPE.  Vdbe *v =
fa10: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
fa20: 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43    int i;.  NameC
fa30: 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e  ontext sNC;.  sN
fa40: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
fa50: 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61  bList;.  sNC.pPa
fa60: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
fa70: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  sNC.pNext = 0;. 
fa80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
fa90: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
faa0: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
fab0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
fac0: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
fad0: 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66  r *zType;.#ifdef
fae0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
faf0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
fb00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
fb10: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20  OrigDb = 0;.    
fb20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
fb30: 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  gTab = 0;.    co
fb40: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43  nst char *zOrigC
fb50: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70  ol = 0;.    zTyp
fb60: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
fb70: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
fb80: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
fb90: 72 69 67 43 6f 6c 29 3b 0a 0a 20 20 20 20 2f 2a  rigCol);..    /*
fba0: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
fbb0: 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79  ake its own copy
fbc0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74   of the column-t
fbd0: 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20  ype and other . 
fbe0: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65     ** column spe
fbf0: 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69  cific strings, i
fc00: 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d  n case the schem
fc10: 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72  a is reset befor
fc20: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69  e this.    ** vi
fc30: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73  rtual machine is
fc40: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
fc50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fc60: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
fc70: 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53   COLNAME_DATABAS
fc80: 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49  E, zOrigDb, SQLI
fc90: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
fca0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
fcb0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
fcc0: 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f  OLNAME_TABLE, zO
fcd0: 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54  rigTab, SQLITE_T
fce0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
fcf0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
fd00: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
fd10: 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67  ME_COLUMN, zOrig
fd20: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
fd30: 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20  SIENT);.#else.  
fd40: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
fd50: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
fd60: 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
fd70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
fd80: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
fd90: 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c  OLNAME_DECLTYPE,
fda0: 20 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54   zType, SQLITE_T
fdb0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23  RANSIENT);.  }.#
fdc0: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
fdd0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  d(SQLITE_OMIT_DE
fde0: 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f  CLTYPE) */.}.../
fdf0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
fe00: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f   column names fo
fe10: 72 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  r a SELECT state
fe20: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
fe30: 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 20 74  only guarantee t
fe40: 68 61 74 20 53 51 4c 69 74 65 20 6d 61 6b 65 73  hat SQLite makes
fe50: 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61   about column na
fe60: 6d 65 73 20 69 73 20 74 68 61 74 20 69 66 20 74  mes is that if t
fe70: 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 68 61 73  he.** column has
fe80: 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20 61 73   an AS clause as
fe90: 73 69 67 6e 69 6e 67 20 69 74 20 61 20 6e 61 6d  signing it a nam
fea0: 65 2c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  e, that will be 
feb0: 74 68 65 20 6e 61 6d 65 20 75 73 65 64 2e 0a 2a  the name used..*
fec0: 2a 20 54 68 61 74 20 69 73 20 74 68 65 20 6f 6e  * That is the on
fed0: 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64 20 67 75  ly documented gu
fee0: 61 72 61 6e 74 65 65 2e 20 20 48 6f 77 65 76 65  arantee.  Howeve
fef0: 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20 61 70 70  r, countless app
ff00: 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20 64 65 76  lications.** dev
ff10: 65 6c 6f 70 65 64 20 6f 76 65 72 20 74 68 65 20  eloped over the 
ff20: 79 65 61 72 73 20 68 61 76 65 20 6d 61 64 65 20  years have made 
ff30: 62 61 73 65 6c 65 73 73 20 61 73 73 75 6d 70 74  baseless assumpt
ff40: 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d  ions about colum
ff50: 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e 64 20 77  n names.** and w
ff60: 69 6c 6c 20 62 72 65 61 6b 20 69 66 20 74 68 6f  ill break if tho
ff70: 73 65 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 63  se assumptions c
ff80: 68 61 6e 67 65 73 2e 20 20 48 65 6e 63 65 2c 20  hanges.  Hence, 
ff90: 75 73 65 20 65 78 74 72 65 6d 65 20 63 61 75 74  use extreme caut
ffa0: 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d 6f 64 69  ion.** when modi
ffb0: 66 79 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  fying this routi
ffc0: 6e 65 20 74 6f 20 61 76 6f 69 64 20 62 72 65 61  ne to avoid brea
ffd0: 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a 2a 2a 0a  king legacy..**.
ffe0: 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20 73 71 6c  ** See Also: sql
fff0: 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
10000 78 70 72 4c 69 73 74 28 29 0a 2a 2a 0a 2a 2a 20  xprList().**.** 
10010 54 68 65 20 50 52 41 47 4d 41 20 73 68 6f 72 74  The PRAGMA short
10020 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 20 61 6e  _column_names an
10030 64 20 50 52 41 47 4d 41 20 66 75 6c 6c 5f 63 6f  d PRAGMA full_co
10040 6c 75 6d 6e 5f 6e 61 6d 65 73 20 73 65 74 74 69  lumn_names setti
10050 6e 67 73 20 61 72 65 0a 2a 2a 20 64 65 70 72 65  ngs are.** depre
10060 63 61 74 65 64 2e 20 20 54 68 65 20 64 65 66 61  cated.  The defa
10070 75 6c 74 20 73 65 74 74 69 6e 67 20 69 73 20 73  ult setting is s
10080 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c 3d 4f 46  hort=ON, full=OF
10090 46 2e 20 20 39 39 2e 39 25 20 6f 66 20 61 6c 6c  F.  99.9% of all
100a0 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  .** applications
100b0 20 73 68 6f 75 6c 64 20 6f 70 65 72 61 74 65 20   should operate 
100c0 74 68 69 73 20 77 61 79 2e 20 20 4e 65 76 65 72  this way.  Never
100d0 74 68 65 6c 65 73 73 2c 20 77 65 20 6e 65 65 64  theless, we need
100e0 20 74 6f 20 73 75 70 70 6f 72 74 20 74 68 65 0a   to support the.
100f0 2a 2a 20 6f 74 68 65 72 20 6d 6f 64 65 73 20 66  ** other modes f
10100 6f 72 20 6c 65 67 61 63 79 3a 0a 2a 2a 0a 2a 2a  or legacy:.**.**
10110 20 20 20 20 73 68 6f 72 74 3d 4f 46 46 2c 20 66      short=OFF, f
10120 75 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20 43 6f  ull=OFF:      Co
10130 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 74 68 65  lumn name is the
10140 20 74 65 78 74 20 6f 66 20 74 68 65 20 65 78 70   text of the exp
10150 72 65 73 73 69 6f 6e 20 68 61 73 20 69 74 0a 2a  ression has it.*
10160 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
10180 72 69 67 69 6e 61 6c 6c 79 20 61 70 70 65 61 72  riginally appear
10190 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
101a0 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 0a 2a  statement.  In.*
101b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
101d0 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
101e0 7a 53 70 61 6e 20 6f 66 20 74 68 65 20 72 65 73  zSpan of the res
101f0 75 6c 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ult expression..
10200 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f 72 74 3d 4f  **.**    short=O
10210 4e 2c 20 66 75 6c 6c 3d 4f 46 46 3a 20 20 20 20  N, full=OFF:    
10220 20 20 20 28 54 68 69 73 20 69 73 20 74 68 65 20     (This is the 
10230 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 29  default setting)
10240 2e 20 20 49 66 20 74 68 65 20 72 65 73 75 6c 74  .  If the result
10250 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c 79   refers directly
10280 20 74 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75   to a table colu
10290 6d 6e 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  mn, then the.** 
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
102c0 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ult column name 
102d0 69 73 20 6a 75 73 74 20 74 68 65 20 74 61 62 6c  is just the tabl
102e0 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 20 20  e column.**     
102f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10300 20 20 20 20 20 20 20 20 20 6e 61 6d 65 3a 20 43           name: C
10310 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73  OLUMN.  Otherwis
10320 65 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2a 0a  e use zSpan..**.
10330 2a 2a 20 20 20 20 66 75 6c 6c 3d 4f 4e 2c 20 73  **    full=ON, s
10340 68 6f 72 74 3d 41 4e 59 3a 20 20 20 20 20 20 20  hort=ANY:       
10350 49 66 20 74 68 65 20 72 65 73 75 6c 74 20 72 65  If the result re
10360 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
10370 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c   a table column,
10380 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
10390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103a0 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
103b0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 69 74   column name wit
103c0 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
103d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
103e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103f0 20 70 72 65 66 69 78 2c 20 65 78 3a 20 54 41 42   prefix, ex: TAB
10400 4c 45 2e 43 4f 4c 55 4d 4e 2e 20 20 4f 74 68 65  LE.COLUMN.  Othe
10410 72 77 69 73 65 20 75 73 65 20 7a 53 70 61 6e 2e  rwise use zSpan.
10420 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10430 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
10440 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
10450 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
10460 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
10470 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
10480 74 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  t     /* Generat
10490 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
104a0 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 73  or this SELECT s
104b0 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  tatement */.){. 
104c0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
104d0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
104e0 69 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  i;.  Table *pTab
104f0 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
10500 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
10510 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c  t *pEList;.  sql
10520 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
10530 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
10540 6c 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 54 41 42  lName;    /* TAB
10550 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20 6e 6f 20  LE.COLUMN if no 
10560 41 53 20 63 6c 61 75 73 65 20 61 6e 64 20 69 73  AS clause and is
10570 20 61 20 64 69 72 65 63 74 20 74 61 62 6c 65 20   a direct table 
10580 72 65 66 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63  ref */.  int src
10590 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 43 4f 4c  Name;     /* COL
105a0 55 4d 4e 20 6f 72 20 54 41 42 4c 45 2e 43 4f 4c  UMN or TABLE.COL
105b0 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61  UMN if no AS cla
105c0 75 73 65 20 61 6e 64 20 69 73 20 64 69 72 65 63  use and is direc
105d0 74 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  t */..#ifndef SQ
105e0 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
105f0 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  N.  /* If this i
10600 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b  s an EXPLAIN, sk
10610 69 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a  ip this step */.
10620 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
10630 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74  plain ){.    ret
10640 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
10650 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63  .  if( pParse->c
10660 6f 6c 4e 61 6d 65 73 53 65 74 20 29 20 72 65 74  olNamesSet ) ret
10670 75 72 6e 3b 0a 20 20 2f 2a 20 43 6f 6c 75 6d 6e  urn;.  /* Column
10680 20 6e 61 6d 65 73 20 61 72 65 20 64 65 74 65 72   names are deter
10690 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6c 65 66  mined by the lef
106a0 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 61  t-most term of a
106b0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
106c0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 53 65   */.  while( pSe
106d0 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  lect->pPrior ) p
106e0 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
106f0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 53 45 4c 45  ->pPrior;.  SELE
10700 43 54 54 52 41 43 45 28 31 2c 70 50 61 72 73 65  CTTRACE(1,pParse
10710 2c 70 53 65 6c 65 63 74 2c 28 22 67 65 6e 65 72  ,pSelect,("gener
10720 61 74 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ating column nam
10730 65 73 5c 6e 22 29 29 3b 0a 20 20 70 54 61 62 4c  es\n"));.  pTabL
10740 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
10750 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  Src;.  pEList = 
10760 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
10770 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
10780 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
10790 62 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 70 50  bList!=0 );.  pP
107a0 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
107b0 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d  t = 1;.  fullNam
107c0 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
107d0 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
107e0 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 72 63 4e  ames)!=0;.  srcN
107f0 61 6d 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ame = (db->flags
10800 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
10810 6f 6c 4e 61 6d 65 73 29 21 3d 30 20 7c 7c 20 66  olNames)!=0 || f
10820 75 6c 6c 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74  ullName;.  sqlit
10830 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
10840 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
10850 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
10860 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
10870 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
10880 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
10890 2e 70 45 78 70 72 3b 0a 0a 20 20 20 20 61 73 73  .pExpr;..    ass
108a0 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 20  ert( p!=0 );.   
108b0 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 21 3d   assert( p->op!=
108c0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
108d0 20 20 2f 2a 20 41 67 67 20 70 72 6f 63 65 73 73    /* Agg process
108e0 69 6e 67 20 68 61 73 20 6e 6f 74 20 72 75 6e 20  ing has not run 
108f0 79 65 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  yet */.    asser
10900 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  t( p->op!=TK_COL
10910 55 4d 4e 20 7c 7c 20 70 2d 3e 70 54 61 62 21 3d  UMN || p->pTab!=
10920 30 20 29 3b 20 2f 2a 20 43 6f 76 65 72 69 6e 67  0 ); /* Covering
10930 20 69 64 78 20 6e 6f 74 20 79 65 74 20 63 6f 64   idx not yet cod
10940 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 45  ed */.    if( pE
10950 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
10960 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
10970 41 53 20 63 6c 61 75 73 65 20 61 6c 77 61 79 73  AS clause always
10980 20 74 61 6b 65 73 20 66 69 72 73 74 20 70 72 69   takes first pri
10990 6f 72 69 74 79 20 2a 2f 0a 20 20 20 20 20 20 63  ority */.      c
109a0 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
109b0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
109c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
109d0 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
109e0 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
109f0 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
10a00 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
10a10 65 6c 73 65 20 69 66 28 20 73 72 63 4e 61 6d 65  else if( srcName
10a20 20 26 26 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f   && p->op==TK_CO
10a30 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 68  LUMN ){.      ch
10a40 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20  ar *zCol;.      
10a50 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43  int iCol = p->iC
10a60 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 54 61  olumn;.      pTa
10a70 62 20 3d 20 70 2d 3e 70 54 61 62 3b 0a 20 20 20  b = p->pTab;.   
10a80 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21     assert( pTab!
10a90 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
10aa0 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
10ab0 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
10ac0 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
10ad0 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
10ae0 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
10af0 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ol) );.      if(
10b00 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
10b10 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64     zCol = "rowid
10b20 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
10b30 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70          zCol = p
10b40 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
10b50 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zName;.      }. 
10b60 20 20 20 20 20 69 66 28 20 66 75 6c 6c 4e 61 6d       if( fullNam
10b70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  e ){.        cha
10b80 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
10b90 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
10ba0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
10bb0 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e   "%s.%s", pTab->
10bc0 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20  zName, zCol);.  
10bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10be0 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
10bf0 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
10c00 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59  zName, SQLITE_DY
10c10 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65  NAMIC);.      }e
10c20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
10c30 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
10c40 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
10c50 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c  _NAME, zCol, SQL
10c60 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
10c70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
10c80 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  e{.      const c
10c90 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d  har *z = pEList-
10ca0 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20  >a[i].zSpan;.   
10cb0 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71     z = z==0 ? sq
10cc0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
10cd0 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31   "column%d", i+1
10ce0 29 20 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72  ) : sqlite3DbStr
10cf0 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  Dup(db, z);.    
10d00 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
10d10 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
10d20 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53  LNAME_NAME, z, S
10d30 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
10d40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65      }.  }.  gene
10d50 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28  rateColumnTypes(
10d60 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
10d70 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  , pEList);.}../*
10d80 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70  .** Given an exp
10d90 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68  ression list (wh
10da0 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68  ich is really th
10db0 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  e list of expres
10dc0 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f  sions.** that fo
10dd0 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  rm the result se
10de0 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  t of a SELECT st
10df0 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65  atement) compute
10e00 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20   appropriate.** 
10e10 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
10e20 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f   a table that wo
10e30 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70  uld hold the exp
10e40 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
10e50 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e  .** All column n
10e60 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69  ames will be uni
10e70 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  que..**.** Only 
10e80 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
10e90 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20   are computed.  
10ea0 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f  Column.zType, Co
10eb0 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61  lumn.zColl,.** a
10ec0 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
10ed0 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65  of Column are ze
10ee0 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  roed..**.** Retu
10ef0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
10f00 73 75 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d  success.  If a m
10f10 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
10f20 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
10f30 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20  * store NULL in 
10f40 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20  *paCol and 0 in 
10f50 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72  *pnCol and retur
10f60 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  n SQLITE_NOMEM..
10f70 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67  **.** The only g
10f80 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 53 51  uarantee that SQ
10f90 4c 69 74 65 20 6d 61 6b 65 73 20 61 62 6f 75 74  Lite makes about
10fa0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73   column names is
10fb0 20 74 68 61 74 20 69 66 20 74 68 65 0a 2a 2a 20   that if the.** 
10fc0 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20 41 53  column has an AS
10fd0 20 63 6c 61 75 73 65 20 61 73 73 69 67 6e 69 6e   clause assignin
10fe0 67 20 69 74 20 61 20 6e 61 6d 65 2c 20 74 68 61  g it a name, tha
10ff0 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 6e 61  t will be the na
11000 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74  me used..** That
11010 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63   is the only doc
11020 75 6d 65 6e 74 65 64 20 67 75 61 72 61 6e 74 65  umented guarante
11030 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 63 6f 75  e.  However, cou
11040 6e 74 6c 65 73 73 20 61 70 70 6c 69 63 61 74 69  ntless applicati
11050 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64  ons.** developed
11060 20 6f 76 65 72 20 74 68 65 20 79 65 61 72 73 20   over the years 
11070 68 61 76 65 20 6d 61 64 65 20 62 61 73 65 6c 65  have made basele
11080 73 73 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 61  ss assumptions a
11090 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  bout column name
110a0 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72  s.** and will br
110b0 65 61 6b 20 69 66 20 74 68 6f 73 65 20 61 73 73  eak if those ass
110c0 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e 67 65 73  umptions changes
110d0 2e 20 20 48 65 6e 63 65 2c 20 75 73 65 20 65 78  .  Hence, use ex
110e0 74 72 65 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a  treme caution.**
110f0 20 77 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20   when modifying 
11100 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
11110 61 76 6f 69 64 20 62 72 65 61 6b 69 6e 67 20 6c  avoid breaking l
11120 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  egacy..**.** See
11130 20 41 6c 73 6f 3a 20 67 65 6e 65 72 61 74 65 43   Also: generateC
11140 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 0a 2a 2f 0a  olumnNames().*/.
11150 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  int sqlite3Colum
11160 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a  nsFromExprList(.
11170 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
11180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
11190 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
111a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
111b0 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70  st,       /* Exp
111c0 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63  r list from whic
111d0 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75  h to derive colu
111e0 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31  mn names */.  i1
111f0 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20  6 *pnCol,       
11200 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
11210 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
11220 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43  umns here */.  C
11230 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20  olumn **paCol   
11240 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
11250 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c  the new column l
11260 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ist here */.){. 
11270 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
11280 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
11290 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
112a0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ion */.  int i, 
112b0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
112c0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
112d0 6e 74 65 72 73 20 2a 2f 0a 20 20 75 33 32 20 63  nters */.  u32 c
112e0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
112f0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
11300 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68  added to make th
11310 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f  e name unique */
11320 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c  .  Column *aCol,
11330 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f   *pCol;        /
11340 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
11350 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  er result column
11360 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  s */.  int nCol;
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11380 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
11390 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
113a0 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 63  esult set */.  c
113b0 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
113c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
113d0 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  lumn name */.  i
113e0 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
113f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
11400 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e  ze of name in zN
11410 61 6d 65 5b 5d 20 2a 2f 0a 20 20 48 61 73 68 20  ame[] */.  Hash 
11420 68 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ht;             
11430 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74         /* Hash t
11440 61 62 6c 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e  able of column n
11450 61 6d 65 73 20 2a 2f 0a 0a 20 20 73 71 6c 69 74  ames */..  sqlit
11460 65 33 48 61 73 68 49 6e 69 74 28 26 68 74 29 3b  e3HashInit(&ht);
11470 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b  .  if( pEList ){
11480 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69  .    nCol = pELi
11490 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
114a0 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Col = sqlite3DbM
114b0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
114c0 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43  zeof(aCol[0])*nC
114d0 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ol);.    testcas
114e0 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  e( aCol==0 );.  
114f0 20 20 69 66 28 20 6e 43 6f 6c 3e 33 32 37 36 37    if( nCol>32767
11500 20 29 20 6e 43 6f 6c 20 3d 20 33 32 37 36 37 3b   ) nCol = 32767;
11510 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
11520 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c  ol = 0;.    aCol
11530 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
11540 72 74 28 20 6e 43 6f 6c 3d 3d 28 69 31 36 29 6e  rt( nCol==(i16)n
11550 43 6f 6c 20 29 3b 0a 20 20 2a 70 6e 43 6f 6c 20  Col );.  *pnCol 
11560 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c  = nCol;.  *paCol
11570 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28   = aCol;..  for(
11580 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20  i=0, pCol=aCol; 
11590 69 3c 6e 43 6f 6c 20 26 26 20 21 64 62 2d 3e 6d  i<nCol && !db->m
115a0 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 20 69 2b 2b  allocFailed; i++
115b0 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f  , pCol++){.    /
115c0 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72  * Get an appropr
115d0 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  iate name for th
115e0 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a  e column.    */.
115f0 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d      if( (zName =
11600 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
11610 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
11620 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
11630 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41  n contains an "A
11640 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65  S <name>" phrase
11650 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20  , use <name> as 
11660 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  the name */.    
11670 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
11680 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 73 71  r *pColExpr = sq
11690 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
116a0 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69  late(pEList->a[i
116b0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
116c0 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d  while( pColExpr-
116d0 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
116e0 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20         pColExpr 
116f0 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
11700 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
11710 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20  rt( pColExpr!=0 
11720 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11730 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78 70   assert( pColExp
11740 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f  r->op!=TK_AGG_CO
11750 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 69 66  LUMN );.      if
11760 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
11770 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
11780 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75       /* For colu
11790 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75  mns use the colu
117a0 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  mn name name */.
117b0 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
117c0 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f   = pColExpr->iCo
117d0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 54 61  lumn;.        Ta
117e0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 43 6f 6c  ble *pTab = pCol
117f0 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Expr->pTab;.    
11800 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
11810 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
11820 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
11830 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
11840 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
11850 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e  iCol>=0 ? pTab->
11860 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
11870 20 3a 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   : "rowid";.    
11880 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
11890 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
118a0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
118b0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
118c0 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50  rty(pColExpr, EP
118d0 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20  _IntValue) );.  
118e0 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 43        zName = pC
118f0 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  olExpr->u.zToken
11900 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11910 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68         /* Use th
11920 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20  e original text 
11930 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78  of the column ex
11940 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20  pression as its 
11950 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
11960 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
11970 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
11980 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
11990 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ( zName ){.     
119a0 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
119b0 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61  DbStrDup(db, zNa
119c0 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
119d0 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
119e0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
119f0 22 63 6f 6c 75 6d 6e 25 64 22 2c 69 2b 31 29 3b  "column%d",i+1);
11a00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
11a10 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c  ake sure the col
11a20 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  umn name is uniq
11a30 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65  ue.  If the name
11a40 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
11a50 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e      ** append an
11a60 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
11a70 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
11a80 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
11a90 20 20 20 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d      */.    cnt =
11aa0 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a   0;.    while( z
11ab0 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48  Name && sqlite3H
11ac0 61 73 68 46 69 6e 64 28 26 68 74 2c 20 7a 4e 61  ashFind(&ht, zNa
11ad0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
11ae0 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
11af0 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
11b00 20 20 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3e        if( nName>
11b10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
11b20 28 6a 3d 6e 4e 61 6d 65 2d 31 3b 20 6a 3e 30 20  (j=nName-1; j>0 
11b30 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  && sqlite3Isdigi
11b40 74 28 7a 4e 61 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d  t(zName[j]); j--
11b50 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ){}.        if( 
11b60 7a 4e 61 6d 65 5b 6a 5d 3d 3d 27 3a 27 20 29 20  zName[j]==':' ) 
11b70 6e 4e 61 6d 65 20 3d 20 6a 3b 0a 20 20 20 20 20  nName = j;.     
11b80 20 7d 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d   }.      zName =
11b90 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
11ba0 64 62 2c 20 22 25 2e 2a 7a 3a 25 75 22 2c 20 6e  db, "%.*z:%u", n
11bb0 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  Name, zName, ++c
11bc0 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  nt);.      if( c
11bd0 6e 74 3e 33 20 29 20 73 71 6c 69 74 65 33 5f 72  nt>3 ) sqlite3_r
11be0 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
11bf0 28 63 6e 74 29 2c 20 26 63 6e 74 29 3b 0a 20 20  (cnt), &cnt);.  
11c00 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e    }.    pCol->zN
11c10 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
11c20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72   sqlite3ColumnPr
11c30 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65  opertiesFromName
11c40 28 30 2c 20 70 43 6f 6c 29 3b 0a 20 20 20 20 69  (0, pCol);.    i
11c50 66 28 20 7a 4e 61 6d 65 20 26 26 20 73 71 6c 69  f( zName && sqli
11c60 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 68  te3HashInsert(&h
11c70 74 2c 20 7a 4e 61 6d 65 2c 20 70 43 6f 6c 29 3d  t, zName, pCol)=
11c80 3d 70 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  =pCol ){.      s
11c90 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
11ca0 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
11cb0 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
11cc0 28 26 68 74 29 3b 0a 20 20 69 66 28 20 64 62 2d  (&ht);.  if( db-
11cd0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
11ce0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
11cf0 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  i; j++){.      s
11d00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11d10 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b   aCol[j].zName);
11d20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
11d30 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
11d40 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d  l);.    *paCol =
11d50 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d   0;.    *pnCol =
11d60 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
11d70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
11d80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
11d90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11da0 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64 20  ** Add type and 
11db0 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d  collation inform
11dc0 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d  ation to a colum
11dd0 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a  n list based on.
11de0 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  ** a SELECT stat
11df0 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ement..** .** Th
11e00 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72  e column list pr
11e10 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72  esumably came fr
11e20 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e  om selectColumnN
11e30 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  amesFromExprList
11e40 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ()..** The colum
11e50 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20  n list has only 
11e60 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73  names, not types
11e70 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20   or collations. 
11e80 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
11e90 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e   goes through an
11ea0 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65 73  d adds the types
11eb0 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e   and collations.
11ec0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
11ed0 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68 61  ine requires tha
11ee0 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72  t all identifier
11ef0 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a  s in the SELECT.
11f00 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20  ** statement be 
11f10 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 76 6f 69  resolved..*/.voi
11f20 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41  d sqlite3SelectA
11f30 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
11f40 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73  ollation(.  Pars
11f50 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
11f60 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
11f70 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65  texts */.  Table
11f80 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
11f90 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74   /* Add column t
11fa0 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ype information 
11fb0 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  to this table */
11fc0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
11fd0 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45  ct       /* SELE
11fe0 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  CT used to deter
11ff0 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63  mine types and c
12000 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  ollations */.){.
12010 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
12020 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61  pParse->db;.  Na
12030 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
12040 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
12050 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
12060 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
12070 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78   *p;.  struct Ex
12080 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a  prList_item *a;.
12090 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65  .  assert( pSele
120a0 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ct!=0 );.  asser
120b0 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c  t( (pSelect->sel
120c0 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
120d0 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  ved)!=0 );.  ass
120e0 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d  ert( pTab->nCol=
120f0 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  =pSelect->pEList
12100 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  ->nExpr || db->m
12110 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
12120 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
12130 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
12140 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
12150 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
12160 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
12170 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
12180 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70    a = pSelect->p
12190 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28  EList->a;.  for(
121a0 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  i=0, pCol=pTab->
121b0 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  aCol; i<pTab->nC
121c0 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
121d0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
121e0 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 69 6e 74   *zType;.    int
121f0 20 6e 2c 20 6d 3b 0a 20 20 20 20 70 20 3d 20 61   n, m;.    p = a
12200 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7a  [i].pExpr;.    z
12210 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
12220 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c  e(&sNC, p, 0, 0,
12230 20 30 29 3b 0a 20 20 20 20 2f 2a 20 70 43 6f 6c   0);.    /* pCol
12240 2d 3e 73 7a 45 73 74 20 3d 20 2e 2e 2e 20 2f 2f  ->szEst = ... //
12250 20 43 6f 6c 75 6d 6e 20 73 69 7a 65 20 65 73 74   Column size est
12260 20 66 6f 72 20 53 45 4c 45 43 54 20 74 61 62 6c   for SELECT tabl
12270 65 73 20 6e 65 76 65 72 20 75 73 65 64 20 2a 2f  es never used */
12280 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  .    pCol->affin
12290 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ity = sqlite3Exp
122a0 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20  rAffinity(p);.  
122b0 20 20 69 66 28 20 7a 54 79 70 65 20 29 7b 0a 20    if( zType ){. 
122c0 20 20 20 20 20 6d 20 3d 20 73 71 6c 69 74 65 33       m = sqlite3
122d0 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b  Strlen30(zType);
122e0 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  .      n = sqlit
122f0 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 2d  e3Strlen30(pCol-
12300 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  >zName);.      p
12310 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Col->zName = sql
12320 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
12330 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
12340 61 6d 65 2c 20 6e 2b 6d 2b 32 29 3b 0a 20 20 20  ame, n+m+2);.   
12350 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 7a 4e 61     if( pCol->zNa
12360 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  me ){.        me
12370 6d 63 70 79 28 26 70 43 6f 6c 2d 3e 7a 4e 61 6d  mcpy(&pCol->zNam
12380 65 5b 6e 2b 31 5d 2c 20 7a 54 79 70 65 2c 20 6d  e[n+1], zType, m
12390 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  +1);.        pCo
123a0 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
123b0 4f 4c 46 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a  OLFLAG_HASTYPE;.
123c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
123d0 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69    if( pCol->affi
123e0 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e  nity==0 ) pCol->
123f0 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
12400 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20  E_AFF_BLOB;.    
12410 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
12420 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
12430 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e, p);.    if( p
12440 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 2d 3e 7a 43  Coll && pCol->zC
12450 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  oll==0 ){.      
12460 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71  pCol->zColl = sq
12470 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
12480 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
12490 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61  .    }.  }.  pTa
124a0 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 31 3b  b->szTabRow = 1;
124b0 20 2f 2a 20 41 6e 79 20 6e 6f 6e 2d 7a 65 72 6f   /* Any non-zero
124c0 20 76 61 6c 75 65 20 77 6f 72 6b 73 20 2a 2f 0a   value works */.
124d0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
124e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
124f0 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20 54 61  t, generate a Ta
12500 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
12510 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20  at describes.** 
12520 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
12530 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a  f that SELECT..*
12540 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
12550 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
12560 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
12570 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
12580 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
12590 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
125a0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
125b0 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a  int savedFlags;.
125c0 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20  .  savedFlags = 
125d0 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d  db->flags;.  db-
125e0 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
125f0 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a  E_FullColNames;.
12600 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
12610 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
12620 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  mes;.  sqlite3Se
12630 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
12640 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20   pSelect, 0);.  
12650 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
12660 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77   ) return 0;.  w
12670 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
12680 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20  Prior ) pSelect 
12690 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
126a0 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d  r;.  db->flags =
126b0 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70   savedFlags;.  p
126c0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
126d0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
126e0 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20  zeof(Table) );. 
126f0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
12700 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
12710 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74  }.  /* The sqlit
12720 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
12730 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73  ect() is only us
12740 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68  ed n contexts wh
12750 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20  ere lookaside.  
12760 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ** is disabled *
12770 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  /.  assert( db->
12780 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62  lookaside.bDisab
12790 6c 65 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 54  le );.  pTab->nT
127a0 61 62 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61  abRef = 1;.  pTa
127b0 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  b->zName = 0;.  
127c0 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74  pTab->nRowLogEst
127d0 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20   = 200; assert( 
127e0 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  200==sqlite3LogE
127f0 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20  st(1048576) );. 
12800 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46   sqlite3ColumnsF
12810 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
12820 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  se, pSelect->pEL
12830 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
12840 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
12850 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
12860 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
12870 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
12880 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b   pTab, pSelect);
12890 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d  .  pTab->iPKey =
128a0 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   -1;.  if( db->m
128b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
128c0 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
128d0 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
128e0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
128f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62   }.  return pTab
12900 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
12910 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69   VDBE for the gi
12920 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65  ven parser conte
12930 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  xt.  Create a ne
12940 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
12950 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  ry..** If an err
12960 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
12970 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65  n NULL and leave
12980 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50   a message in pP
12990 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  arse..*/.Vdbe *s
129a0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61  qlite3GetVdbe(Pa
129b0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
129c0 69 66 28 20 70 50 61 72 73 65 2d 3e 70 56 64 62  if( pParse->pVdb
129d0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
129e0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
129f0 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
12a00 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20  >pToplevel==0.  
12a10 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
12a20 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e  Enabled(pParse->
12a30 64 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72  db,SQLITE_Factor
12a40 4f 75 74 43 6f 6e 73 74 29 0a 20 20 29 7b 0a 20  OutConst).  ){. 
12a50 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e     pParse->okCon
12a60 73 74 46 61 63 74 6f 72 20 3d 20 31 3b 0a 20 20  stFactor = 1;.  
12a70 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
12a80 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61  e3VdbeCreate(pPa
12a90 72 73 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rse);.}.../*.** 
12aa0 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d  Compute the iLim
12ab0 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66  it and iOffset f
12ac0 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c  ields of the SEL
12ad0 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ECT based on the
12ae0 0a 2a 2a 20 70 4c 69 6d 69 74 20 65 78 70 72 65  .** pLimit expre
12af0 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 2d  ssions.  pLimit-
12b00 3e 70 4c 65 66 74 20 61 6e 64 20 70 4c 69 6d 69  >pLeft and pLimi
12b10 74 2d 3e 70 52 69 67 68 74 20 68 6f 6c 64 20 74  t->pRight hold t
12b20 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  he expressions.*
12b30 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  * that appear in
12b40 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
12b50 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65  L statement afte
12b60 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  r the LIMIT and 
12b70 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72  OFFSET.** keywor
12b80 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20  ds.  Or NULL if 
12b90 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61  those keywords a
12ba0 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d  re omitted. iLim
12bb0 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a  it and iOffset .
12bc0 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  ** are the integ
12bd0 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  er memory regist
12be0 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63  er numbers for c
12bf0 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20  ounters used to 
12c00 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20  compute .** the 
12c10 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
12c20 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
12c30 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f  o limit and/or o
12c40 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20  ffset, then .** 
12c50 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
12c60 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e  et are negative.
12c70 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
12c80 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20  ine changes the 
12c90 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74  values of iLimit
12ca0 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c   and iOffset onl
12cb0 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20  y if.** a limit 
12cc0 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66  or offset is def
12cd0 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 2d 3e  ined by pLimit->
12ce0 70 4c 65 66 74 20 61 6e 64 20 70 4c 69 6d 69 74  pLeft and pLimit
12cf0 2d 3e 70 52 69 67 68 74 2e 20 20 69 4c 69 6d 69  ->pRight.  iLimi
12d00 74 0a 2a 2a 20 61 6e 64 20 69 4f 66 66 73 65 74  t.** and iOffset
12d10 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
12d20 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72  n preset to appr
12d30 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20  opriate default 
12d40 76 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a 2a 2a  values (zero).**
12d50 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
12d60 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
12d70 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66 73 65  **.** The iOffse
12d80 74 20 72 65 67 69 73 74 65 72 20 28 69 66 20 69  t register (if i
12d90 74 20 65 78 69 73 74 73 29 20 69 73 20 69 6e 69  t exists) is ini
12da0 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20  tialized to the 
12db0 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20  value.** of the 
12dc0 4f 46 46 53 45 54 2e 20 20 54 68 65 20 69 4c 69  OFFSET.  The iLi
12dd0 6d 69 74 20 72 65 67 69 73 74 65 72 20 69 73 20  mit register is 
12de0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c  initialized to L
12df0 49 4d 49 54 2e 20 20 52 65 67 69 73 74 65 72 0a  IMIT.  Register.
12e00 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20 69 73 20  ** iOffset+1 is 
12e10 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 4c  initialized to L
12e20 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a 2a 0a  IMIT+OFFSET..**.
12e30 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69  ** Only if pLimi
12e40 74 2d 3e 70 4c 65 66 74 21 3d 30 20 64 6f 20 74  t->pLeft!=0 do t
12e50 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
12e60 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69  rs get.** redefi
12e70 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20  ned.  The UNION 
12e80 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65  ALL operator use
12e90 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20  s this property 
12ea0 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20  to force.** the 
12eb0 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d  reuse of the sam
12ec0 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
12ed0 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72  et registers acr
12ee0 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  oss multiple.** 
12ef0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
12f00 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
12f10 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65  d computeLimitRe
12f20 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70  gisters(Parse *p
12f30 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
12f40 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20  , int iBreak){. 
12f50 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20   Vdbe *v = 0;.  
12f60 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  int iLimit = 0;.
12f70 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20    int iOffset;. 
12f80 20 69 6e 74 20 6e 3b 0a 20 20 45 78 70 72 20 2a   int n;.  Expr *
12f90 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
12fa0 69 74 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 4c  it;..  if( p->iL
12fb0 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a  imit ) return;..
12fc0 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49    /* .  ** "LIMI
12fd0 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f  T -1" always sho
12fe0 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68  ws all rows.  Th
12ff0 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a  ere is some.  **
13000 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f   controversy abo
13010 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72  ut what the corr
13020 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f  ect behavior sho
13030 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65  uld be..  ** The
13040 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
13050 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65  ntation interpre
13060 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20  ts "LIMIT 0" to 
13070 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77  mean.  ** no row
13080 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
13090 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
130a0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 70  pParse);.  if( p
130b0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 61 73 73  Limit ){.    ass
130c0 65 72 74 28 20 70 4c 69 6d 69 74 2d 3e 6f 70 3d  ert( pLimit->op=
130d0 3d 54 4b 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20  =TK_LIMIT );.   
130e0 20 61 73 73 65 72 74 28 20 70 4c 69 6d 69 74 2d   assert( pLimit-
130f0 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20  >pLeft!=0 );.   
13100 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69   p->iLimit = iLi
13110 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  mit = ++pParse->
13120 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71  nMem;.    v = sq
13130 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
13140 72 73 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  rse);.    assert
13150 28 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  ( v!=0 );.    if
13160 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
13170 6e 74 65 67 65 72 28 70 4c 69 6d 69 74 2d 3e 70  nteger(pLimit->p
13180 4c 65 66 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20  Left, &n) ){.   
13190 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
131a0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
131b0 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a  er, n, iLimit);.
131c0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
131d0 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
131e0 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69  nter"));.      i
131f0 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
13200 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
13210 74 6f 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  to(v, iBreak);. 
13220 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
13230 3e 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63  >=0 && p->nSelec
13240 74 52 6f 77 3e 73 71 6c 69 74 65 33 4c 6f 67 45  tRow>sqlite3LogE
13250 73 74 28 28 75 36 34 29 6e 29 20 29 7b 0a 20 20  st((u64)n) ){.  
13260 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
13270 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
13280 45 73 74 28 28 75 36 34 29 6e 29 3b 0a 20 20 20  Est((u64)n);.   
13290 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
132a0 20 7c 3d 20 53 46 5f 46 69 78 65 64 4c 69 6d 69   |= SF_FixedLimi
132b0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
132c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
132d0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
132e0 73 65 2c 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  se, pLimit->pLef
132f0 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  t, iLimit);.    
13300 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13310 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
13320 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56 64  Int, iLimit); Vd
13330 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
13340 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
13350 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
13360 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71  ter"));.      sq
13370 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13380 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69 4c 69  v, OP_IfNot, iLi
13390 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20 56 64  mit, iBreak); Vd
133a0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
133b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69     }.    if( pLi
133c0 6d 69 74 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  mit->pRight ){. 
133d0 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
133e0 3d 20 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50  = iOffset = ++pP
133f0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
13400 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b    pParse->nMem++
13410 3b 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ;   /* Allocate 
13420 61 6e 20 65 78 74 72 61 20 72 65 67 69 73 74 65  an extra registe
13430 72 20 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73  r for limit+offs
13440 65 74 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  et */.      sqli
13450 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
13460 73 65 2c 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67  se, pLimit->pRig
13470 68 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  ht, iOffset);.  
13480 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13490 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
134a0 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29 3b  BeInt, iOffset);
134b0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
134c0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
134d0 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20  ent((v, "OFFSET 
134e0 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
134f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13500 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74  Op3(v, OP_Offset
13510 4c 69 6d 69 74 2c 20 69 4c 69 6d 69 74 2c 20 69  Limit, iLimit, i
13520 4f 66 66 73 65 74 2b 31 2c 20 69 4f 66 66 73 65  Offset+1, iOffse
13530 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  t);.      VdbeCo
13540 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
13550 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20  +OFFSET"));.    
13560 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  }.  }.}..#ifndef
13570 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
13580 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
13590 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70  ** Return the ap
135a0 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74  propriate collat
135b0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
135c0 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
135d0 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65  umn of.** the re
135e0 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65  sult set for the
135f0 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
13600 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20   statement "p". 
13610 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a   Return NULL if.
13620 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61  ** the column ha
13630 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c  s no default col
13640 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
13650 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
13660 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
13670 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  r the compound s
13680 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66  elect is taken f
13690 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d  rom the.** left-
136a0 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  most term of the
136b0 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73   select that has
136c0 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
136d0 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  uence..*/.static
136e0 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53   CollSeq *multiS
136f0 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72  electCollSeq(Par
13700 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
13710 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29  ct *p, int iCol)
13720 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65  {.  CollSeq *pRe
13730 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
13740 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  or ){.    pRet =
13750 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
13760 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
13770 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20  Prior, iCol);.  
13780 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20  }else{.    pRet 
13790 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
137a0 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20  t( iCol>=0 );.  
137b0 2f 2a 20 69 43 6f 6c 20 6d 75 73 74 20 62 65 20  /* iCol must be 
137c0 6c 65 73 73 20 74 68 61 6e 20 70 2d 3e 70 45 4c  less than p->pEL
137d0 69 73 74 2d 3e 6e 45 78 70 72 2e 20 20 4f 74 68  ist->nExpr.  Oth
137e0 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
137f0 77 6f 75 6c 64 0a 20 20 2a 2a 20 68 61 76 65 20  would.  ** have 
13800 62 65 65 6e 20 74 68 72 6f 77 6e 20 64 75 72 69  been thrown duri
13810 6e 67 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  ng name resoluti
13820 6f 6e 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20  on and we would 
13830 6e 6f 74 20 68 61 76 65 20 67 6f 74 74 65 6e 0a  not have gotten.
13840 20 20 2a 2a 20 74 68 69 73 20 66 61 72 20 2a 2f    ** this far */
13850 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26  .  if( pRet==0 &
13860 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 2d  & ALWAYS(iCol<p-
13870 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  >pEList->nExpr) 
13880 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  ){.    pRet = sq
13890 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
138a0 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
138b0 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
138c0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
138d0 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
138e0 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  The select state
138f0 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74  ment passed as t
13900 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
13910 74 65 72 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ter is a compoun
13920 64 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68  d SELECT.** with
13930 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
13940 75 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  use. This functi
13950 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64  on allocates and
13960 20 72 65 74 75 72 6e 73 20 61 20 4b 65 79 49 6e   returns a KeyIn
13970 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  fo.** structure 
13980 73 75 69 74 61 62 6c 65 20 66 6f 72 20 69 6d 70  suitable for imp
13990 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52  lementing the OR
139a0 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70  DER BY..**.** Sp
139b0 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
139c0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
139d0 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
139e0 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63  om malloc. The c
139f0 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
13a00 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
13a10 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74  e for ensuring t
13a20 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75  hat this structu
13a30 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  re is eventually
13a40 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74  .** freed..*/.st
13a50 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75  atic KeyInfo *mu
13a60 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
13a70 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  KeyInfo(Parse *p
13a80 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
13a90 2c 20 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20  , int nExtra){. 
13aa0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
13ab0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
13ac0 79 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  y;.  int nOrderB
13ad0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  y = p->pOrderBy-
13ae0 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74 65  >nExpr;.  sqlite
13af0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
13b00 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  db;.  KeyInfo *p
13b10 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Ret = sqlite3Key
13b20 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f  InfoAlloc(db, nO
13b30 72 64 65 72 42 79 2b 6e 45 78 74 72 61 2c 20 31  rderBy+nExtra, 1
13b40 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b  );.  if( pRet ){
13b50 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
13b60 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
13b70 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
13b80 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
13b90 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
13ba0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a  pOrderBy->a[i];.
13bb0 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72        Expr *pTer
13bc0 6d 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  m = pItem->pExpr
13bd0 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  ;.      CollSeq 
13be0 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69  *pColl;..      i
13bf0 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  f( pTerm->flags 
13c00 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a  & EP_Collate ){.
13c10 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
13c20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
13c30 65 71 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  eq(pParse, pTerm
13c40 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
13c50 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
13c60 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
13c70 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 70 49  eq(pParse, p, pI
13c80 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
13c90 79 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20  yCol-1);.       
13ca0 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
13cb0 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
13cc0 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  tColl;.        p
13cd0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
13ce0 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20  xpr =.          
13cf0 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
13d00 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72  llateString(pPar
13d10 73 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c  se, pTerm, pColl
13d20 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
13d30 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
13d40 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
13d50 57 72 69 74 65 61 62 6c 65 28 70 52 65 74 29 20  Writeable(pRet) 
13d60 29 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61  );.      pRet->a
13d70 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b  Coll[i] = pColl;
13d80 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 53 6f  .      pRet->aSo
13d90 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72  rtOrder[i] = pOr
13da0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
13db0 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
13dc0 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
13dd0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
13de0 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a  TE_OMIT_CTE./*.*
13df0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
13e00 65 6e 65 72 61 74 65 73 20 56 44 42 45 20 63 6f  enerates VDBE co
13e10 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  de to compute th
13e20 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57  e content of a W
13e30 49 54 48 20 52 45 43 55 52 53 49 56 45 0a 2a 2a  ITH RECURSIVE.**
13e40 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
13e50 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63  rm:.**.**   <rec
13e60 75 72 73 69 76 65 2d 74 61 62 6c 65 3e 20 41 53  ursive-table> AS
13e70 20 28 3c 73 65 74 75 70 2d 71 75 65 72 79 3e 20   (<setup-query> 
13e80 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63  UNION [ALL] <rec
13e90 75 72 73 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a  ursive-query>).*
13ea0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
13eb0 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
13ec0 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
13ed0 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
13ee0 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20  ____/.**        
13ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f00 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 20 20 20     p->pPrior    
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65    p.**.**.** The
13f30 72 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e  re is exactly on
13f40 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
13f50 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62  he recursive-tab
13f60 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
13f70 6c 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75  lause.** of recu
13f80 72 73 69 76 65 2d 71 75 65 72 79 2c 20 6d 61 72  rsive-query, mar
13f90 6b 65 64 20 77 69 74 68 20 74 68 65 20 53 72 63  ked with the Src
13fa0 4c 69 73 74 2d 3e 61 5b 5d 2e 66 67 2e 69 73 52  List->a[].fg.isR
13fb0 65 63 75 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a  ecursive flag..*
13fc0 2a 0a 2a 2a 20 54 68 65 20 73 65 74 75 70 2d 71  *.** The setup-q
13fd0 75 65 72 79 20 72 75 6e 73 20 6f 6e 63 65 20 74  uery runs once t
13fe0 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  o generate an in
13ff0 69 74 69 61 6c 20 73 65 74 20 6f 66 20 72 6f 77  itial set of row
14000 73 20 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74  s that go.** int
14010 6f 20 61 20 51 75 65 75 65 20 74 61 62 6c 65 2e  o a Queue table.
14020 20 20 52 6f 77 73 20 61 72 65 20 65 78 74 72 61    Rows are extra
14030 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 51 75  cted from the Qu
14040 65 75 65 20 74 61 62 6c 65 20 6f 6e 65 20 62 79  eue table one by
14050 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20 72  .** one.  Each r
14060 6f 77 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ow extracted fro
14070 6d 20 51 75 65 75 65 20 69 73 20 6f 75 74 70 75  m Queue is outpu
14080 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65  t to pDest.  The
14090 6e 20 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20  n the single.** 
140a0 65 78 74 72 61 63 74 65 64 20 72 6f 77 20 28 6e  extracted row (n
140b0 6f 77 20 69 6e 20 74 68 65 20 69 43 75 72 72 65  ow in the iCurre
140c0 6e 74 20 74 61 62 6c 65 29 20 62 65 63 6f 6d 65  nt table) become
140d0 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  s the content of
140e0 20 74 68 65 0a 2a 2a 20 72 65 63 75 72 73 69 76   the.** recursiv
140f0 65 2d 74 61 62 6c 65 20 66 6f 72 20 61 20 72 65  e-table for a re
14100 63 75 72 73 69 76 65 2d 71 75 65 72 79 20 72 75  cursive-query ru
14110 6e 2e 20 20 54 68 65 20 6f 75 74 70 75 74 20 6f  n.  The output o
14120 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d  f the recursive-
14130 71 75 65 72 79 0a 2a 2a 20 69 73 20 61 64 64 65  query.** is adde
14140 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
14150 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68  Queue table.  Th
14160 65 6e 20 61 6e 6f 74 68 65 72 20 72 6f 77 20 69  en another row i
14170 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
14180 20 51 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68   Queue.** and th
14190 65 20 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74  e iteration cont
141a0 69 6e 75 65 73 20 75 6e 74 69 6c 20 74 68 65 20  inues until the 
141b0 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 65  Queue table is e
141c0 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mpty..**.** If t
141d0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
141e0 79 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e  y operator is UN
141f0 49 4f 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c  ION then no dupl
14200 69 63 61 74 65 20 72 6f 77 73 20 61 72 65 20 65  icate rows are e
14210 76 65 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20  ver.** inserted 
14220 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74  into the Queue t
14230 61 62 6c 65 2e 20 20 54 68 65 20 69 44 69 73 74  able.  The iDist
14240 69 6e 63 74 20 74 61 62 6c 65 20 6b 65 65 70 73  inct table keeps
14250 20 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72   a copy of all r
14260 6f 77 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65  ows.** that have
14270 20 65 76 65 72 20 62 65 65 6e 20 69 6e 73 65 72   ever been inser
14280 74 65 64 20 69 6e 74 6f 20 51 75 65 75 65 20 61  ted into Queue a
14290 6e 64 20 63 61 75 73 65 73 20 64 75 70 6c 69 63  nd causes duplic
142a0 61 74 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69  ates to be.** di
142b0 73 63 61 72 64 65 64 2e 20 20 49 66 20 74 68 65  scarded.  If the
142c0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
142d0 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70  ON ALL, then dup
142e0 6c 69 63 61 74 65 73 20 61 72 65 20 61 6c 6c 6f  licates are allo
142f0 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  wed..** .** If t
14300 68 65 20 71 75 65 72 79 20 68 61 73 20 61 6e 20  he query has an 
14310 4f 52 44 45 52 20 42 59 2c 20 74 68 65 6e 20 65  ORDER BY, then e
14320 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 51 75  ntries in the Qu
14330 65 75 65 20 74 61 62 6c 65 20 61 72 65 20 6b 65  eue table are ke
14340 70 74 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42  pt in.** ORDER B
14350 59 20 6f 72 64 65 72 20 61 6e 64 20 74 68 65 20  Y order and the 
14360 66 69 72 73 74 20 65 6e 74 72 79 20 69 73 20 65  first entry is e
14370 78 74 72 61 63 74 65 64 20 66 6f 72 20 65 61 63  xtracted for eac
14380 68 20 63 79 63 6c 65 2e 20 20 57 69 74 68 6f 75  h cycle.  Withou
14390 74 0a 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42 59  t.** an ORDER BY
143a0 2c 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  , the Queue tabl
143b0 65 20 69 73 20 6a 75 73 74 20 61 20 46 49 46 4f  e is just a FIFO
143c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d  ..**.** If a LIM
143d0 49 54 20 63 6c 61 75 73 65 20 69 73 20 70 72 6f  IT clause is pro
143e0 76 69 64 65 64 2c 20 74 68 65 6e 20 74 68 65 20  vided, then the 
143f0 69 74 65 72 61 74 69 6f 6e 20 73 74 6f 70 73 20  iteration stops 
14400 61 66 74 65 72 20 4c 49 4d 49 54 20 72 6f 77 73  after LIMIT rows
14410 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6f 75  .** have been ou
14420 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20  tput to pDest.  
14430 41 20 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20  A LIMIT of zero 
14440 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20  means to output 
14450 6e 6f 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a  no rows and a.**
14460 20 6e 65 67 61 74 69 76 65 20 4c 49 4d 49 54 20   negative LIMIT 
14470 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20  means to output 
14480 61 6c 6c 20 72 6f 77 73 2e 20 20 49 66 20 74 68  all rows.  If th
14490 65 72 65 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f  ere is also an O
144a0 46 46 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20  FFSET clause.** 
144b0 77 69 74 68 20 61 20 70 6f 73 69 74 69 76 65 20  with a positive 
144c0 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20  value, then the 
144d0 66 69 72 73 74 20 4f 46 46 53 45 54 20 6f 75 74  first OFFSET out
144e0 70 75 74 73 20 61 72 65 20 64 69 73 63 61 72 64  puts are discard
144f0 65 64 20 72 61 74 68 65 72 0a 2a 2a 20 74 68 61  ed rather.** tha
14500 6e 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20  n being sent to 
14510 70 44 65 73 74 2e 20 20 54 68 65 20 4c 49 4d 49  pDest.  The LIMI
14520 54 20 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74  T count does not
14530 20 62 65 67 69 6e 20 75 6e 74 69 6c 20 61 66 74   begin until aft
14540 65 72 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77  er OFFSET.** row
14550 73 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70  s have been skip
14560 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ped..*/.static v
14570 6f 69 64 20 67 65 6e 65 72 61 74 65 57 69 74 68  oid generateWith
14580 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28 0a  RecursiveQuery(.
14590 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
145a0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
145b0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
145c0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
145d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
145e0 75 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 6f  ursive SELECT to
145f0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
14600 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
14610 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
14620 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
14630 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72  sults */.){.  Sr
14640 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d  cList *pSrc = p-
14650 3e 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54  >pSrc;      /* T
14660 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
14670 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  f the recursive 
14680 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  query */.  int n
14690 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
146a0 3e 6e 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62  >nExpr;  /* Numb
146b0 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
146c0 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 74   the recursive t
146d0 61 62 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a  able */.  Vdbe *
146e0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
146f0 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  e;      /* The p
14700 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
14710 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
14720 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
14730 20 2a 70 53 65 74 75 70 20 3d 20 70 2d 3e 70 50   *pSetup = p->pP
14740 72 69 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 73  rior;   /* The s
14750 65 74 75 70 20 71 75 65 72 79 20 2a 2f 0a 20 20  etup query */.  
14760 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20  int addrTop;    
14770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14780 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   Top of the loop
14790 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
147a0 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 3b 20 20  nt, addrBreak;  
147b0 20 20 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20      /* CONTINUE 
147c0 61 6e 64 20 42 52 45 41 4b 20 61 64 64 72 65 73  and BREAK addres
147d0 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ses */.  int iCu
147e0 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  rrent = 0;      
147f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43 75         /* The Cu
14800 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  rrent table */. 
14810 20 69 6e 74 20 72 65 67 43 75 72 72 65 6e 74 3b   int regCurrent;
14820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14830 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
14840 6e 67 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65  ng Current table
14850 20 2a 2f 0a 20 20 69 6e 74 20 69 51 75 65 75 65   */.  int iQueue
14860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14870 20 20 20 20 2f 2a 20 54 68 65 20 51 75 65 75 65      /* The Queue
14880 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
14890 69 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 20 20  iDistinct = 0;  
148a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20            /* To 
148b0 65 6e 73 75 72 65 20 75 6e 69 71 75 65 20 72 65  ensure unique re
148c0 73 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a  sults if UNION *
148d0 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  /.  int eDest = 
148e0 53 52 54 5f 46 69 66 6f 3b 20 20 20 20 20 20 20  SRT_Fifo;       
148f0 20 20 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69 74    /* How to writ
14900 65 20 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20  e to Queue */.  
14910 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 51  SelectDest destQ
14920 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  ueue;         /*
14930 20 53 65 6c 65 63 74 44 65 73 74 20 74 61 72 67   SelectDest targ
14940 65 74 74 69 6e 67 20 74 68 65 20 51 75 65 75 65  etting the Queue
14950 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
14960 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
14970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
14980 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
14990 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
149a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
149b0 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
149c0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
149d0 72 42 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rBy;           /
149e0 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
149f0 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20  lause */.  Expr 
14a00 2a 70 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20  *pLimit;        
14a10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65           /* Save
14a20 64 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  d LIMIT and OFFS
14a30 45 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  ET */.  int regL
14a40 69 6d 69 74 2c 20 72 65 67 4f 66 66 73 65 74 3b  imit, regOffset;
14a50 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
14a60 72 73 20 75 73 65 64 20 62 79 20 4c 49 4d 49 54  rs used by LIMIT
14a70 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a   and OFFSET */..
14a80 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74 68    /* Obtain auth
14a90 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20  orization to do 
14aa0 61 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72  a recursive quer
14ab0 79 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  y */.  if( sqlit
14ac0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
14ad0 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 43 55 52  se, SQLITE_RECUR
14ae0 53 49 56 45 2c 20 30 2c 20 30 2c 20 30 29 20 29  SIVE, 0, 0, 0) )
14af0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50   return;..  /* P
14b00 72 6f 63 65 73 73 20 74 68 65 20 4c 49 4d 49 54  rocess the LIMIT
14b10 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75   and OFFSET clau
14b20 73 65 73 2c 20 69 66 20 74 68 65 79 20 65 78 69  ses, if they exi
14b30 73 74 20 2a 2f 0a 20 20 61 64 64 72 42 72 65 61  st */.  addrBrea
14b40 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
14b50 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70  akeLabel(v);.  p
14b60 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 33  ->nSelectRow = 3
14b70 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f  20;  /* 4 billio
14b80 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6d 70  n rows */.  comp
14b90 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
14ba0 73 28 70 50 61 72 73 65 2c 20 70 2c 20 61 64 64  s(pParse, p, add
14bb0 72 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69  rBreak);.  pLimi
14bc0 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
14bd0 20 72 65 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69   regLimit = p->i
14be0 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f 66 66 73  Limit;.  regOffs
14bf0 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
14c00 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  .  p->pLimit = 0
14c10 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
14c20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->iOffset = 0;.
14c30 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
14c40 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
14c50 4c 6f 63 61 74 65 20 74 68 65 20 63 75 72 73 6f  Locate the curso
14c60 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
14c70 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f  Current table */
14c80 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41  .  for(i=0; ALWA
14c90 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29  YS(i<pSrc->nSrc)
14ca0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
14cb0 70 53 72 63 2d 3e 61 5b 69 5d 2e 66 67 2e 69 73  pSrc->a[i].fg.is
14cc0 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
14cd0 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70 53     iCurrent = pS
14ce0 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
14cf0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14d00 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
14d10 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20  llocate cursors 
14d20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51 75 65 75  numbers for Queu
14d30 65 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20  e and Distinct. 
14d40 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   The cursor numb
14d50 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20  er for.  ** the 
14d60 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6d  Distinct table m
14d70 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 6f  ust be exactly o
14d80 6e 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ne greater than 
14d90 51 75 65 75 65 20 69 6e 20 6f 72 64 65 72 0a 20  Queue in order. 
14da0 20 2a 2a 20 66 6f 72 20 74 68 65 20 53 52 54 5f   ** for the SRT_
14db0 44 69 73 74 46 69 66 6f 20 61 6e 64 20 53 52 54  DistFifo and SRT
14dc0 5f 44 69 73 74 51 75 65 75 65 20 64 65 73 74 69  _DistQueue desti
14dd0 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e  nations to work.
14de0 20 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d 20 70   */.  iQueue = p
14df0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
14e00 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55   if( p->op==TK_U
14e10 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65 73  NION ){.    eDes
14e20 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53  t = pOrderBy ? S
14e30 52 54 5f 44 69 73 74 51 75 65 75 65 20 3a 20 53  RT_DistQueue : S
14e40 52 54 5f 44 69 73 74 46 69 66 6f 3b 0a 20 20 20  RT_DistFifo;.   
14e50 20 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61   iDistinct = pPa
14e60 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d  rse->nTab++;.  }
14e70 65 6c 73 65 7b 0a 20 20 20 20 65 44 65 73 74 20  else{.    eDest 
14e80 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54  = pOrderBy ? SRT
14e90 5f 51 75 65 75 65 20 3a 20 53 52 54 5f 46 69 66  _Queue : SRT_Fif
14ea0 6f 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  o;.  }.  sqlite3
14eb0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
14ec0 64 65 73 74 51 75 65 75 65 2c 20 65 44 65 73 74  destQueue, eDest
14ed0 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a  , iQueue);..  /*
14ee0 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72   Allocate cursor
14ef0 73 20 66 6f 72 20 43 75 72 72 65 6e 74 2c 20 51  s for Current, Q
14f00 75 65 75 65 2c 20 61 6e 64 20 44 69 73 74 69 6e  ueue, and Distin
14f10 63 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72 72  ct. */.  regCurr
14f20 65 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ent = ++pParse->
14f30 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56  nMem;.  sqlite3V
14f40 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
14f50 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 43 75 72  OpenPseudo, iCur
14f60 72 65 6e 74 2c 20 72 65 67 43 75 72 72 65 6e 74  rent, regCurrent
14f70 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70  , nCol);.  if( p
14f80 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b  OrderBy ){.    K
14f90 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
14fa0 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72   = multiSelectOr
14fb0 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61  derByKeyInfo(pPa
14fc0 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20  rse, p, 1);.    
14fd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14fe0 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
14ff0 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 70  meral, iQueue, p
15000 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32  OrderBy->nExpr+2
15010 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
15020 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
15030 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
15040 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73  EYINFO);.    des
15050 74 51 75 65 75 65 2e 70 4f 72 64 65 72 42 79 20  tQueue.pOrderBy 
15060 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65  = pOrderBy;.  }e
15070 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
15080 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15090 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
150a0 69 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20  iQueue, nCol);. 
150b0 20 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74   }.  VdbeComment
150c0 28 28 76 2c 20 22 51 75 65 75 65 20 74 61 62 6c  ((v, "Queue tabl
150d0 65 22 29 29 3b 0a 20 20 69 66 28 20 69 44 69 73  e"));.  if( iDis
150e0 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e  tinct ){.    p->
150f0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
15100 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15110 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
15120 68 65 6d 65 72 61 6c 2c 20 69 44 69 73 74 69 6e  hemeral, iDistin
15130 63 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73  ct, 0);.    p->s
15140 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73  elFlags |= SF_Us
15150 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d  esEphemeral;.  }
15160 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74 68  ..  /* Detach th
15170 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
15180 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f  e from the compo
15190 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  und SELECT */.  
151a0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
151b0 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65  ..  /* Store the
151c0 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
151d0 73 65 74 75 70 2d 71 75 65 72 79 20 69 6e 20 51  setup-query in Q
151e0 75 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75  ueue. */.  pSetu
151f0 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  p->pNext = 0;.  
15200 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
15210 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 53 45  ((pParse, 1, "SE
15220 54 55 50 22 29 29 3b 0a 20 20 72 63 20 3d 20 73  TUP"));.  rc = s
15230 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
15240 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65  rse, pSetup, &de
15250 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74  stQueue);.  pSet
15260 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  up->pNext = p;. 
15270 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
15280 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f  nd_of_recursive_
15290 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e  query;..  /* Fin
152a0 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  d the next row i
152b0 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20  n the Queue and 
152c0 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20  output that row 
152d0 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73  */.  addrTop = s
152e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
152f0 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
15300 51 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b  Queue, addrBreak
15310 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
15320 76 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66  v);..  /* Transf
15330 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  er the next row 
15340 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f  in Queue over to
15350 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71   Current */.  sq
15360 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
15370 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69  v, OP_NullRow, i
15380 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20  Current); /* To 
15390 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63  reset column cac
153a0 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  he */.  if( pOrd
153b0 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
153c0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
153d0 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65   OP_Column, iQue
153e0 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ue, pOrderBy->nE
153f0 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e  xpr+1, regCurren
15400 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
15410 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15420 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61  p2(v, OP_RowData
15430 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72  , iQueue, regCur
15440 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  rent);.  }.  sql
15450 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
15460 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75  , OP_Delete, iQu
15470 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  eue);..  /* Outp
15480 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f  ut the single ro
15490 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a  w in Current */.
154a0 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c    addrCont = sql
154b0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
154c0 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73  l(v);.  codeOffs
154d0 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c  et(v, regOffset,
154e0 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65   addrCont);.  se
154f0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
15500 61 72 73 65 2c 20 70 2c 20 69 43 75 72 72 65 6e  arse, p, iCurren
15510 74 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20 70  t,.      0, 0, p
15520 44 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20  Dest, addrCont, 
15530 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66  addrBreak);.  if
15540 28 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20 20  ( regLimit ){.  
15550 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15560 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75  Op2(v, OP_DecrJu
15570 6d 70 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74  mpZero, regLimit
15580 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
15590 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
155a0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
155b0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
155c0 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a  (v, addrCont);..
155d0 20 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65    /* Execute the
155e0 20 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43   recursive SELEC
155f0 54 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e  T taking the sin
15600 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65  gle row in Curre
15610 6e 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76  nt as.  ** the v
15620 61 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63  alue for the rec
15630 75 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74  ursive-table. St
15640 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
15650 69 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20  in the Queue..  
15660 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
15670 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
15680 61 74 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ate ){.    sqlit
15690 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
156a0 65 2c 20 22 72 65 63 75 72 73 69 76 65 20 61 67  e, "recursive ag
156b0 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
156c0 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 29 3b  not supported");
156d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
156e0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
156f0 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
15700 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 52  n((pParse, 1, "R
15710 45 43 55 52 53 49 56 45 20 53 54 45 50 22 29 29  ECURSIVE STEP"))
15720 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
15730 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
15740 64 65 73 74 51 75 65 75 65 29 3b 0a 20 20 20 20  destQueue);.    
15750 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f  assert( p->pPrio
15760 72 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 70  r==0 );.    p->p
15770 50 72 69 6f 72 20 3d 20 70 53 65 74 75 70 3b 0a  Prior = pSetup;.
15780 20 20 7d 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72    }..  /* Keep r
15790 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20  unning the loop 
157a0 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20  until the Queue 
157b0 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71  is empty */.  sq
157c0 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
157d0 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c   addrTop);.  sql
157e0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
157f0 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61  abel(v, addrBrea
15800 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75  k);..end_of_recu
15810 72 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 73  rsive_query:.  s
15820 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
15830 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
15840 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
15850 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
15860 4f 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c  OrderBy;.  p->pL
15870 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
15880 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69   return;.}.#endi
15890 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
158a0 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77  _CTE */../* Forw
158b0 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a  ard references *
158c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
158d0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
158e0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
158f0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
15900 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
15910 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
15920 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
15930 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
15940 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
15950 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
15960 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
15970 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
15980 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
15990 3b 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 20  ;../*.** Handle 
159a0 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  the special case
159b0 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73   of a compound-s
159c0 65 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69  elect that origi
159d0 6e 61 74 65 73 20 66 72 6f 6d 20 61 0a 2a 2a 20  nates from a.** 
159e0 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 20 20  VALUES clause.  
159f0 42 79 20 68 61 6e 64 6c 69 6e 67 20 74 68 69 73  By handling this
15a00 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61   as a special ca
15a10 73 65 2c 20 77 65 20 61 76 6f 69 64 20 64 65 65  se, we avoid dee
15a20 70 0a 2a 2a 20 72 65 63 75 72 73 69 6f 6e 2c 20  p.** recursion, 
15a30 61 6e 64 20 74 68 75 73 20 64 6f 20 6e 6f 74 20  and thus do not 
15a40 6e 65 65 64 20 74 6f 20 65 6e 66 6f 72 63 65 20  need to enforce 
15a50 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  the SQLITE_LIMIT
15a60 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
15a70 0a 2a 2a 20 6f 6e 20 61 20 56 41 4c 55 45 53 20  .** on a VALUES 
15a80 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65  clause..**.** Be
15a90 63 61 75 73 65 20 74 68 65 20 53 65 6c 65 63 74  cause the Select
15aa0 20 6f 62 6a 65 63 74 20 6f 72 69 67 69 6e 61 74   object originat
15ab0 65 73 20 66 72 6f 6d 20 61 20 56 41 4c 55 45 53  es from a VALUES
15ac0 20 63 6c 61 75 73 65 3a 0a 2a 2a 20 20 20 28 31   clause:.**   (1
15ad0 29 20 54 68 65 72 65 20 69 73 20 6e 6f 20 4c 49  ) There is no LI
15ae0 4d 49 54 20 6f 72 20 4f 46 46 53 45 54 20 6f 72  MIT or OFFSET or
15af0 20 65 6c 73 65 20 74 68 65 72 65 20 69 73 20 61   else there is a
15b00 20 4c 49 4d 49 54 20 6f 66 20 65 78 61 63 74 6c   LIMIT of exactl
15b10 79 20 31 0a 2a 2a 20 20 20 28 32 29 20 41 6c 6c  y 1.**   (2) All
15b20 20 74 65 72 6d 73 20 61 72 65 20 55 4e 49 4f 4e   terms are UNION
15b30 20 41 4c 4c 0a 2a 2a 20 20 20 28 33 29 20 54 68   ALL.**   (3) Th
15b40 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
15b50 42 59 20 63 6c 61 75 73 65 0a 2a 2a 0a 2a 2a 20  BY clause.**.** 
15b60 54 68 65 20 22 4c 49 4d 49 54 20 6f 66 20 65 78  The "LIMIT of ex
15b70 61 63 74 6c 79 20 31 22 20 63 61 73 65 20 6f 66  actly 1" case of
15b80 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 63   condition (1) c
15b90 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20  omes about when 
15ba0 61 20 56 41 4c 55 45 53 0a 2a 2a 20 63 6c 61 75  a VALUES.** clau
15bb0 73 65 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  se occurs within
15bc0 20 73 63 61 6c 61 72 20 65 78 70 72 65 73 73 69   scalar expressi
15bd0 6f 6e 20 28 65 78 3a 20 22 53 45 4c 45 43 54 20  on (ex: "SELECT 
15be0 28 56 41 4c 55 45 53 28 31 29 2c 28 32 29 2c 28  (VALUES(1),(2),(
15bf0 33 29 29 22 29 2e 0a 2a 2a 20 54 68 65 20 73 71  3))")..** The sq
15c00 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
15c10 63 74 20 77 69 6c 6c 20 68 61 76 65 20 61 64 64  ct will have add
15c20 65 64 20 74 68 65 20 4c 49 4d 49 54 20 31 20 63  ed the LIMIT 1 c
15c30 6c 61 75 73 65 20 69 6e 20 74 68 74 20 63 61 73  lause in tht cas
15c40 65 2e 0a 2a 2a 20 53 69 6e 63 65 20 74 68 65 20  e..** Since the 
15c50 6c 69 6d 69 74 20 69 73 20 65 78 61 63 74 6c 79  limit is exactly
15c60 20 31 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64   1, we only need
15c70 20 74 6f 20 65 76 61 6c 75 74 65 73 20 74 68 65   to evalutes the
15c80 20 6c 65 66 74 2d 6d 6f 73 74 20 56 41 4c 55 45   left-most VALUE
15c90 53 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  S..*/.static int
15ca0 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75   multiSelectValu
15cb0 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
15cc0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
15cd0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
15ce0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
15cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15d00 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
15d10 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
15d20 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
15d30 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
15d40 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
15d50 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
15d60 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 20  /.){.  int nRow 
15d70 3d 20 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 1;.  int rc = 
15d80 30 3b 0a 20 20 69 6e 74 20 62 53 68 6f 77 41 6c  0;.  int bShowAl
15d90 6c 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30  l = p->pLimit==0
15da0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
15db0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c  elFlags & SF_Mul
15dc0 74 69 56 61 6c 75 65 20 29 3b 0a 20 20 64 6f 7b  tiValue );.  do{
15dd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
15de0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61  selFlags & SF_Va
15df0 6c 75 65 73 20 29 3b 0a 20 20 20 20 61 73 73 65  lues );.    asse
15e00 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  rt( p->op==TK_AL
15e10 4c 20 7c 7c 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f  L || (p->op==TK_
15e20 53 45 4c 45 43 54 20 26 26 20 70 2d 3e 70 50 72  SELECT && p->pPr
15e30 69 6f 72 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61  ior==0) );.    a
15e40 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d  ssert( p->pNext=
15e50 3d 30 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d  =0 || p->pEList-
15e60 3e 6e 45 78 70 72 3d 3d 70 2d 3e 70 4e 65 78 74  >nExpr==p->pNext
15e70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
15e80 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50  );.    if( p->pP
15e90 72 69 6f 72 3d 3d 30 20 29 20 62 72 65 61 6b 3b  rior==0 ) break;
15ea0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
15eb0 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70  pPrior->pNext==p
15ec0 20 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70   );.    p = p->p
15ed0 50 72 69 6f 72 3b 0a 20 20 20 20 6e 52 6f 77 20  Prior;.    nRow 
15ee0 2b 3d 20 62 53 68 6f 77 41 6c 6c 3b 0a 20 20 7d  += bShowAll;.  }
15ef0 77 68 69 6c 65 28 31 29 3b 0a 20 20 45 78 70 6c  while(1);.  Expl
15f00 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
15f10 61 72 73 65 2c 20 30 2c 20 22 53 43 41 4e 20 25  arse, 0, "SCAN %
15f20 64 20 43 4f 4e 53 54 41 4e 54 20 52 4f 57 25 73  d CONSTANT ROW%s
15f30 22 2c 20 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20  ", nRow,.       
15f40 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 52 6f               nRo
15f50 77 3d 3d 31 20 3f 20 22 22 20 3a 20 22 53 22 29  w==1 ? "" : "S")
15f60 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  );.  while( p ){
15f70 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72  .    selectInner
15f80 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
15f90 2d 31 2c 20 30 2c 20 30 2c 20 70 44 65 73 74 2c  -1, 0, 0, pDest,
15fa0 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20   1, 1);.    if( 
15fb0 21 62 53 68 6f 77 41 6c 6c 20 29 20 62 72 65 61  !bShowAll ) brea
15fc0 6b 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  k;.    p->nSelec
15fd0 74 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20  tRow = nRow;.   
15fe0 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
15ff0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
16000 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
16010 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
16020 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d  to process a com
16030 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d  pound query form
16040 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20   from.** two or 
16050 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20 71 75  more separate qu
16060 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f  eries using UNIO
16070 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58  N, UNION ALL, EX
16080 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45  CEPT, or.** INTE
16090 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20  RSECT.**.** "p" 
160a0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69  points to the ri
160b0 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20  ght-most of the 
160c0 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68  two queries.  th
160d0 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a  e query on the.*
160e0 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72  * left is p->pPr
160f0 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71  ior.  The left q
16100 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20  uery could also 
16110 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  be a compound qu
16120 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ery.** in which 
16130 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e  case this routin
16140 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
16150 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a   recursively. .*
16160 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
16170 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75   of the total qu
16180 65 72 79 20 61 72 65 20 74 6f 20 62 65 20 77 72  ery are to be wr
16190 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73  itten into a des
161a0 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  tination.** of t
161b0 79 70 65 20 65 44 65 73 74 20 77 69 74 68 20 70  ype eDest with p
161c0 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a  arameter iParm..
161d0 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a  **.** Example 1:
161e0 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72    Consider a thr
161f0 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20  ee-way compound 
16200 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
16210 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
16220 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20  a FROM t1 UNION 
16230 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32  SELECT b FROM t2
16240 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20   UNION SELECT c 
16250 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68  FROM t3.**.** Th
16260 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  is statement is 
16270 70 61 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c  parsed up as fol
16280 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
16290 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
162a0 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  .**      |.**   
162b0 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45     `----->  SELE
162c0 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20  CT b FROM t2.** 
162d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
162e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
162f0 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c     `------>  SEL
16300 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a  ECT a FROM t1.**
16310 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69  .** The arrows i
16320 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20 61 62  n the diagram ab
16330 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20 74 68  ove represent th
16340 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20  e Select.pPrior 
16350 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69  pointer..** So i
16360 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
16370 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20  s called with p 
16380 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20  equal to the t3 
16390 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70  query, then.** p
163a0 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68  Prior will be th
163b0 65 20 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e  e t2 query.  p->
163c0 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e  op will be TK_UN
163d0 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65  ION in this case
163e0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74  ..**.** Notice t
163f0 68 61 74 20 62 65 63 61 75 73 65 20 6f 66 20 74  hat because of t
16400 68 65 20 77 61 79 20 53 51 4c 69 74 65 20 70 61  he way SQLite pa
16410 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45  rses compound SE
16420 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e  LECTs, the.** in
16430 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73  dividual selects
16440 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72   always group fr
16450 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
16460 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16470 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50  multiSelect(.  P
16480 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
16490 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
164a0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
164b0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
164c0 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
164d0 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
164e0 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
164f0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
16500 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
16510 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
16520 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
16530 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16540 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73  OK;   /* Success
16550 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62   code from a sub
16560 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c  routine */.  Sel
16570 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
16580 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
16590 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
165a0 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
165b0 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
165c0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
165d0 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
165e0 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63   VDBE */.  Selec
165f0 74 44 65 73 74 20 64 65 73 74 3b 20 20 20 20 20  tDest dest;     
16600 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20   /* Alternative 
16610 64 61 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  data destination
16620 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44   */.  Select *pD
16630 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43  elete = 0;  /* C
16640 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73  hain of simple s
16650 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65  elects to delete
16660 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
16670 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  b;          /* D
16680 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
16690 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 4d 61 6b 65  on */..  /* Make
166a0 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
166b0 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49  o ORDER BY or LI
166c0 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72  MIT clause on pr
166d0 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e  ior SELECTs.  On
166e0 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74  ly.  ** the last
166f0 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45   (right-most) SE
16700 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69  LECT in the seri
16710 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f  es may have an O
16720 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
16730 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
16740 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20   p && p->pPrior 
16750 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66  );  /* Calling f
16760 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65  unction guarante
16770 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a  es this much */.
16780 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
16790 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
167a0 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e  rsive)==0 || p->
167b0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d  op==TK_ALL || p-
167c0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
167d0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
167e0 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  db;.  pPrior = p
167f0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74  ->pPrior;.  dest
16800 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28   = *pDest;.  if(
16810 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
16820 79 20 7c 7c 20 70 50 72 69 6f 72 2d 3e 70 4c 69  y || pPrior->pLi
16830 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
16840 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
16850 65 2c 22 25 73 20 63 6c 61 75 73 65 20 73 68 6f  e,"%s clause sho
16860 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
16870 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
16880 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72       pPrior->pOr
16890 64 65 72 42 79 21 3d 30 20 3f 20 22 4f 52 44 45  derBy!=0 ? "ORDE
168a0 52 20 42 59 22 20 3a 20 22 4c 49 4d 49 54 22 2c  R BY" : "LIMIT",
168b0 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
168c0 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
168d0 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
168e0 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
168f0 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  }..  v = sqlite3
16900 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
16910 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
16920 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20  );  /* The VDBE 
16930 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20  already created 
16940 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  by calling funct
16950 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65  ion */..  /* Cre
16960 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74  ate the destinat
16970 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ion temporary ta
16980 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ble if necessary
16990 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74  .  */.  if( dest
169a0 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  .eDest==SRT_Ephe
169b0 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65  mTab ){.    asse
169c0 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
169d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
169e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
169f0 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74  nEphemeral, dest
16a00 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c  .iSDParm, p->pEL
16a10 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
16a20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52   dest.eDest = SR
16a30 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20  T_Table;.  }..  
16a40 2f 2a 20 53 70 65 63 69 61 6c 20 68 61 6e 64 6c  /* Special handl
16a50 69 6e 67 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75  ing for a compou
16a60 6e 64 2d 73 65 6c 65 63 74 20 74 68 61 74 20 6f  nd-select that o
16a70 72 69 67 69 6e 61 74 65 73 20 61 73 20 61 20 56  riginates as a V
16a80 41 4c 55 45 53 20 63 6c 61 75 73 65 2e 0a 20 20  ALUES clause..  
16a90 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
16aa0 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56  lags & SF_MultiV
16ab0 61 6c 75 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  alue ){.    rc =
16ac0 20 6d 75 6c 74 69 53 65 6c 65 63 74 56 61 6c 75   multiSelectValu
16ad0 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  es(pParse, p, &d
16ae0 65 73 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6d  est);.    goto m
16af0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
16b00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
16b10 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73  sure all SELECTs
16b20 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
16b30 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
16b40 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
16b50 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72  ts.  ** in their
16b60 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20   result sets..  
16b70 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
16b80 70 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72  pEList && pPrior
16b90 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 61 73  ->pEList );.  as
16ba0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d  sert( p->pEList-
16bb0 3e 6e 45 78 70 72 3d 3d 70 50 72 69 6f 72 2d 3e  >nExpr==pPrior->
16bc0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b  pEList->nExpr );
16bd0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16be0 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28 20  _OMIT_CTE.  if( 
16bf0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
16c00 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  _Recursive ){.  
16c10 20 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65    generateWithRe
16c20 63 75 72 73 69 76 65 51 75 65 72 79 28 70 50 61  cursiveQuery(pPa
16c30 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a  rse, p, &dest);.
16c40 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
16c50 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45    /* Compound SE
16c60 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20  LECTs that have 
16c70 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
16c80 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  se are handled s
16c90 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  eparately..  */.
16ca0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
16cb0 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
16cc0 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
16cd0 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  By(pParse, p, pD
16ce0 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a  est);.  }else{..
16cf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16d00 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20  MIT_EXPLAIN.    
16d10 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69  if( pPrior->pPri
16d20 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  or==0 ){.      E
16d30 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
16d40 28 70 50 61 72 73 65 2c 20 31 2c 20 22 43 4f 4d  (pParse, 1, "COM
16d50 50 4f 55 4e 44 20 51 55 45 52 59 22 29 29 3b 0a  POUND QUERY"));.
16d60 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
16d70 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
16d80 31 2c 20 22 4c 45 46 54 2d 4d 4f 53 54 20 53 55  1, "LEFT-MOST SU
16d90 42 51 55 45 52 59 22 29 29 3b 0a 20 20 20 20 7d  BQUERY"));.    }
16da0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
16db0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
16dc0 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  r the left and r
16dd0 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74  ight SELECT stat
16de0 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  ements..    */. 
16df0 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70     switch( p->op
16e00 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 54   ){.      case T
16e10 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 20  K_ALL: {.       
16e20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20   int addr = 0;. 
16e30 20 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69         int nLimi
16e40 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
16e50 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  t( !pPrior->pLim
16e60 69 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  it );.        pP
16e70 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70  rior->iLimit = p
16e80 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->iLimit;.      
16e90 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65    pPrior->iOffse
16ea0 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
16eb0 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e          pPrior->
16ec0 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
16ed0 69 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  it;.        rc =
16ee0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
16ef0 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
16f00 64 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70  dest);.        p
16f10 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
16f20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
16f30 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
16f40 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
16f50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16f60 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
16f70 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69  ;.        p->iLi
16f80 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c  mit = pPrior->iL
16f90 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 2d  imit;.        p-
16fa0 3e 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f  >iOffset = pPrio
16fb0 72 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  r->iOffset;.    
16fc0 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69      if( p->iLimi
16fd0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  t ){.          a
16fe0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
16ff0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
17000 4e 6f 74 2c 20 70 2d 3e 69 4c 69 6d 69 74 29 3b  Not, p->iLimit);
17010 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
17020 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
17030 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d  Comment((v, "Jum
17040 70 20 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54  p ahead if LIMIT
17050 20 72 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20   reached"));.   
17060 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4f         if( p->iO
17070 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  ffset ){.       
17080 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17090 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 66 66  AddOp3(v, OP_Off
170a0 73 65 74 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20  setLimit,.      
170b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170c0 20 20 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69          p->iLimi
170d0 74 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 2c  t, p->iOffset+1,
170e0 20 70 2d 3e 69 4f 66 66 73 65 74 29 3b 0a 20 20   p->iOffset);.  
170f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17100 20 20 7d 0a 20 20 20 20 20 20 20 20 45 78 70 6c    }.        Expl
17110 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
17120 61 72 73 65 2c 20 31 2c 20 22 55 4e 49 4f 4e 20  arse, 1, "UNION 
17130 41 4c 4c 22 29 29 3b 0a 20 20 20 20 20 20 20 20  ALL"));.        
17140 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
17150 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
17160 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65  est);.        te
17170 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
17180 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
17190 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
171a0 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d  rior;.        p-
171b0 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
171c0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65  ;.        p->nSe
171d0 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
171e0 33 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53  3LogEstAdd(p->nS
171f0 65 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72  electRow, pPrior
17200 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
17210 20 20 20 20 20 20 20 69 66 28 20 70 50 72 69 6f         if( pPrio
17220 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20  r->pLimit.      
17230 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
17240 72 49 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f  rIsInteger(pPrio
17250 72 2d 3e 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  r->pLimit->pLeft
17260 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20  , &nLimit).     
17270 20 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30 20      && nLimit>0 
17280 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  && p->nSelectRow
17290 20 3e 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   > sqlite3LogEst
172a0 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 20 0a 20  ((u64)nLimit) . 
172b0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
172c0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
172d0 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
172e0 74 28 28 75 36 34 29 6e 4c 69 6d 69 74 29 3b 0a  t((u64)nLimit);.
172f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17300 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20    if( addr ){.  
17310 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17320 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
17330 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ddr);.        }.
17340 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
17360 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20  e TK_EXCEPT:.   
17370 20 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e     case TK_UNION
17380 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  : {.        int 
17390 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20  unionTab;    /* 
173a0 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  Cursor number of
173b0 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20   the temp table 
173c0 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a  holding result *
173d0 2f 0a 20 20 20 20 20 20 20 20 75 38 20 6f 70 20  /.        u8 op 
173e0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e  = 0;       /* On
173f0 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70  e of the SRT_ op
17400 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c  erations to appl
17410 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20  y to self */.   
17420 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70       int priorOp
17430 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54  ;     /* The SRT
17440 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61  _ operation to a
17450 70 70 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65  pply to prior se
17460 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  lects */.       
17470 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20   Expr *pLimit;  
17480 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
17490 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 20  s of p->nLimit  
174a0 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  */.        int a
174b0 64 64 72 3b 0a 20 20 20 20 20 20 20 20 53 65 6c  ddr;.        Sel
174c0 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64 65 73  ectDest uniondes
174d0 74 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 74 65  t;.  .        te
174e0 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
174f0 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20  K_EXCEPT );.    
17500 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
17510 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
17520 0a 20 20 20 20 20 20 20 20 70 72 69 6f 72 4f 70  .        priorOp
17530 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   = SRT_Union;.  
17540 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
17550 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b  Dest==priorOp ){
17560 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
17570 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d   can reuse a tem
17580 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e  porary table gen
17590 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c 45  erated by a SELE
175a0 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20  CT to our.      
175b0 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20      ** right..  
175c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
175d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
175e0 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20  pLimit==0 );    
175f0 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64    /* Not allowed
17600 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65   on leftward ele
17610 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  ments */.       
17620 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65     unionTab = de
17630 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20  st.iSDParm;.    
17640 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17650 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20       /* We will 
17660 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f  need to create o
17670 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79  ur own temporary
17680 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74   table to hold t
17690 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
176a0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73  intermediate res
176b0 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 20 20  ults..          
176c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69  */.          uni
176d0 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  onTab = pParse->
176e0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
176f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
17700 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  derBy==0 );.    
17710 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
17720 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17730 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
17740 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  al, unionTab, 0)
17750 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
17760 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
17770 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[0] == -1 );.
17780 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64            p->add
17790 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61  rOpenEphm[0] = a
177a0 64 64 72 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ddr;.          f
177b0 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d  indRightmost(p)-
177c0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
177d0 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
177e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
177f0 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
17800 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
17810 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
17820 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
17830 20 74 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20   to our left.   
17840 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17850 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
17860 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20  >pOrderBy );.   
17870 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
17880 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f  ctDestInit(&unio
17890 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20  ndest, priorOp, 
178a0 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20  unionTab);.     
178b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
178c0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
178d0 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74  rior, &uniondest
178e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
178f0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
17900 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
17910 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _end;.        }.
17920 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f    .        /* Co
17930 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
17940 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
17950 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
17960 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
17970 5f 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20  _EXCEPT ){.     
17980 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 45 78       op = SRT_Ex
17990 63 65 70 74 3b 0a 20 20 20 20 20 20 20 20 7d 65  cept;.        }e
179a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
179b0 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b  ssert( p->op==TK
179c0 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  _UNION );.      
179d0 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69      op = SRT_Uni
179e0 6f 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  on;.        }.  
179f0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
17a00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4c 69  = 0;.        pLi
17a10 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
17a20 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  .        p->pLim
17a30 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
17a40 75 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20  uniondest.eDest 
17a50 3d 20 6f 70 3b 0a 20 20 20 20 20 20 20 20 45 78  = op;.        Ex
17a60 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
17a70 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73 20 55  pParse, 1, "%s U
17a80 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45  SING TEMP B-TREE
17a90 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
17aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c               sel
17ab0 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
17ac0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
17ad0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
17ae0 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e  Parse, p, &union
17af0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 74  dest);.        t
17b00 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
17b10 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
17b20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74    /* Query flatt
17b30 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33  ening in sqlite3
17b40 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72  Select() might r
17b50 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42  efill p->pOrderB
17b60 79 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65  y..        ** Be
17b70 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20   sure to delete 
17b80 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65  p->pOrderBy, the
17b90 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64  refore, to avoid
17ba0 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20   a memory leak. 
17bb0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
17bc0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
17bd0 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  (db, p->pOrderBy
17be0 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c 65  );.        pDele
17bf0 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  te = p->pPrior;.
17c00 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
17c10 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
17c20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
17c30 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
17c40 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
17c50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
17c60 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
17c70 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 70  lite3LogEstAdd(p
17c80 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20 70 50  ->nSelectRow, pP
17c90 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
17ca0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
17cb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
17cc0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
17cd0 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 70  imit);.        p
17ce0 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
17cf0 74 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4c  t;.        p->iL
17d00 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  imit = 0;.      
17d10 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
17d20 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  ;.  .        /* 
17d30 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61  Convert the data
17d40 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
17d50 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61  y table into wha
17d60 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20  tever form.     
17d70 20 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74     ** it is that
17d80 20 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65   we currently ne
17d90 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
17da0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75         assert( u
17db0 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69 53  nionTab==dest.iS
17dc0 44 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65 44  DParm || dest.eD
17dd0 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b 0a  est!=priorOp );.
17de0 20 20 20 20 20 20 20 20 69 66 28 20 64 65 73 74          if( dest
17df0 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20  .eDest!=priorOp 
17e00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
17e10 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
17e20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20  iStart;.        
17e30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
17e40 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ist );.         
17e50 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
17e60 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
17e70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  );.          iCo
17e80 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
17e90 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
17ea0 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c          computeL
17eb0 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
17ec0 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
17ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
17ee0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17ef0 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f   OP_Rewind, unio
17f00 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 20 56  nTab, iBreak); V
17f10 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
17f20 20 20 20 20 20 20 20 20 20 20 69 53 74 61 72 74            iStart
17f30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
17f40 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
17f50 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e          selectIn
17f60 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
17f70 70 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20  p, unionTab,.   
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f90 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
17fa0 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
17fb0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  k);.          sq
17fc0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
17fd0 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
17fe0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17ff0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18000 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61  OP_Next, unionTa
18010 62 2c 20 69 53 74 61 72 74 29 3b 20 56 64 62 65  b, iStart); Vdbe
18020 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
18030 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18040 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
18050 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
18060 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18070 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
18080 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29  se, unionTab, 0)
18090 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
180a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
180b0 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74   }.      default
180c0 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d  : assert( p->op=
180d0 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b  =TK_INTERSECT );
180e0 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74   {.        int t
180f0 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20  ab1, tab2;.     
18100 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42     int iCont, iB
18110 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20  reak, iStart;.  
18120 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
18130 69 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  it;.        int 
18140 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 53 65  addr;.        Se
18150 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65  lectDest interse
18160 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20  ctdest;.        
18170 69 6e 74 20 72 31 3b 0a 20 20 0a 20 20 20 20 20  int r1;.  .     
18180 20 20 20 2f 2a 20 49 4e 54 45 52 53 45 43 54 20     /* INTERSECT 
18190 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
181a0 6d 20 74 68 65 20 6f 74 68 65 72 73 20 73 69 6e  m the others sin
181b0 63 65 20 69 74 20 72 65 71 75 69 72 65 73 0a 20  ce it requires. 
181c0 20 20 20 20 20 20 20 2a 2a 20 74 77 6f 20 74 65         ** two te
181d0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 20  mporary tables. 
181e0 20 48 65 6e 63 65 20 69 74 20 68 61 73 20 69 74   Hence it has it
181f0 73 20 6f 77 6e 20 63 61 73 65 2e 20 20 42 65 67  s own case.  Beg
18200 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79  in.        ** by
18210 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20   allocating the 
18220 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20 6e  tables we will n
18230 65 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  eed..        */.
18240 20 20 20 20 20 20 20 20 74 61 62 31 20 3d 20 70          tab1 = p
18250 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
18260 20 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50         tab2 = pP
18270 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
18280 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
18290 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
182a0 20 20 0a 20 20 20 20 20 20 20 20 61 64 64 72 20    .        addr 
182b0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
182c0 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
182d0 68 65 6d 65 72 61 6c 2c 20 74 61 62 31 2c 20 30  hemeral, tab1, 0
182e0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
182f0 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  t( p->addrOpenEp
18300 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20  hm[0] == -1 );. 
18310 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70         p->addrOp
18320 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72  enEphm[0] = addr
18330 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 64 52 69  ;.        findRi
18340 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46  ghtmost(p)->selF
18350 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
18360 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
18370 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
18380 69 73 74 20 29 3b 0a 20 20 0a 20 20 20 20 20 20  ist );.  .      
18390 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45    /* Code the SE
183a0 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65 66  LECTs to our lef
183b0 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  t into temporary
183c0 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a 20   table "tab1".. 
183d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
183e0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
183f0 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72 73 65  estInit(&interse
18400 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f  ctdest, SRT_Unio
18410 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20 20 20  n, tab1);.      
18420 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
18430 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72  lect(pParse, pPr
18440 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64  ior, &intersectd
18450 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  est);.        if
18460 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
18470 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
18480 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
18490 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a   }.  .        /*
184a0 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
184b0 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
184c0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
184d0 61 62 32 22 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ab2".        */.
184e0 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
184f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18500 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
18510 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a  eral, tab2, 0);.
18520 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18530 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
18540 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20  1] == -1 );.    
18550 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
18560 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[1] = addr;. 
18570 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
18580 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4c   = 0;.        pL
18590 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
185a0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69  ;.        p->pLi
185b0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
185c0 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69   intersectdest.i
185d0 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20  SDParm = tab2;. 
185e0 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75         ExplainQu
185f0 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
18600 20 31 2c 20 22 25 73 20 55 53 49 4e 47 20 54 45   1, "%s USING TE
18610 4d 50 20 42 2d 54 52 45 45 22 2c 0a 20 20 20 20  MP B-TREE",.    
18620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18630 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
18640 6d 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20  me(p->op)));.   
18650 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18660 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
18670 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73  p, &intersectdes
18680 74 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  t);.        test
18690 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
186a0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _OK );.        p
186b0 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69  Delete = p->pPri
186c0 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70  or;.        p->p
186d0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
186e0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e          if( p->n
186f0 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72  SelectRow>pPrior
18700 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a  ->nSelectRow ){.
18710 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65            p->nSe
18720 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72  lectRow = pPrior
18730 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
18740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18750 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
18760 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
18770 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69  ;.        p->pLi
18780 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
18790 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  .        /* Gene
187a0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
187b0 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
187c0 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
187d0 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20  mporary.        
187e0 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
187f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
18800 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
18810 29 3b 0a 20 20 20 20 20 20 20 20 69 42 72 65 61  );.        iBrea
18820 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
18830 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
18840 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
18850 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18860 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  l(v);.        co
18870 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
18880 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
18890 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
188a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
188b0 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
188c0 74 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 20 56  tab1, iBreak); V
188d0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
188e0 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
188f0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
18900 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
18910 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  iStart = sqlite3
18920 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18930 5f 52 6f 77 44 61 74 61 2c 20 74 61 62 31 2c 20  _RowData, tab1, 
18940 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
18950 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
18960 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
18970 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72  , tab2, iCont, r
18980 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56  1, 0);.        V
18990 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
189a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
189b0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
189c0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
189d0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
189e0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 74 61  op(pParse, p, ta
189f0 62 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b1,.            
18a00 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30              0, 0
18a10 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20  , &dest, iCont, 
18a20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
18a30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
18a40 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
18a50 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
18a60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18a70 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20   OP_Next, tab1, 
18a80 69 53 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76  iStart); VdbeCov
18a90 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
18aa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
18ab0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
18ac0 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
18ad0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18ae0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62  v, OP_Close, tab
18af0 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  2, 0);.        s
18b00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18b10 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61  (v, OP_Close, ta
18b20 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  b1, 0);.        
18b30 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
18b40 20 20 20 7d 0a 20 20 0a 20 20 23 69 66 6e 64 65     }.  .  #ifnde
18b50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
18b60 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70 2d  PLAIN.    if( p-
18b70 3e 70 4e 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20  >pNext==0 ){.   
18b80 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
18b90 6c 61 6e 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  lanPop(pParse);.
18ba0 20 20 20 20 7d 0a 20 20 23 65 6e 64 69 66 0a 20      }.  #endif. 
18bb0 20 7d 0a 20 20 0a 20 20 2f 2a 20 43 6f 6d 70 75   }.  .  /* Compu
18bc0 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
18bd0 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a  uences used by .
18be0 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74    ** temporary t
18bf0 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20  ables needed to 
18c00 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f  implement the co
18c10 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
18c20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b   ** Attach the K
18c30 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
18c40 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72   to all temporar
18c50 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  y tables..  **. 
18c60 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   ** This section
18c70 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20 72   is run by the r
18c80 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54  ight-most SELECT
18c90 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e   statement only.
18ca0 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  .  ** SELECT sta
18cb0 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c  tements to the l
18cc0 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20  eft always skip 
18cd0 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65 20  this part.  The 
18ce0 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20  right-most.  ** 
18cf0 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73  SELECT might als
18d00 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  o skip this part
18d10 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52   if it has no OR
18d20 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
18d30 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74  d.  ** no temp t
18d40 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69 72  ables are requir
18d50 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
18d60 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
18d70 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b  UsesEphemeral ){
18d80 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
18d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18da0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
18db0 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66  er */.    KeyInf
18dc0 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20  o *pKeyInfo;    
18dd0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
18de0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
18df0 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
18e00 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   */.    Select *
18e10 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20  pLoop;          
18e20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
18e30 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c  ping through SEL
18e40 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  ECT statements *
18e50 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a  /.    CollSeq **
18e60 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  apColl;         
18e70 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
18e80 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49  ng through pKeyI
18e90 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a  nfo->aColl[] */.
18ea0 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20      int nCol;   
18eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ec0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
18ed0 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74  olumns in result
18ee0 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73   set */..    ass
18ef0 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30  ert( p->pNext==0
18f00 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70   );.    nCol = p
18f10 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
18f20 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
18f30 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
18f40 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20 31 29  loc(db, nCol, 1)
18f50 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65 79 49  ;.    if( !pKeyI
18f60 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nfo ){.      rc 
18f70 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
18f80 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
18f90 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
18fa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
18fb0 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79  i=0, apColl=pKey
18fc0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e  Info->aColl; i<n
18fd0 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c  Col; i++, apColl
18fe0 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f  ++){.      *apCo
18ff0 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
19000 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
19010 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
19020 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20   0==*apColl ){. 
19030 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
19040 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
19050 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
19060 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20     for(pLoop=p; 
19070 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
19080 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  op->pPrior){.   
19090 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b     for(i=0; i<2;
190a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
190b0 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d  nt addr = pLoop-
190c0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d  >addrOpenEphm[i]
190d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64  ;.        if( ad
190e0 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  dr<0 ){.        
190f0 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75    /* If [0] is u
19100 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69  nused then [1] i
19110 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20  s also unused.  
19120 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20  So we can.      
19130 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61      ** always sa
19140 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f  fely abort as so
19150 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 20  on as the first 
19160 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66  unused slot is f
19170 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
19180 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d    assert( pLoop-
19190 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
191a0 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  <0 );.          
191b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
191c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
191d0 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
191e0 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20  addr, nCol);.   
191f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19200 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72  ChangeP4(v, addr
19210 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
19220 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
19230 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20  nfo),.          
19240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19250 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20    P4_KEYINFO);. 
19260 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64         pLoop->ad
19270 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20  drOpenEphm[i] = 
19280 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
19290 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79  }.    sqlite3Key
192a0 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e  InfoUnref(pKeyIn
192b0 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f  fo);.  }..multi_
192c0 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44  select_end:.  pD
192d0 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73  est->iSdst = des
192e0 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74  t.iSdst;.  pDest
192f0 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e  ->nSdst = dest.n
19300 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53  Sdst;.  sqlite3S
19310 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
19320 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75  pDelete);.  retu
19330 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
19340 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
19350 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
19360 2f 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 6d  /../*.** Error m
19370 65 73 73 61 67 65 20 66 6f 72 20 77 68 65 6e 20  essage for when 
19380 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  two or more term
19390 73 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  s of a compound 
193a0 73 65 6c 65 63 74 20 68 61 76 65 20 64 69 66 66  select have diff
193b0 65 72 65 6e 74 0a 2a 2a 20 73 69 7a 65 20 72 65  erent.** size re
193c0 73 75 6c 74 20 73 65 74 73 2e 0a 2a 2f 0a 76 6f  sult sets..*/.vo
193d0 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
193e0 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72  WrongNumTermsErr
193f0 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
19400 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
19410 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
19420 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20  & SF_Values ){. 
19430 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
19440 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20  sg(pParse, "all 
19450 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65  VALUES must have
19460 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
19470 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 7d   of terms");.  }
19480 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
19490 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
194a0 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68  , "SELECTs to th
194b0 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
194c0 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 22 20   of %s".      " 
194d0 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
194e0 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
194f0 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20  esult columns", 
19500 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
19510 6f 70 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  op));.  }.}../*.
19520 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75 74 70 75  ** Code an outpu
19530 74 20 73 75 62 72 6f 75 74 69 6e 65 20 66 6f 72  t subroutine for
19540 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70   a coroutine imp
19550 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
19560 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 6d  .** SELECT statm
19570 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ent..**.** The d
19580 61 74 61 20 74 6f 20 62 65 20 6f 75 74 70 75 74  ata to be output
19590 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
195a0 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68   pIn->iSdst.  Th
195b0 65 72 65 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e  ere are.** pIn->
195c0 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f  nSdst columns to
195d0 20 62 65 20 6f 75 74 70 75 74 2e 20 20 70 44 65   be output.  pDe
195e0 73 74 20 69 73 20 77 68 65 72 65 20 74 68 65 20  st is where the 
195f0 6f 75 74 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a  output should.**
19600 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   be sent..**.** 
19610 72 65 67 52 65 74 75 72 6e 20 69 73 20 74 68 65  regReturn is the
19620 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72   number of the r
19630 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
19640 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a  the subroutine.*
19650 2a 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  * return address
19660 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72  ..**.** If regPr
19670 65 76 3e 30 20 74 68 65 6e 20 69 74 20 69 73 20  ev>0 then it is 
19680 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
19690 65 72 20 69 6e 20 61 20 76 65 63 74 6f 72 20 74  er in a vector t
196a0 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74  hat.** records t
196b0 68 65 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70  he previous outp
196c0 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50 72 65 76  ut.  mem[regPrev
196d0 5d 20 69 73 20 61 20 66 6c 61 67 20 74 68 61 74  ] is a flag that
196e0 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20   is false.** if 
196f0 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 6e  there has been n
19700 6f 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  o previous outpu
19710 74 2e 20 20 49 66 20 72 65 67 50 72 65 76 3e 30  t.  If regPrev>0
19720 20 74 68 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a   then code is.**
19730 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 75   generated to su
19740 70 70 72 65 73 73 20 64 75 70 6c 69 63 61 74 65  ppress duplicate
19750 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20 69 73 20  s.  pKeyInfo is 
19760 75 73 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69  used for compari
19770 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a  ng.** keys..**.*
19780 2a 20 49 66 20 74 68 65 20 4c 49 4d 49 54 20 66  * If the LIMIT f
19790 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69  ound in p->iLimi
197a0 74 20 69 73 20 72 65 61 63 68 65 64 2c 20 6a 75  t is reached, ju
197b0 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  mp immediately t
197c0 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a  o.** iBreak..*/.
197d0 73 74 61 74 69 63 20 69 6e 74 20 67 65 6e 65 72  static int gener
197e0 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74  ateOutputSubrout
197f0 69 6e 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ine(.  Parse *pP
19800 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
19810 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
19820 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
19830 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
19840 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
19850 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65  tement */.  Sele
19860 63 74 44 65 73 74 20 2a 70 49 6e 2c 20 20 20 20  ctDest *pIn,    
19870 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65      /* Coroutine
19880 20 73 75 70 70 6c 79 69 6e 67 20 64 61 74 61 20   supplying data 
19890 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
198a0 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20  *pDest,      /* 
198b0 57 68 65 72 65 20 74 6f 20 73 65 6e 64 20 74 68  Where to send th
198c0 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
198d0 72 65 67 52 65 74 75 72 6e 2c 20 20 20 20 20 20  regReturn,      
198e0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
198f0 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
19900 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50  er */.  int regP
19910 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  rev,            
19920 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 65 73 75  /* Previous resu
19930 6c 74 20 72 65 67 69 73 74 65 72 2e 20 20 4e 6f  lt register.  No
19940 20 75 6e 69 71 75 65 6e 65 73 73 20 69 66 20 30   uniqueness if 0
19950 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
19960 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a  KeyInfo,      /*
19970 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 77   For comparing w
19980 69 74 68 20 70 72 65 76 69 6f 75 73 20 65 6e 74  ith previous ent
19990 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65  ry */.  int iBre
199a0 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ak              
199b0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
199c0 77 65 20 68 69 74 20 74 68 65 20 4c 49 4d 49 54  we hit the LIMIT
199d0 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
199e0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
199f0 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  ;.  int iContinu
19a00 65 3b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 0a  e;.  int addr;..
19a10 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
19a20 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
19a30 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e 75 65 20  v);.  iContinue 
19a40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
19a50 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
19a60 20 53 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   Suppress duplic
19a70 61 74 65 73 20 66 6f 72 20 55 4e 49 4f 4e 2c 20  ates for UNION, 
19a80 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
19a90 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20 20 69 66  RSECT .  */.  if
19aa0 28 20 72 65 67 50 72 65 76 20 29 7b 0a 20 20 20  ( regPrev ){.   
19ab0 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64 64 72   int addr1, addr
19ac0 32 3b 0a 20 20 20 20 61 64 64 72 31 20 3d 20 73  2;.    addr1 = s
19ad0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
19ae0 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65  (v, OP_IfNot, re
19af0 67 50 72 65 76 29 3b 20 56 64 62 65 43 6f 76 65  gPrev); VdbeCove
19b00 72 61 67 65 28 76 29 3b 0a 20 20 20 20 61 64 64  rage(v);.    add
19b10 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
19b20 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
19b30 70 61 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  pare, pIn->iSdst
19b40 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
19b50 2d 3e 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20  ->nSdst,.       
19b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b70 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71         (char*)sq
19b80 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
19b90 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45  pKeyInfo), P4_KE
19ba0 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
19bb0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
19bc0 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 32 2b   OP_Jump, addr2+
19bd0 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 61 64  2, iContinue, ad
19be0 64 72 32 2b 32 29 3b 20 56 64 62 65 43 6f 76 65  dr2+2); VdbeCove
19bf0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
19c00 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
19c10 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
19c20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19c30 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49  3(v, OP_Copy, pI
19c40 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65  n->iSdst, regPre
19c50 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d  v+1, pIn->nSdst-
19c60 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
19c70 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19c80 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50  Integer, 1, regP
19c90 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rev);.  }.  if( 
19ca0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
19cb0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
19cc0 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72  n 0;..  /* Suppr
19cd0 65 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46  ess the first OF
19ce0 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20  FSET entries if 
19cf0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53  there is an OFFS
19d00 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  ET clause.  */. 
19d10 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
19d20 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74  ->iOffset, iCont
19d30 69 6e 75 65 29 3b 0a 0a 20 20 61 73 73 65 72 74  inue);..  assert
19d40 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  ( pDest->eDest!=
19d50 53 52 54 5f 45 78 69 73 74 73 20 29 3b 0a 20 20  SRT_Exists );.  
19d60 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
19d70 44 65 73 74 21 3d 53 52 54 5f 54 61 62 6c 65 20  Dest!=SRT_Table 
19d80 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 44 65  );.  switch( pDe
19d90 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20  st->eDest ){.   
19da0 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
19db0 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
19dc0 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
19dd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
19de0 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
19df0 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20  .      int r1 = 
19e00 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
19e10 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
19e20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
19e30 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
19e40 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
19e50 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
19e60 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
19e70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
19e80 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20  nSdst, r1);.    
19e90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19ea0 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
19eb0 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  id, pDest->iSDPa
19ec0 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  rm, r2);.      s
19ed0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
19ee0 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
19ef0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
19f00 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  1, r2);.      sq
19f10 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
19f20 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
19f30 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ND);.      sqlit
19f40 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
19f50 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
19f60 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
19f70 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
19f80 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
19f90 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
19fa0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
19fb0 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
19fc0 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
19fd0 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
19fe0 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
19ff0 2e 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  ...)"..    */.  
1a000 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
1a010 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a  {.      int r1;.
1a020 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a030 70 49 6e 2d 3e 6e 53 64 73 74 3e 31 20 29 3b 0a  pIn->nSdst>1 );.
1a040 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1a050 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
1a060 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1a070 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1a080 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
1a090 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
1a0a0 3e 6e 53 64 73 74 2c 20 0a 20 20 20 20 20 20 20  >nSdst, .       
1a0b0 20 20 20 72 31 2c 20 70 44 65 73 74 2d 3e 7a 41     r1, pDest->zA
1a0c0 66 66 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  ffSdst, pIn->nSd
1a0d0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
1a0e0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
1a0f0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
1a100 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
1a110 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
1a120 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a130 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
1a140 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53  nsert, pDest->iS
1a150 44 50 61 72 6d 2c 20 72 31 2c 0a 20 20 20 20 20  DParm, r1,.     
1a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a170 20 20 20 20 20 20 70 49 6e 2d 3e 69 53 64 73 74        pIn->iSdst
1a180 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
1a190 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
1a1a0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1a1b0 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
1a1c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1a1d0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
1a1e0 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68  scalar select th
1a1f0 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e  at is part of an
1a200 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
1a210 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74  n.    ** store t
1a220 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
1a230 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65  e appropriate me
1a240 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72  mory cell and br
1a250 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f  eak out.    ** o
1a260 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  f the scan loop.
1a270 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1a280 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20   SRT_Mem: {.    
1a290 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e    assert( pIn->n
1a2a0 53 64 73 74 3d 3d 31 20 7c 7c 20 70 50 61 72 73  Sdst==1 || pPars
1a2b0 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 20 20 74 65  e->nErr>0 );  te
1a2c0 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53 64  stcase( pIn->nSd
1a2d0 73 74 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  st!=1 );.      s
1a2e0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
1a2f0 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ve(pParse, pIn->
1a300 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53  iSdst, pDest->iS
1a310 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  DParm, 1);.     
1a320 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
1a330 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f  ause will jump o
1a340 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66  ut of the loop f
1a350 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
1a360 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1a370 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
1a380 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1a390 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68  RY */..    /* Th
1a3a0 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73 74  e results are st
1a3b0 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e  ored in a sequen
1a3c0 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a  ce of registers.
1a3d0 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
1a3e0 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e  at pDest->iSdst.
1a3f0 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f    Then the co-ro
1a400 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20  utine yields..  
1a410 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
1a420 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20  T_Coroutine: {. 
1a430 20 20 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e       if( pDest->
1a440 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iSdst==0 ){.    
1a450 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74      pDest->iSdst
1a460 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1a470 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  pRange(pParse, p
1a480 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
1a490 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74      pDest->nSdst
1a4a0 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20   = pIn->nSdst;. 
1a4b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1a4c0 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
1a4d0 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
1a4e0 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73  dst, pDest->iSds
1a4f0 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
1a500 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a510 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
1a520 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  eld, pDest->iSDP
1a530 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  arm);.      brea
1a540 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1a550 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
1a560 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20  above, then the 
1a570 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69  result destinati
1a580 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a  on must be.    *
1a590 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54  * SRT_Output.  T
1a5a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
1a5b0 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68  ever called with
1a5c0 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a   any other.    *
1a5d0 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74  * destination ot
1a5e0 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  her than the one
1a5f0 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20  s handled above 
1a600 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20  or SRT_Output.. 
1a610 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
1a620 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73   SRT_Output, res
1a630 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
1a640 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
1a650 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20   registers.  .  
1a660 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50    ** Then the OP
1a670 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64  _ResultRow opcod
1a680 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 75  e is used to cau
1a690 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  se sqlite3_step(
1a6a0 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75  ) to.    ** retu
1a6b0 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  rn the next row 
1a6c0 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a  of result..    *
1a6d0 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
1a6e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a6f0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
1a700 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
1a710 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a720 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
1a730 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  ow, pIn->iSdst, 
1a740 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
1a750 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1a760 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1a770 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
1a780 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
1a790 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a7a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1a7b0 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
1a7c0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
1a7d0 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
1a7e0 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hed..  */.  if( 
1a7f0 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
1a800 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a810 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
1a820 70 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74  pZero, p->iLimit
1a830 2c 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43  , iBreak); VdbeC
1a840 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
1a850 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
1a860 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
1a870 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  turn.  */.  sqli
1a880 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1a890 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65  bel(v, iContinue
1a8a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1a8b0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
1a8c0 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b  urn, regReturn);
1a8d0 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ..  return addr;
1a8e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e  .}../*.** Altern
1a8f0 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73  ative compound s
1a900 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72  elect code gener
1a910 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77  ator for cases w
1a920 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  hen there.** is 
1a930 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
1a940 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73  se..**.** We ass
1a950 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74  ume a query of t
1a960 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
1a970 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73  m:.**.**      <s
1a980 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74  electA>  <operat
1a990 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20  or>  <selectB>  
1a9a0 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62  ORDER BY <orderb
1a9b0 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70  ylist>.**.** <op
1a9c0 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f  erator> is one o
1a9d0 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49  f UNION ALL, UNI
1a9e0 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
1a9f0 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69  NTERSECT.  The i
1aa00 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64  dea.** is to cod
1aa10 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e  e both <selectA>
1aa20 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77   and <selectB> w
1aa30 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ith the ORDER BY
1aa40 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f   clause as.** co
1aa50 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e  -routines.  Then
1aa60 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74   run the co-rout
1aa70 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c  ines in parallel
1aa80 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72   and merge the r
1aa90 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74  esults.** into t
1aaa0 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61  he output.  In a
1aab0 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74  ddition to the t
1aac0 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63  wo coroutines (c
1aad0 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e  alled selectA an
1aae0 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68  d.** selectB) th
1aaf0 65 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75  ere are 7 subrou
1ab00 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tines:.**.**    
1ab10 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68  outA:    Move th
1ab20 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
1ab30 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e  selectA coroutin
1ab40 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
1ab50 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1ab60 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
1ab70 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20   query..**.**   
1ab80 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74   outB:    Move t
1ab90 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
1aba0 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69   selectB corouti
1abb0 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ne into the outp
1abc0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
1abd0 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e    of the compoun
1abe0 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20  d query.  (Only 
1abf0 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e  generated for UN
1ac00 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ION and.**      
1ac10 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
1ac20 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e  .  EXCEPT and IN
1ac30 53 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f  SERTSECT never o
1ac40 75 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74  utput a row that
1ac50 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1ac60 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20  appears only in 
1ac70 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74  B.).**.**    Alt
1ac80 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
1ac90 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
1aca0 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
1acb0 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a  ines and A<B..**
1acc0 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20  .**    AeqB:    
1acd0 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
1ace0 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
1acf0 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
1ad00 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20  nd A==B..**.**  
1ad10 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65    AgtB:    Calle
1ad20 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
1ad30 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
1ad40 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e  oroutines and A>
1ad50 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41  B..**.**    EofA
1ad60 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
1ad70 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
1ad80 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e  ed from selectA.
1ad90 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20  .**.**    EofB: 
1ada0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
1adb0 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
1adc0 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a   from selectB..*
1add0 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
1ade0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  ntation of the l
1adf0 61 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f  atter five subro
1ae00 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e  utines depend on
1ae10 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72   which .** <oper
1ae20 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a  ator> is used:.*
1ae30 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  *.**.**         
1ae40 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20      UNION ALL   
1ae50 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20        UNION     
1ae60 20 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20         EXCEPT   
1ae70 20 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54         INTERSECT
1ae80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  .**          ---
1ae90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
1aea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
1aeb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
1aec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1aed0 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75  .**   AltB:   ou
1aee0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
1aef0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
1af00 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
1af10 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a       nextA.**.**
1af20 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c     AeqB:   outA,
1af30 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
1af40 65 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20  extA            
1af50 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f   nextA         o
1af60 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a  utA, nextA.**.**
1af70 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c     AgtB:   outB,
1af80 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
1af90 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
1afa0 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
1afb0 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20    nextB.**.**   
1afc0 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65  EofA:   outB, ne
1afd0 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
1afe0 65 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61  extB          ha
1aff0 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68  lt             h
1b000 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42  alt.**.**   EofB
1b010 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
1b020 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
1b030 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
1b040 74 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a  tA         halt.
1b050 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74  **.** In the Alt
1b060 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74  B, AeqB, and Agt
1b070 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61  B subroutines, a
1b080 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f  n EOF on A follo
1b090 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61  wing nextA.** ca
1b0a0 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  uses an immediat
1b0b0 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61  e jump to EofA a
1b0c0 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66  nd an EOF on B f
1b0d0 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63  ollowing nextB c
1b0e0 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65  auses.** an imme
1b0f0 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
1b100 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41  fB.  Within EofA
1b110 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45   and EofB, and E
1b120 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a  OF on entry or.*
1b130 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  * following next
1b140 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20  X causes a jump 
1b150 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1b160 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73  e select process
1b170 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69  ing..**.** Dupli
1b180 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20  cate removal in 
1b190 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  the UNION, EXCEP
1b1a0 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
1b1b0 20 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65   cases is handle
1b1c0 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  d.** within the 
1b1d0 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
1b1e0 65 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20  e.  The regPrev 
1b1f0 72 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c  register set hol
1b200 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  ds the previousl
1b210 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75  y.** output valu
1b220 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e  e.  A comparison
1b230 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74   is made against
1b240 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20   this value and 
1b250 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73  the output.** is
1b260 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
1b270 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75  next results wou
1b280 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ld be the same a
1b290 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a  s the previous..
1b2a0 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  **.** The implem
1b2b0 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73  entation plan is
1b2c0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
1b2d0 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
1b2e0 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75   and seven.** su
1b2f0 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c  broutines first,
1b300 20 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f   then put the co
1b310 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74  ntrol logic at t
1b320 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65  he bottom.  Like
1b330 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1b340 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a        goto Init.
1b350 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f  **     coA: coro
1b360 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71  utine for left q
1b370 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20  uery (A).**     
1b380 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66  coB: coroutine f
1b390 6f 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28  or right query (
1b3a0 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f  B).**    outA: o
1b3b0 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
1b3c0 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f   A.**    outB: o
1b3d0 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
1b3e0 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e   B (UNION and UN
1b3f0 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a  ION ALL only).**
1b400 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a      EofA: ....**
1b410 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a      EofB: ....**
1b420 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a      AltB: ....**
1b430 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a      AeqB: ....**
1b440 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a      AgtB: ....**
1b450 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61      Init: initia
1b460 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72  lize coroutine r
1b470 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20  egisters.**     
1b480 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a       yield coA.*
1b490 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
1b4a0 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a  f(A) goto EofA.*
1b4b0 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64  *          yield
1b4c0 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20   coB.**         
1b4d0 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20   if eof(B) goto 
1b4e0 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a  EofB.**    Cmpr:
1b4f0 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a   Compare A, B.**
1b500 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41            Jump A
1b510 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a  ltB, AeqB, AgtB.
1b520 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a  **     End: ....
1b530 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c  **.** We call Al
1b540 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20  tB, AeqB, AgtB, 
1b550 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22  EofA, and EofB "
1b560 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74  subroutines" but
1b570 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a   they are not.**
1b580 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64   actually called
1b590 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64   using Gosub and
1b5a0 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74   they do not Ret
1b5b0 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45  urn.  EofA and E
1b5c0 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69  ofB loop.** unti
1b5d0 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78  l all data is ex
1b5e0 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d  hausted then jum
1b5f0 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c  p to the "end" l
1b600 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42  abe.  AltB, AeqB
1b610 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75  ,.** and AgtB ju
1b620 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20  mp to either L2 
1b630 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66  or to one of Eof
1b640 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69  A or EofB..*/.#i
1b650 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b660 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
1b670 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  T.static int mul
1b680 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
1b690 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1b6a0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
1b6b0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1b6c0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
1b6d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
1b6e0 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
1b6f0 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
1b700 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
1b710 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
1b720 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
1b730 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
1b740 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
1b750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1b760 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
1b770 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
1b780 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
1b790 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
1b7a0 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
1b7b0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
1b7c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
1b7d0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
1b7e0 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65  his VDBE */.  Se
1b7f0 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20  lectDest destA; 
1b800 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
1b810 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
1b820 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65   A */.  SelectDe
1b830 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a  st destB;     /*
1b840 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
1b850 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a   coroutine B */.
1b860 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20    int regAddrA; 
1b870 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1b880 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
1b890 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69  select-A corouti
1b8a0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41  ne */.  int regA
1b8b0 64 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  ddrB;         /*
1b8c0 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
1b8d0 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20 63  r for select-B c
1b8e0 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
1b8f0 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20  t addrSelectA;  
1b900 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1b910 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63  f the select-A c
1b920 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
1b930 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20  t addrSelectB;  
1b940 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1b950 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63  f the select-B c
1b960 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  oroutine */.  in
1b970 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20  t regOutA;      
1b980 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
1b990 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20  egister for the 
1b9a0 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74  output-A subrout
1b9b0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
1b9c0 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f  OutB;          /
1b9d0 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
1b9e0 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
1b9f0 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-B subroutine *
1ba00 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41  /.  int addrOutA
1ba10 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
1ba20 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
1ba30 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
1ba40 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74  */.  int addrOut
1ba50 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64  B = 0;     /* Ad
1ba60 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dress of the out
1ba70 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
1ba80 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
1ba90 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  fA;         /* A
1baa0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
1bab0 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64  lect-A-exhausted
1bac0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1bad0 20 69 6e 74 20 61 64 64 72 45 6f 66 41 5f 6e 6f   int addrEofA_no
1bae0 42 3b 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e  B;     /* Altern
1baf0 61 74 65 20 61 64 64 72 45 6f 66 41 20 69 66 20  ate addrEofA if 
1bb00 42 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a  B is uninitializ
1bb10 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ed */.  int addr
1bb20 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofB;         /*
1bb30 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
1bb40 73 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74  select-B-exhaust
1bb50 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
1bb60 0a 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b  .  int addrAltB;
1bb70 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1bb80 65 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73  ess of the A<B s
1bb90 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1bba0 6e 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20  nt addrAeqB;    
1bbb0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1bbc0 6f 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72  of the A==B subr
1bbd0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1bbe0 61 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20  addrAgtB;       
1bbf0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1bc00 74 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69  the A>B subrouti
1bc10 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c  ne */.  int regL
1bc20 69 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a  imitA;        /*
1bc30 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20   Limit register 
1bc40 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a  for select-A */.
1bc50 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b    int regLimitB;
1bc60 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74          /* Limit
1bc70 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
1bc80 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20  lect-A */.  int 
1bc90 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20  regPrev;        
1bca0 20 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20    /* A range of 
1bcb0 72 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c  registers to hol
1bcc0 64 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75  d previous outpu
1bcd0 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  t */.  int saved
1bce0 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  Limit;       /* 
1bcf0 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70  Saved value of p
1bd00 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e  ->iLimit */.  in
1bd10 74 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20  t savedOffset;  
1bd20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c      /* Saved val
1bd30 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74  ue of p->iOffset
1bd40 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43   */.  int labelC
1bd50 6d 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  mpr;        /* L
1bd60 61 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61  abel for the sta
1bd70 72 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20  rt of the merge 
1bd80 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69  algorithm */.  i
1bd90 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20  nt labelEnd;    
1bda0 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
1bdb0 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
1bdc0 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20   overall SELECT 
1bdd0 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 61 64  stmt */.  int ad
1bde0 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
1bdf0 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74  /* Jump instruct
1be00 69 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65  ions that get re
1be10 74 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69  targetted */.  i
1be20 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
1be30 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54       /* One of T
1be40 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c  K_ALL, TK_UNION,
1be50 20 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49   TK_EXCEPT, TK_I
1be60 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65  NTERSECT */.  Ke
1be70 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d  yInfo *pKeyDup =
1be80 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f   0; /* Compariso
1be90 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
1bea0 72 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f  r duplicate remo
1beb0 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  val */.  KeyInfo
1bec0 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f   *pKeyMerge;   /
1bed0 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
1bee0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72  ormation for mer
1bef0 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73  ging rows */.  s
1bf00 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
1bf10 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1bf20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
1bf30 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
1bf40 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy;   /* The OR
1bf50 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
1bf60 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
1bf70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1bf80 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
1bf90 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1bfa0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  se */.  int *aPe
1bfb0 72 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  rmute;        /*
1bfc0 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52   Mapping from OR
1bfd0 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20  DER BY terms to 
1bfe0 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d  result set colum
1bff0 6e 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ns */..  assert(
1c000 20 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20   p->pOrderBy!=0 
1c010 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
1c020 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d  yDup==0 ); /* "M
1c030 61 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65  anaged" code nee
1c040 64 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74  ds this.  Ticket
1c050 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20   #3382. */.  db 
1c060 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1c070 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1c080 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
1c090 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c  0 );       /* Al
1c0a0 72 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65  ready thrown the
1c0b0 20 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61   error if VDBE a
1c0c0 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20  lloc failed */. 
1c0d0 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69   labelEnd = sqli
1c0e0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1c0f0 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72  (v);.  labelCmpr
1c100 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
1c110 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20  keLabel(v);...  
1c120 2f 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20  /* Patch up the 
1c130 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
1c140 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f    */.  op = p->o
1c150 70 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20  p;  .  pPrior = 
1c160 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  p->pPrior;.  ass
1c170 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72  ert( pPrior->pOr
1c180 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f  derBy==0 );.  pO
1c190 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
1c1a0 65 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20  erBy;.  assert( 
1c1b0 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f  pOrderBy );.  nO
1c1c0 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
1c1d0 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20  y->nExpr;..  /* 
1c1e0 46 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74  For operators ot
1c1f0 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41  her than UNION A
1c200 4c 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61  LL we have to ma
1c210 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a  ke sure that.  *
1c220 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
1c230 6c 61 75 73 65 20 63 6f 76 65 72 73 20 65 76 65  lause covers eve
1c240 72 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72  ry term of the r
1c250 65 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a  esult set.  Add.
1c260 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68    ** terms to th
1c270 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1c280 65 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  e as necessary..
1c290 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54    */.  if( op!=T
1c2a0 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72  K_ALL ){.    for
1c2b0 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63  (i=1; db->malloc
1c2c0 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d  Failed==0 && i<=
1c2d0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
1c2e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
1c2f0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1c300 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
1c310 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
1c320 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e  pOrderBy->a; j<n
1c330 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49  OrderBy; j++, pI
1c340 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
1c350 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75  assert( pItem->u
1c360 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
1c370 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1c380 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
1c390 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61  rByCol==i ) brea
1c3a0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1c3b0 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79   if( j==nOrderBy
1c3c0 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
1c3d0 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
1c3e0 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45  Expr(db, TK_INTE
1c3f0 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  GER, 0);.       
1c400 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
1c410 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1c420 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
1c430 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
1c440 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20  EP_IntValue;.   
1c450 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61       pNew->u.iVa
1c460 6c 75 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  lue = i;.       
1c470 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
1c480 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
1c490 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1c4a0 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
1c4b0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
1c4c0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
1c4d0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64  pOrderBy->a[nOrd
1c4e0 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64  erBy++].u.x.iOrd
1c4f0 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69  erByCol = (u16)i
1c500 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c510 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
1c520 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
1c530 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64   permutation and
1c540 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69 73   keyinfo that is
1c550 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a 20   used with.  ** 
1c560 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  the permutation 
1c570 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
1c580 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20 20  e if the next.  
1c590 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  ** row of result
1c5a0 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c  s comes from sel
1c5b0 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42 2e  ectA or selectB.
1c5c0 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c 69    Also add expli
1c5d0 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  cit.  ** collati
1c5e0 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  ons to the ORDER
1c5f0 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73   BY clause terms
1c600 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68   so that when th
1c610 65 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 2a  e subqueries.  *
1c620 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 61  * to the right a
1c630 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72 65 20  nd the left are 
1c640 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79 20  evaluated, they 
1c650 75 73 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  use the correct.
1c660 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a    ** collation..
1c670 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65 20    */.  aPermute 
1c680 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1c690 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f  cRawNN(db, sizeo
1c6a0 66 28 69 6e 74 29 2a 28 6e 4f 72 64 65 72 42 79  f(int)*(nOrderBy
1c6b0 20 2b 20 31 29 29 3b 0a 20 20 69 66 28 20 61 50   + 1));.  if( aP
1c6c0 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74  ermute ){.    st
1c6d0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1c6e0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 61  em *pItem;.    a
1c6f0 50 65 72 6d 75 74 65 5b 30 5d 20 3d 20 6e 4f 72  Permute[0] = nOr
1c700 64 65 72 42 79 3b 0a 20 20 20 20 66 6f 72 28 69  derBy;.    for(i
1c710 3d 31 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =1, pItem=pOrder
1c720 42 79 2d 3e 61 3b 20 69 3c 3d 6e 4f 72 64 65 72  By->a; i<=nOrder
1c730 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  By; i++, pItem++
1c740 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1c750 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
1c760 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  erByCol>0 );.   
1c770 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
1c780 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
1c790 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  l<=p->pEList->nE
1c7a0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65  xpr );.      aPe
1c7b0 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d  rmute[i] = pItem
1c7c0 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
1c7d0 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  l - 1;.    }.   
1c7e0 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c   pKeyMerge = mul
1c7f0 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
1c800 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
1c810 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 1);.  }else{. 
1c820 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30     pKeyMerge = 0
1c830 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74  ;.  }..  /* Reat
1c840 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  tach the ORDER B
1c850 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  Y clause to the 
1c860 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d  query..  */.  p-
1c870 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
1c880 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  erBy;.  pPrior->
1c890 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
1c8a0 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50  e3ExprListDup(pP
1c8b0 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72  arse->db, pOrder
1c8c0 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c  By, 0);..  /* Al
1c8d0 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f  locate a range o
1c8e0 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  f temporary regi
1c8f0 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65  sters and the Ke
1c900 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a  yInfo needed.  *
1c910 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20  * for the logic 
1c920 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70  that removes dup
1c930 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f  licate result ro
1c940 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a  ws when the.  **
1c950 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
1c960 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
1c970 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f  NTERSECT (but no
1c980 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20  t UNION ALL)..  
1c990 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
1c9a0 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72  ALL ){.    regPr
1c9b0 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ev = 0;.  }else{
1c9c0 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  .    int nExpr =
1c9d0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
1c9e0 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  r;.    assert( n
1c9f0 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c  OrderBy>=nExpr |
1ca00 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1ca10 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65  ed );.    regPre
1ca20 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  v = pParse->nMem
1ca30 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
1ca40 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b  nMem += nExpr+1;
1ca50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ca60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
1ca70 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76  eger, 0, regPrev
1ca80 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d  );.    pKeyDup =
1ca90 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
1caa0 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20  lloc(db, nExpr, 
1cab0 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79  1);.    if( pKey
1cac0 44 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Dup ){.      ass
1cad0 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
1cae0 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
1caf0 4b 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20  KeyDup) );.     
1cb00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
1cb10 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
1cb20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b   pKeyDup->aColl[
1cb30 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  i] = multiSelect
1cb40 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1cb50 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70  p, i);.        p
1cb60 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64  KeyDup->aSortOrd
1cb70 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  er[i] = 0;.     
1cb80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20   }.    }.  }. . 
1cb90 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65   /* Separate the
1cba0 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69   left and the ri
1cbb0 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f  ght query from o
1cbc0 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a  ne another.  */.
1cbd0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
1cbe0 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  .  pPrior->pNext
1cbf0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52   = 0;.  sqlite3R
1cc00 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
1cc10 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  By(pParse, p, p-
1cc20 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
1cc30 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f  R");.  if( pPrio
1cc40 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a  r->pPrior==0 ){.
1cc50 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
1cc60 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
1cc70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70  Parse, pPrior, p
1cc80 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c  Prior->pOrderBy,
1cc90 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a   "ORDER");.  }..
1cca0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
1ccb0 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73   limit registers
1ccc0 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d   */.  computeLim
1ccd0 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
1cce0 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29  se, p, labelEnd)
1ccf0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
1cd00 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  t && op==TK_ALL 
1cd10 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41  ){.    regLimitA
1cd20 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1cd30 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42  m;.    regLimitB
1cd40 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1cd50 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
1cd60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
1cd70 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20  opy, p->iOffset 
1cd80 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a  ? p->iOffset+1 :
1cd90 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20   p->iLimit,.    
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1cdc0 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71  gLimitA);.    sq
1cdd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1cde0 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c  v, OP_Copy, regL
1cdf0 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42  imitA, regLimitB
1ce00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1ce10 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c  regLimitA = regL
1ce20 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20  imitB = 0;.  }. 
1ce30 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1ce40 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
1ce50 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  );.  p->pLimit =
1ce60 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20   0;..  regAddrA 
1ce70 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1ce80 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20 2b  ;.  regAddrB = +
1ce90 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1cea0 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61   regOutA = ++pPa
1ceb0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
1cec0 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  OutB = ++pParse-
1ced0 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  >nMem;.  sqlite3
1cee0 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
1cef0 64 65 73 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75  destA, SRT_Corou
1cf00 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 29 3b  tine, regAddrA);
1cf10 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1cf20 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 42 2c  DestInit(&destB,
1cf30 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20   SRT_Coroutine, 
1cf40 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 45 78  regAddrB);..  Ex
1cf50 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
1cf60 70 50 61 72 73 65 2c 20 31 2c 20 22 4d 45 52 47  pParse, 1, "MERG
1cf70 45 20 28 25 73 29 22 2c 20 73 65 6c 65 63 74 4f  E (%s)", selectO
1cf80 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29 3b 0a  pName(p->op)));.
1cf90 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1cfa0 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76   coroutine to ev
1cfb0 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43  aluate the SELEC
1cfc0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74  T statement to t
1cfd0 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20  he.  ** left of 
1cfe0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65  the compound ope
1cff0 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20  rator - the "A" 
1d000 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61  select..  */.  a
1d010 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c  ddrSelectA = sql
1d020 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1d030 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 61 64  ddr(v) + 1;.  ad
1d040 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
1d050 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
1d060 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  itCoroutine, reg
1d070 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72 53 65  AddrA, 0, addrSe
1d080 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65 43 6f  lectA);.  VdbeCo
1d090 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66 74 20  mment((v, "left 
1d0a0 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72  SELECT"));.  pPr
1d0b0 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65  ior->iLimit = re
1d0c0 67 4c 69 6d 69 74 41 3b 0a 20 20 45 78 70 6c 61  gLimitA;.  Expla
1d0d0 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
1d0e0 72 73 65 2c 20 31 2c 20 22 4c 45 46 54 22 29 29  rse, 1, "LEFT"))
1d0f0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1d100 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
1d110 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c  , &destA);.  sql
1d120 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75  ite3VdbeEndCorou
1d130 74 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72 41  tine(v, regAddrA
1d140 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1d150 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
1d160 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  1);..  /* Genera
1d170 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74  te a coroutine t
1d180 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53  o evaluate the S
1d190 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1d1a0 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67  on .  ** the rig
1d1b0 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c  ht - the "B" sel
1d1c0 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53  ect.  */.  addrS
1d1d0 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33  electB = sqlite3
1d1e0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1d1f0 76 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20  v) + 1;.  addr1 
1d200 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1d210 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
1d220 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
1d230 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74  B, 0, addrSelect
1d240 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  B);.  VdbeCommen
1d250 74 28 28 76 2c 20 22 72 69 67 68 74 20 53 45 4c  t((v, "right SEL
1d260 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c  ECT"));.  savedL
1d270 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
1d280 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74 20  ;.  savedOffset 
1d290 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  = p->iOffset;.  
1d2a0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c  p->iLimit = regL
1d2b0 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66  imitB;.  p->iOff
1d2c0 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 45 78 70  set = 0;  .  Exp
1d2d0 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
1d2e0 50 61 72 73 65 2c 20 31 2c 20 22 52 49 47 48 54  Parse, 1, "RIGHT
1d2f0 22 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  "));.  sqlite3Se
1d300 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
1d310 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c  &destB);.  p->iL
1d320 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69  imit = savedLimi
1d330 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20  t;.  p->iOffset 
1d340 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20  = savedOffset;. 
1d350 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
1d360 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 41  oroutine(v, regA
1d370 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  ddrB);..  /* Gen
1d380 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
1d390 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
1d3a0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
1d3b0 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65  of the A.  ** se
1d3c0 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
1d3d0 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
1d3e0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
1d3f0 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  ct..  */.  VdbeN
1d400 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1d410 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
1d420 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f  or A"));.  addrO
1d430 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utA = generateOu
1d440 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
1d450 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
1d460 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
1d470 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  A, pDest, regOut
1d480 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  A,.             
1d490 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
1d4a0 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  yDup, labelEnd);
1d4b0 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  .  .  /* Generat
1d4c0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
1d4d0 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
1d4e0 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
1d4f0 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he B.  ** select
1d500 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
1d510 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
1d520 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
1d530 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
1d540 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
1d550 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62  UNION ){.    Vdb
1d560 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
1d570 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65   "Output routine
1d580 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61   for B"));.    a
1d590 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61  ddrOutB = genera
1d5a0 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
1d5b0 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  ne(pParse,.     
1d5c0 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26              p, &
1d5d0 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65  destB, pDest, re
1d5e0 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20  gOutB,.         
1d5f0 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c          regPrev,
1d600 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45   pKeyDup, labelE
1d610 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nd);.  }.  sqlit
1d620 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
1d630 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47  KeyDup);..  /* G
1d640 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
1d650 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
1d660 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
1d670 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20  m select A.  ** 
1d680 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
1d690 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
1d6a0 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e  elect B remains.
1d6b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1d6c0 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d  TK_EXCEPT || op=
1d6d0 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
1d6e0 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f  .    addrEofA_no
1d6f0 42 20 3d 20 61 64 64 72 45 6f 66 41 20 3d 20 6c  B = addrEofA = l
1d700 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65  abelEnd;.  }else
1d710 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  {  .    VdbeNoop
1d720 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
1d730 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -A subroutine"))
1d740 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d  ;.    addrEofA =
1d750 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d760 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1d770 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74  regOutB, addrOut
1d780 42 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41  B);.    addrEofA
1d790 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33 56 64  _noB = sqlite3Vd
1d7a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
1d7b0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20  ield, regAddrB, 
1d7c0 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 20  labelEnd);.     
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7f0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1d800 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d810 47 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 41  Goto(v, addrEofA
1d820 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  );.    p->nSelec
1d830 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  tRow = sqlite3Lo
1d840 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65  gEstAdd(p->nSele
1d850 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e  ctRow, pPrior->n
1d860 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 7d 0a  SelectRow);.  }.
1d870 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1d880 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
1d890 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
1d8a0 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
1d8b0 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  B.  ** are exhau
1d8c0 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
1d8d0 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72  ta in select A r
1d8e0 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  emains..  */.  i
1d8f0 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  f( op==TK_INTERS
1d900 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45  ECT ){.    addrE
1d910 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a  ofB = addrEofA;.
1d920 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
1d930 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e  ctRow > pPrior->
1d940 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e  nSelectRow ) p->
1d950 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
1d960 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
1d970 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20  .  }else{  .    
1d980 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1d990 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f  (v, "eof-B subro
1d9a0 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
1d9b0 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33  drEofB = sqlite3
1d9c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d9d0 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
1d9e0 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20   addrOutA);.    
1d9f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1da00 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1da10 65 67 41 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e  egAddrA, labelEn
1da20 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  d); VdbeCoverage
1da30 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
1da40 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
1da50 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  EofB);.  }..  /*
1da60 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1da70 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
1da80 65 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20  e of A<B.  */.  
1da90 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
1daa0 28 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72  (v, "A-lt-B subr
1dab0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
1dac0 72 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAltB = sqlite3V
1dad0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1dae0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20  Gosub, regOutA, 
1daf0 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c  addrOutA);.  sql
1db00 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1db10 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1db20 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b  ddrA, addrEofA);
1db30 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1db40 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  ;.  sqlite3VdbeG
1db50 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72  oto(v, labelCmpr
1db60 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1db70 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
1db80 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d   the case of A==
1db90 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  B.  */.  if( op=
1dba0 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61  =TK_ALL ){.    a
1dbb0 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
1dbc0 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  tB;.  }else if( 
1dbd0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
1dbe0 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
1dbf0 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20   = addrAltB;.   
1dc00 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d   addrAltB++;.  }
1dc10 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f  else{.    VdbeNo
1dc20 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
1dc30 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -eq-B subroutine
1dc40 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71  "));.    addrAeq
1dc50 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56  B =.    sqlite3V
1dc60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1dc70 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1dc80 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65   addrEofA); Vdbe
1dc90 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
1dca0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
1dcb0 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a  (v, labelCmpr);.
1dcc0 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
1dcd0 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
1dce0 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e  e the case of A>
1dcf0 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
1dd00 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
1dd10 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  gt-B subroutine"
1dd20 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d  ));.  addrAgtB =
1dd30 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1dd40 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66  entAddr(v);.  if
1dd50 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ( op==TK_ALL || 
1dd60 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
1dd70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1dd80 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1dd90 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72  b, regOutB, addr
1dda0 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  OutB);.  }.  sql
1ddb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ddc0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
1ddd0 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b  ddrB, addrEofB);
1dde0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1ddf0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  ;.  sqlite3VdbeG
1de00 6f 74 6f 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72  oto(v, labelCmpr
1de10 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  );..  /* This co
1de20 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20  de runs once to 
1de30 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79  initialize every
1de40 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71  thing..  */.  sq
1de50 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1de60 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 73  e(v, addr1);.  s
1de70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1de80 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
1de90 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41  gAddrA, addrEofA
1dea0 5f 6e 6f 42 29 3b 20 56 64 62 65 43 6f 76 65 72  _noB); VdbeCover
1deb0 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65  age(v);.  sqlite
1dec0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ded0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1dee0 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64  B, addrEofB); Vd
1def0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
1df00 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74    /* Implement t
1df10 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f  he main merge lo
1df20 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
1df30 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1df40 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  l(v, labelCmpr);
1df50 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1df60 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75  dOp4(v, OP_Permu
1df70 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c  tation, 0, 0, 0,
1df80 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65   (char*)aPermute
1df90 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a  , P4_INTARRAY);.
1dfa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1dfb0 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op4(v, OP_Compar
1dfc0 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c 20  e, destA.iSdst, 
1dfd0 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72  destB.iSdst, nOr
1dfe0 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e000 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65  (char*)pKeyMerge
1e010 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
1e020 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1e030 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50  geP5(v, OPFLAG_P
1e040 45 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69 74  ERMUTE);.  sqlit
1e050 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1e060 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74  OP_Jump, addrAlt
1e070 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64 64  B, addrAeqB, add
1e080 72 41 67 74 42 29 3b 20 56 64 62 65 43 6f 76 65  rAgtB); VdbeCove
1e090 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 4a  rage(v);..  /* J
1e0a0 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20  ump to the this 
1e0b0 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  point in order t
1e0c0 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
1e0d0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71  query..  */.  sq
1e0e0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
1e0f0 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e  Label(v, labelEn
1e100 64 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65  d);..  /* Reasse
1e110 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e  mbly the compoun
1e120 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74 20  d query so that 
1e130 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  it will be freed
1e140 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20   correctly.  ** 
1e150 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
1e160 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28  unction */.  if(
1e170 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
1e180 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1e190 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72  elete(db, p->pPr
1e1a0 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ior);.  }.  p->p
1e1b0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
1e1c0 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20    pPrior->pNext 
1e1d0 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44  = p;..  /*** TBD
1e1e0 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75  :  Insert subrou
1e1f0 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c  tine calls to cl
1e200 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69  ose cursors on i
1e210 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a  ncomplete.  ****
1e220 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a   subqueries ****
1e230 2f 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79  /.  ExplainQuery
1e240 50 6c 61 6e 50 6f 70 28 70 50 61 72 73 65 29 3b  PlanPop(pParse);
1e250 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
1e260 2d 3e 6e 45 72 72 21 3d 30 3b 0a 7d 0a 23 65 6e  ->nErr!=0;.}.#en
1e270 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
1e280 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1e290 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
1e2a0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1e2b0 56 49 45 57 29 0a 0a 2f 2a 20 41 6e 20 69 6e 73  VIEW)../* An ins
1e2c0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 53 75 62  tance of the Sub
1e2d0 73 74 43 6f 6e 74 65 78 74 20 6f 62 6a 65 63 74  stContext object
1e2e0 20 64 65 73 63 72 69 62 65 73 20 61 6e 20 73 75   describes an su
1e2f0 62 73 74 69 74 75 74 69 6f 6e 20 65 64 69 74 0a  bstitution edit.
1e300 2a 2a 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d  ** to be perform
1e310 65 64 20 6f 6e 20 61 20 70 61 72 73 65 20 74 72  ed on a parse tr
1e320 65 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 72 65  ee..**.** All re
1e330 66 65 72 65 6e 63 65 73 20 74 6f 20 63 6f 6c 75  ferences to colu
1e340 6d 6e 73 20 69 6e 20 74 61 62 6c 65 20 69 54 61  mns in table iTa
1e350 62 6c 65 20 61 72 65 20 74 6f 20 62 65 20 72 65  ble are to be re
1e360 70 6c 61 63 65 64 20 62 79 20 63 6f 72 72 65 73  placed by corres
1e370 70 6f 6e 64 69 6e 67 0a 2a 2a 20 65 78 70 72 65  ponding.** expre
1e380 73 73 69 6f 6e 73 20 69 6e 20 70 45 4c 69 73 74  ssions in pEList
1e390 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
1e3a0 75 63 74 20 53 75 62 73 74 43 6f 6e 74 65 78 74  uct SubstContext
1e3b0 20 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72   {.  Parse *pPar
1e3c0 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  se;            /
1e3d0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
1e3e0 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
1e3f0 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
1e400 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 20       /* Replace 
1e410 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
1e420 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  is table */.  in
1e430 74 20 69 4e 65 77 54 61 62 6c 65 3b 20 20 20 20  t iNewTable;    
1e440 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74          /* New t
1e450 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  able number */. 
1e460 20 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 3b   int isLeftJoin;
1e470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1e480 64 20 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f 57  d TK_IF_NULL_ROW
1e490 20 6f 70 63 6f 64 65 73 20 6f 6e 20 65 61 63 68   opcodes on each
1e4a0 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 2a 2f 0a   replacement */.
1e4b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1e4c0 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52  st;         /* R
1e4d0 65 70 6c 61 63 65 6d 65 6e 74 20 65 78 70 72 65  eplacement expre
1e4e0 73 73 69 6f 6e 73 20 2a 2f 0a 7d 20 53 75 62 73  ssions */.} Subs
1e4f0 74 43 6f 6e 74 65 78 74 3b 0a 0a 2f 2a 20 46 6f  tContext;../* Fo
1e500 72 77 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f  rward Declaratio
1e510 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ns */.static voi
1e520 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
1e530 53 75 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 45  SubstContext*, E
1e540 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69  xprList*);.stati
1e550 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65  c void substSele
1e560 63 74 28 53 75 62 73 74 43 6f 6e 74 65 78 74 2a  ct(SubstContext*
1e570 2c 20 53 65 6c 65 63 74 2a 2c 20 69 6e 74 29 3b  , Select*, int);
1e580 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72  ../*.** Scan thr
1e590 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73  ough the express
1e5a0 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c  ion pExpr.  Repl
1e5b0 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65  ace every refere
1e5c0 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75  nce to.** a colu
1e5d0 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62  mn in table numb
1e5e0 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61  er iTable with a
1e5f0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f   copy of the iCo
1e600 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79  lumn-th.** entry
1e610 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75   in pEList.  (Bu
1e620 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63  t leave referenc
1e630 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20  es to the ROWID 
1e640 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61  column .** uncha
1e650 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69  nged.).**.** Thi
1e660 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
1e670 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e  t of the flatten
1e680 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20  ing procedure.  
1e690 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68  A subquery.** wh
1e6a0 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  ose result set i
1e6b0 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c  s defined by pEL
1e6c0 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65  ist appears as e
1e6d0 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46  ntry in the.** F
1e6e0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
1e6f0 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74  SELECT such that
1e700 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   the VDBE cursor
1e710 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61   assigned to tha
1e720 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65  t.** FORM clause
1e730 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65   entry is iTable
1e740 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1e750 6d 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73  makes the necess
1e760 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  ary .** changes 
1e770 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74  to pExpr so that
1e780 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63   it refers direc
1e790 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63  tly to the sourc
1e7a0 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68  e table.** of th
1e7b0 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65  e subquery rathe
1e7c0 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
1e7d0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1e7e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
1e7f0 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20 53   *substExpr(.  S
1e800 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75  ubstContext *pSu
1e810 62 73 74 2c 20 20 2f 2a 20 44 65 73 63 72 69 70  bst,  /* Descrip
1e820 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73  tion of the subs
1e830 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  titution */.  Ex
1e840 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
1e850 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20       /* Expr in 
1e860 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69  which substituti
1e870 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a  on occurs */.){.
1e880 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
1e890 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1e8a0 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
1e8b0 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
1e8c0 6f 69 6e 29 0a 20 20 20 26 26 20 70 45 78 70 72  oin).   && pExpr
1e8d0 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
1e8e0 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c  e==pSubst->iTabl
1e8f0 65 0a 20 20 29 7b 0a 20 20 20 20 70 45 78 70 72  e.  ){.    pExpr
1e900 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
1e910 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77  e = pSubst->iNew
1e920 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  Table;.  }.  if(
1e930 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
1e940 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e  OLUMN && pExpr->
1e950 69 54 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e  iTable==pSubst->
1e960 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66  iTable ){.    if
1e970 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
1e980 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  <0 ){.      pExp
1e990 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b  r->op = TK_NULL;
1e9a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e9b0 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
1e9c0 20 20 20 20 45 78 70 72 20 2a 70 43 6f 70 79 20      Expr *pCopy 
1e9d0 3d 20 70 53 75 62 73 74 2d 3e 70 45 4c 69 73 74  = pSubst->pEList
1e9e0 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ->a[pExpr->iColu
1e9f0 6d 6e 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  mn].pExpr;.     
1ea00 20 45 78 70 72 20 69 66 4e 75 6c 6c 52 6f 77 3b   Expr ifNullRow;
1ea10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ea20 53 75 62 73 74 2d 3e 70 45 4c 69 73 74 21 3d 30  Subst->pEList!=0
1ea30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
1ea40 6d 6e 3c 70 53 75 62 73 74 2d 3e 70 45 4c 69 73  mn<pSubst->pELis
1ea50 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
1ea60 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
1ea70 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
1ea80 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
1ea90 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1eaa0 65 33 45 78 70 72 49 73 56 65 63 74 6f 72 28 70  e3ExprIsVector(p
1eab0 43 6f 70 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Copy) ){.       
1eac0 20 73 71 6c 69 74 65 33 56 65 63 74 6f 72 45 72   sqlite3VectorEr
1ead0 72 6f 72 4d 73 67 28 70 53 75 62 73 74 2d 3e 70  rorMsg(pSubst->p
1eae0 50 61 72 73 65 2c 20 70 43 6f 70 79 29 3b 0a 20  Parse, pCopy);. 
1eaf0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1eb00 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
1eb10 3d 20 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65  = pSubst->pParse
1eb20 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 69 66  ->db;.        if
1eb30 28 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74  ( pSubst->isLeft
1eb40 4a 6f 69 6e 20 26 26 20 70 43 6f 70 79 2d 3e 6f  Join && pCopy->o
1eb50 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p!=TK_COLUMN ){.
1eb60 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
1eb70 28 26 69 66 4e 75 6c 6c 52 6f 77 2c 20 30 2c 20  (&ifNullRow, 0, 
1eb80 73 69 7a 65 6f 66 28 69 66 4e 75 6c 6c 52 6f 77  sizeof(ifNullRow
1eb90 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
1eba0 4e 75 6c 6c 52 6f 77 2e 6f 70 20 3d 20 54 4b 5f  NullRow.op = TK_
1ebb0 49 46 5f 4e 55 4c 4c 5f 52 4f 57 3b 0a 20 20 20  IF_NULL_ROW;.   
1ebc0 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77         ifNullRow
1ebd0 2e 70 4c 65 66 74 20 3d 20 70 43 6f 70 79 3b 0a  .pLeft = pCopy;.
1ebe0 20 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c            ifNull
1ebf0 52 6f 77 2e 69 54 61 62 6c 65 20 3d 20 70 53 75  Row.iTable = pSu
1ec00 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a  bst->iNewTable;.
1ec10 20 20 20 20 20 20 20 20 20 20 70 43 6f 70 79 20            pCopy 
1ec20 3d 20 26 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20  = &ifNullRow;.  
1ec30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ec40 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
1ec50 70 72 44 75 70 28 64 62 2c 20 70 43 6f 70 79 2c  prDup(db, pCopy,
1ec60 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
1ec70 20 70 4e 65 77 20 26 26 20 70 53 75 62 73 74 2d   pNew && pSubst-
1ec80 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20  >isLeftJoin ){. 
1ec90 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74           ExprSet
1eca0 50 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45  Property(pNew, E
1ecb0 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 3b 0a 20 20  P_CanBeNull);.  
1ecc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ecd0 69 66 28 20 70 4e 65 77 20 26 26 20 45 78 70 72  if( pNew && Expr
1ece0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1ecf0 72 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  r,EP_FromJoin) )
1ed00 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
1ed10 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
1ed20 65 20 3d 20 70 45 78 70 72 2d 3e 69 52 69 67 68  e = pExpr->iRigh
1ed30 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 20 20 20 20  tJoinTable;.    
1ed40 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f        ExprSetPro
1ed50 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 46  perty(pNew, EP_F
1ed60 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20  romJoin);.      
1ed70 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
1ed80 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1ed90 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
1eda0 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a    pExpr = pNew;.
1edb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1edc0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
1edd0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 46 5f  Expr->op==TK_IF_
1ede0 4e 55 4c 4c 5f 52 4f 57 20 26 26 20 70 45 78 70  NULL_ROW && pExp
1edf0 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 53 75 62 73  r->iTable==pSubs
1ee00 74 2d 3e 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  t->iTable ){.   
1ee10 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
1ee20 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e 65 77 54   = pSubst->iNewT
1ee30 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
1ee40 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73  pExpr->pLeft = s
1ee50 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1ee60 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
1ee70 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
1ee80 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 70 53  t = substExpr(pS
1ee90 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  ubst, pExpr->pRi
1eea0 67 68 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78  ght);.    if( Ex
1eeb0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
1eec0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
1eed0 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73  t) ){.      subs
1eee0 74 53 65 6c 65 63 74 28 70 53 75 62 73 74 2c 20  tSelect(pSubst, 
1eef0 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
1ef00 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 1);.    }else{
1ef10 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
1ef20 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 45 78  List(pSubst, pEx
1ef30 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
1ef40 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ef50 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69 63   pExpr;.}.static
1ef60 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c   void substExprL
1ef70 69 73 74 28 0a 20 20 53 75 62 73 74 43 6f 6e 74  ist(.  SubstCont
1ef80 65 78 74 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20  ext *pSubst, /* 
1ef90 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
1efa0 68 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  he substitution 
1efb0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1efc0 4c 69 73 74 20 20 20 20 20 20 20 2f 2a 20 4c 69  List       /* Li
1efd0 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69  st to scan and i
1efe0 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20  n which to make 
1eff0 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 29  substitutes */.)
1f000 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1f010 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1f020 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
1f030 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
1f040 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  ++){.    pList->
1f050 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62  a[i].pExpr = sub
1f060 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1f070 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
1f080 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
1f090 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
1f0a0 28 0a 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74  (.  SubstContext
1f0b0 20 2a 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73   *pSubst, /* Des
1f0c0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
1f0d0 73 75 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a  substitution */.
1f0e0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
1f0f0 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
1f100 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77  T statement in w
1f110 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
1f120 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20 20  stitutions */.  
1f130 69 6e 74 20 64 6f 50 72 69 6f 72 20 20 20 20 20  int doPrior     
1f140 20 20 20 20 20 20 2f 2a 20 44 6f 20 73 75 62 73        /* Do subs
1f150 74 69 74 75 74 65 73 20 6f 6e 20 70 2d 3e 70 50  titutes on p->pP
1f160 72 69 6f 72 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20  rior too */.){. 
1f170 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a   SrcList *pSrc;.
1f180 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1f190 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1f1a0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20  int i;.  if( !p 
1f1b0 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 6f 7b 0a  ) return;.  do{.
1f1c0 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1f1d0 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 45 4c  t(pSubst, p->pEL
1f1e0 69 73 74 29 3b 0a 20 20 20 20 73 75 62 73 74 45  ist);.    substE
1f1f0 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1f200 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20 20  p->pGroupBy);.  
1f210 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1f220 70 53 75 62 73 74 2c 20 70 2d 3e 70 4f 72 64 65  pSubst, p->pOrde
1f230 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 48 61  rBy);.    p->pHa
1f240 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72  ving = substExpr
1f250 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 48 61 76  (pSubst, p->pHav
1f260 69 6e 67 29 3b 0a 20 20 20 20 70 2d 3e 70 57 68  ing);.    p->pWh
1f270 65 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28  ere = substExpr(
1f280 70 53 75 62 73 74 2c 20 70 2d 3e 70 57 68 65 72  pSubst, p->pWher
1f290 65 29 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  e);.    pSrc = p
1f2a0 2d 3e 70 53 72 63 3b 0a 20 20 20 20 61 73 73 65  ->pSrc;.    asse
1f2b0 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
1f2c0 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e     for(i=pSrc->n
1f2d0 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d  Src, pItem=pSrc-
1f2e0 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
1f2f0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75  tem++){.      su
1f300 62 73 74 53 65 6c 65 63 74 28 70 53 75 62 73 74  bstSelect(pSubst
1f310 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
1f320 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
1f330 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46  pItem->fg.isTabF
1f340 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73  unc ){.        s
1f350 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1f360 62 73 74 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70  bst, pItem->u1.p
1f370 46 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 20 20  FuncArg);.      
1f380 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  }.    }.  }while
1f390 28 20 64 6f 50 72 69 6f 72 20 26 26 20 28 70 20  ( doPrior && (p 
1f3a0 3d 20 70 2d 3e 70 50 72 69 6f 72 29 21 3d 30 20  = p->pPrior)!=0 
1f3b0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  );.}.#endif /* !
1f3c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1f3d0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1f3e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1f3f0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
1f400 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1f410 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1f420 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1f430 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1f440 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1f450 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ine attempts to 
1f460 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72 69  flatten subqueri
1f470 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61  es as a performa
1f480 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  nce optimization
1f490 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
1f4a0 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20 69  e returns 1 if i
1f4b0 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73 20  t makes changes 
1f4c0 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61 74  and 0 if no flat
1f4d0 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a 2a  tening occurs..*
1f4e0 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74 61  *.** To understa
1f4f0 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20 6f  nd the concept o
1f500 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63 6f  f flattening, co
1f510 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1f520 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a  wing.** query:.*
1f530 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
1f540 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78  a FROM (SELECT x
1f550 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20  +y AS a FROM t1 
1f560 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48 45  WHERE z<100) WHE
1f570 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  RE a>5.**.** The
1f580 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66 20   default way of 
1f590 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68 69  implementing thi
1f5a0 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65 78  s query is to ex
1f5b0 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75 62  ecute the.** sub
1f5c0 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64 20  query first and 
1f5d0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
1f5e0 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  s in a temporary
1f5f0 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20   table, then.** 
1f600 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  run the outer qu
1f610 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d 70  ery on that temp
1f620 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54 68  orary table.  Th
1f630 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f 0a  is requires two.
1f640 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20 74  ** passes over t
1f650 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68 65  he data.  Furthe
1f660 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20 74  rmore, because t
1f670 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
1f680 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e 64  le.** has no ind
1f690 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45 20  ices, the WHERE 
1f6a0 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f 75  clause on the ou
1f6b0 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f 74  ter query cannot
1f6c0 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65 64   be.** optimized
1f6d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1f6e0 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
1f6f0 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65 73   rewrite queries
1f700 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62 6f   such as the abo
1f710 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ve into.** a sin
1f720 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74 2c  gle flat select,
1f730 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1f740 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 79  *     SELECT x+y
1f750 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48   AS a FROM t1 WH
1f760 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61 3e  ERE z<100 AND a>
1f770 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  5.**.** The code
1f780 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 74   generated for t
1f790 68 69 73 20 73 69 6d 70 6c 69 66 69 63 61 74 69  his simplificati
1f7a0 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
1f7b0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
1f7c0 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
1f7d0 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
1f7e0 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
1f7f0 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
1f800 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
1f810 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
1f820 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
1f830 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
1f840 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
1f850 74 74 65 6e 69 6e 67 20 69 73 20 73 75 62 6a 65  ttening is subje
1f860 63 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  ct to the follow
1f870 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 73 3a  ing constraints:
1f880 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65  .**.**  (**)  We
1f890 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d   no longer attem
1f8a0 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67  pt to flatten ag
1f8b0 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69  gregate subqueri
1f8c0 65 73 2e 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20  es. Was:.**     
1f8d0 20 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20     The subquery 
1f8e0 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
1f8f0 65 72 79 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20  ery cannot both 
1f900 62 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  be aggregates..*
1f910 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e  *.**  (**)  We n
1f920 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74  o longer attempt
1f930 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72   to flatten aggr
1f940 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73  egate subqueries
1f950 2e 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20  . Was:.**       
1f960 20 28 32 29 20 49 66 20 74 68 65 20 73 75 62 71   (2) If the subq
1f970 75 65 72 79 20 69 73 20 61 6e 20 61 67 67 72 65  uery is an aggre
1f980 67 61 74 65 20 74 68 65 6e 0a 2a 2a 20 20 20 20  gate then.**    
1f990 20 20 20 20 28 32 61 29 20 74 68 65 20 6f 75 74      (2a) the out
1f9a0 65 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f  er query must no
1f9b0 74 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a  t be a join and.
1f9c0 2a 2a 20 20 20 20 20 20 20 20 28 32 62 29 20 74  **        (2b) t
1f9d0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
1f9e0 75 73 74 20 6e 6f 74 20 75 73 65 20 73 75 62 71  ust not use subq
1f9f0 75 65 72 69 65 73 0a 2a 2a 20 20 20 20 20 20 20  ueries.**       
1fa00 20 20 20 20 20 20 6f 74 68 65 72 20 74 68 61 6e        other than
1fa10 20 74 68 65 20 6f 6e 65 20 46 52 4f 4d 2d 63 6c   the one FROM-cl
1fa20 61 75 73 65 20 73 75 62 71 75 65 72 79 20 74 68  ause subquery th
1fa30 61 74 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  at is a candidat
1fa40 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
1fa50 20 66 6f 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e   for flattening.
1fa60 20 20 28 54 68 69 73 20 69 73 20 64 75 65 20 74    (This is due t
1fa70 6f 20 74 69 63 6b 65 74 20 5b 32 66 37 31 37 30  o ticket [2f7170
1fa80 64 37 33 62 66 39 61 62 66 38 30 5d 0a 2a 2a 20  d73bf9abf80].** 
1fa90 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d              from
1faa0 20 32 30 31 35 2d 30 32 2d 30 39 2e 29 0a 2a 2a   2015-02-09.).**
1fab0 0a 2a 2a 20 20 20 28 33 29 20 20 49 66 20 74 68  .**   (3)  If th
1fac0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68  e subquery is th
1fad0 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1fae0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74  of a LEFT JOIN t
1faf0 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 33  hen.**        (3
1fb00 61 29 20 74 68 65 20 73 75 62 71 75 65 72 79 20  a) the subquery 
1fb10 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69  may not be a joi
1fb20 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  n and.**        
1fb30 28 33 62 29 20 74 68 65 20 46 52 4f 4d 20 63 6c  (3b) the FROM cl
1fb40 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
1fb50 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 63 6f 6e  uery may not con
1fb60 74 61 69 6e 20 61 20 76 69 72 74 75 61 6c 0a 2a  tain a virtual.*
1fb70 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 74 61  *             ta
1fb80 62 6c 65 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ble and.**      
1fb90 20 20 28 33 63 29 20 74 68 65 20 6f 75 74 65 72    (3c) the outer
1fba0 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62   query may not b
1fbb0 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 0a  e an aggregate..
1fbc0 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65  **.**   (4)  The
1fbd0 20 73 75 62 71 75 65 72 79 20 63 61 6e 20 6e 6f   subquery can no
1fbe0 74 20 62 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a  t be DISTINCT..*
1fbf0 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f  *.**  (**)  At o
1fc00 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63  ne point restric
1fc10 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35  tions (4) and (5
1fc20 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73  ) defined a subs
1fc30 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a  et of DISTINCT.*
1fc40 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65  *        sub-que
1fc50 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65  ries that were e
1fc60 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69  xcluded from thi
1fc70 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  s optimization. 
1fc80 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20  Restriction .** 
1fc90 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73         (4) has s
1fca0 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64  ince been expand
1fcb0 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c  ed to exclude al
1fcc0 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75  l DISTINCT subqu
1fcd0 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  eries..**.**  (*
1fce0 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72  *)  We no longer
1fcf0 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74   attempt to flat
1fd00 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75  ten aggregate su
1fd10 62 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a  bqueries.  Was:.
1fd20 2a 2a 20 20 20 20 20 20 20 20 49 66 20 74 68 65  **        If the
1fd30 20 73 75 62 71 75 65 72 79 20 69 73 20 61 67 67   subquery is agg
1fd40 72 65 67 61 74 65 2c 20 74 68 65 20 6f 75 74 65  regate, the oute
1fd50 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
1fd60 62 65 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a  be DISTINCT..**.
1fd70 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75  **   (7)  The su
1fd80 62 71 75 65 72 79 20 6d 75 73 74 20 68 61 76 65  bquery must have
1fd90 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20   a FROM clause. 
1fda0 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71   TODO:  For subq
1fdb0 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a  ueries without.*
1fdc0 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20  *        A FROM 
1fdd0 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72  clause, consider
1fde0 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63   adding a FROM c
1fdf0 6c 61 75 73 65 20 77 69 74 68 20 74 68 65 20 73  lause with the s
1fe00 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20  pecial.**       
1fe10 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e   table sqlite_on
1fe20 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  ce that consists
1fe30 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77   of a single row
1fe40 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a   containing a.**
1fe50 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e          single N
1fe60 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29  ULL..**.**   (8)
1fe70 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1fe80 79 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65  y uses LIMIT the
1fe90 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1fea0 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a  y may not be a j
1feb0 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29  oin..**.**   (9)
1fec0 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1fed0 79 20 75 73 65 73 20 4c 49 4d 49 54 20 74 68 65  y uses LIMIT the
1fee0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1fef0 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 67 67  y may not be agg
1ff00 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  regate..**.**  (
1ff10 2a 2a 29 20 20 52 65 73 74 72 69 63 74 69 6f 6e  **)  Restriction
1ff20 20 28 31 30 29 20 77 61 73 20 72 65 6d 6f 76 65   (10) was remove
1ff30 64 20 66 72 6f 6d 20 74 68 65 20 63 6f 64 65 20  d from the code 
1ff40 6f 6e 20 32 30 30 35 2d 30 32 2d 30 35 20 62 75  on 2005-02-05 bu
1ff50 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 61  t we.**        a
1ff60 63 63 69 64 65 6e 74 6c 79 20 63 61 72 72 69 65  ccidently carrie
1ff70 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 66 6f  d the comment fo
1ff80 72 77 61 72 64 20 75 6e 74 69 6c 20 32 30 31 34  rward until 2014
1ff90 2d 30 39 2d 31 35 2e 20 20 4f 72 69 67 69 6e 61  -09-15.  Origina
1ffa0 6c 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6e 73  l.**        cons
1ffb0 74 72 61 69 6e 74 3a 20 22 49 66 20 74 68 65 20  traint: "If the 
1ffc0 73 75 62 71 75 65 72 79 20 69 73 20 61 67 67 72  subquery is aggr
1ffd0 65 67 61 74 65 20 74 68 65 6e 20 74 68 65 20 6f  egate then the o
1ffe0 75 74 65 72 20 71 75 65 72 79 20 0a 2a 2a 20 20  uter query .**  
1fff0 20 20 20 20 20 20 6d 61 79 20 6e 6f 74 20 75 73        may not us
20000 65 20 4c 49 4d 49 54 2e 22 0a 2a 2a 0a 2a 2a 20  e LIMIT.".**.** 
20010 20 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75   (11)  The subqu
20020 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65  ery and the oute
20030 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
20040 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52 20  both have ORDER 
20050 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  BY clauses..**.*
20060 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70  *  (**)  Not imp
20070 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75  lemented.  Subsu
20080 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63  med into restric
20090 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70  tion (3).  Was p
200a0 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20  reviously.**    
200b0 20 20 20 20 61 20 73 65 70 61 72 61 74 65 20 72      a separate r
200c0 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76  estriction deriv
200d0 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20  ing from ticket 
200e0 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33  #350..**.**  (13
200f0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
20100 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79 20  and outer query 
20110 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20 75 73 65  may not both use
20120 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28   LIMIT..**.**  (
20130 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  14)  The subquer
20140 79 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4f 46  y may not use OF
20150 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35  FSET..**.**  (15
20160 29 20 20 49 66 20 74 68 65 20 6f 75 74 65 72 20  )  If the outer 
20170 71 75 65 72 79 20 69 73 20 70 61 72 74 20 6f 66  query is part of
20180 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
20190 63 74 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ct, then the.** 
201a0 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20         subquery 
201b0 6d 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  may not use LIMI
201c0 54 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65  T..**        (Se
201d0 65 20 74 69 63 6b 65 74 20 23 32 33 33 39 20 61  e ticket #2339 a
201e0 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65  nd ticket [02a8e
201f0 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20  81d44])..**.**  
20200 28 31 36 29 20 20 49 66 20 74 68 65 20 6f 75 74  (16)  If the out
20210 65 72 20 71 75 65 72 79 20 69 73 20 61 67 67 72  er query is aggr
20220 65 67 61 74 65 2c 20 74 68 65 6e 20 74 68 65 20  egate, then the 
20230 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
20240 0a 2a 2a 20 20 20 20 20 20 20 20 75 73 65 20 4f  .**        use O
20250 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65  RDER BY.  (Ticke
20260 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75  t #2942)  This u
20270 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65  sed to not matte
20280 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69  r.**        unti
20290 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20  l we introduced 
202a0 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  the group_concat
202b0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a  () function.  .*
202c0 2a 0a 2a 2a 20 20 28 31 37 29 20 20 49 66 20 74  *.**  (17)  If t
202d0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
202e0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
202f0 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  , then.**       
20300 20 28 31 37 61 29 20 61 6c 6c 20 63 6f 6d 70 6f   (17a) all compo
20310 75 6e 64 20 6f 70 65 72 61 74 6f 72 73 20 6d 75  und operators mu
20320 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c  st be a UNION AL
20330 4c 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  L, and.**       
20340 20 28 31 37 62 29 20 6e 6f 20 74 65 72 6d 73 20   (17b) no terms 
20350 77 69 74 68 69 6e 20 74 68 65 20 73 75 62 71 75  within the subqu
20360 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20 6d 61 79  ery compound may
20370 20 62 65 20 61 67 67 72 65 67 61 74 65 0a 2a 2a   be aggregate.**
20380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72                or
20390 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 0a 2a   DISTINCT, and.*
203a0 2a 20 20 20 20 20 20 20 20 28 31 37 63 29 20 65  *        (17c) e
203b0 76 65 72 79 20 74 65 72 6d 20 77 69 74 68 69 6e  very term within
203c0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63 6f   the subquery co
203d0 6d 70 6f 75 6e 64 20 6d 75 73 74 20 68 61 76 65  mpound must have
203e0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a   a FROM clause.*
203f0 2a 20 20 20 20 20 20 20 20 28 31 37 64 29 20 74  *        (17d) t
20400 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d  he outer query m
20410 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20  ay not be.**    
20420 20 20 20 20 20 20 20 20 20 20 28 31 37 64 31 29            (17d1)
20430 20 61 67 67 72 65 67 61 74 65 2c 20 6f 72 0a 2a   aggregate, or.*
20440 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  *              (
20450 31 37 64 32 29 20 44 49 53 54 49 4e 43 54 2c 20  17d2) DISTINCT, 
20460 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
20470 20 20 20 28 31 37 64 33 29 20 61 20 6a 6f 69 6e     (17d3) a join
20480 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54  ..**.**        T
20490 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75  he parent and su
204a0 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74  b-query may cont
204b0 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65  ain WHERE clause
204c0 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a  s. Subject to.**
204d0 20 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31          rules (1
204e0 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34  1), (13) and (14
204f0 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f  ), they may also
20500 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42   contain ORDER B
20510 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d  Y,.**        LIM
20520 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c  IT and OFFSET cl
20530 61 75 73 65 73 2e 20 20 54 68 65 20 73 75 62 71  auses.  The subq
20540 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20  uery cannot use 
20550 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  any compound.** 
20560 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20         operator 
20570 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e  other than UNION
20580 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c   ALL because all
20590 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f   the other compo
205a0 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70  und.**        op
205b0 65 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20  erators have an 
205c0 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54  implied DISTINCT
205d0 20 77 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c   which is disall
205e0 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20  owed by.**      
205f0 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34    restriction (4
20600 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  )..**.**        
20610 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f  Also, each compo
20620 6e 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d  nent of the sub-
20630 71 75 65 72 79 20 6d 75 73 74 20 72 65 74 75 72  query must retur
20640 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
20650 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72  r.**        of r
20660 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54  esult columns. T
20670 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20  his is actually 
20680 61 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f  a requirement fo
20690 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a  r any compound.*
206a0 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
206b0 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61  statement, but a
206c0 6c 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  ll the code here
206d0 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75   does is make su
206e0 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20  re that no.**   
206f0 20 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67       such (illeg
20700 61 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69 73  al) sub-query is
20710 20 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20   flattened. The 
20720 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65  caller will dete
20730 63 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ct the.**       
20740 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e   syntax error an
20750 64 20 72 65 74 75 72 6e 20 61 20 64 65 74 61 69  d return a detai
20760 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a  led message..**.
20770 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65  **  (18)  If the
20780 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
20790 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
207a0 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20   then all terms 
207b0 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  of the.**       
207c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
207d0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d   of the parent m
207e0 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65  ust be simple re
207f0 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20  ferences to .** 
20800 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f         columns o
20810 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e  f the sub-query.
20820 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 49 66  .**.**  (19)  If
20830 20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73   the subquery us
20840 65 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68  es LIMIT then th
20850 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61  e outer query ma
20860 79 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20  y not.**        
20870 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c 61  have a WHERE cla
20880 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29  use..**.**  (20)
20890 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65    If the sub-que
208a0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
208b0 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74   select, then it
208c0 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a   must not use.**
208d0 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52          an ORDER
208e0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63   BY clause.  Tic
208f0 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65 20 63  ket #3773.  We c
20900 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20  ould relax this 
20910 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20  constraint.**   
20920 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79       somewhat by
20930 20 73 61 79 69 6e 67 20 74 68 61 74 20 74 68 65   saying that the
20940 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
20950 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75  DER BY clause mu
20960 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70  st.**        app
20970 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65  ear as unmodifie
20980 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  d result columns
20990 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
209a0 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20  ery.  But we.** 
209b0 20 20 20 20 20 20 20 68 61 76 65 20 6f 74 68 65         have othe
209c0 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  r optimizations 
209d0 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20  in mind to deal 
209e0 77 69 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a  with that case..
209f0 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 49 66 20  **.**  (21)  If 
20a00 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
20a10 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
20a20 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
20a30 20 6e 6f 74 20 62 65 0a 2a 2a 20 20 20 20 20 20   not be.**      
20a40 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65    DISTINCT.  (Se
20a50 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36  e ticket [752e16
20a60 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  46fc])..**.**  (
20a70 32 32 29 20 20 54 68 65 20 73 75 62 71 75 65 72  22)  The subquer
20a80 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 72  y may not be a r
20a90 65 63 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a  ecursive CTE..**
20aa0 0a 2a 2a 20 20 28 2a 2a 29 20 20 53 75 62 73 75  .**  (**)  Subsu
20ab0 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63  med into restric
20ac0 74 69 6f 6e 20 28 31 37 64 33 29 2e 20 20 57 61  tion (17d3).  Wa
20ad0 73 3a 20 49 66 20 74 68 65 20 6f 75 74 65 72 20  s: If the outer 
20ae0 71 75 65 72 79 20 69 73 0a 2a 2a 20 20 20 20 20  query is.**     
20af0 20 20 20 61 20 72 65 63 75 72 73 69 76 65 20 43     a recursive C
20b00 54 45 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62  TE, then the sub
20b10 2d 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62  -query may not b
20b20 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  e a compound que
20b30 72 79 2e 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  ry..**        Th
20b40 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 69  is restriction i
20b50 73 20 62 65 63 61 75 73 65 20 74 72 61 6e 73 66  s because transf
20b60 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20  orming the.**   
20b70 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20 61       parent to a
20b80 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
20b90 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f 64  confuses the cod
20ba0 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a  e that handles.*
20bb0 2a 20 20 20 20 20 20 20 20 72 65 63 75 72 73 69  *        recursi
20bc0 76 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d 75  ve queries in mu
20bd0 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a  ltiSelect()..**.
20be0 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20  **  (**)  We no 
20bf0 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74  longer attempt t
20c00 6f 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67  o flatten aggreg
20c10 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20  ate subqueries. 
20c20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20   Was:.**        
20c30 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  The subquery may
20c40 20 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65   not be an aggre
20c50 67 61 74 65 20 74 68 61 74 20 75 73 65 73 20 74  gate that uses t
20c60 68 65 20 62 75 69 6c 74 2d 69 6e 20 6d 69 6e 28  he built-in min(
20c70 29 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  ) or .**        
20c80 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
20c90 6e 73 2e 20 20 28 57 69 74 68 6f 75 74 20 74 68  ns.  (Without th
20ca0 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 2c 20  is restriction, 
20cb0 61 20 71 75 65 72 79 20 6c 69 6b 65 3a 0a 2a 2a  a query like:.**
20cc0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
20cd0 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 6d  x FROM (SELECT m
20ce0 61 78 28 79 29 2c 20 78 20 46 52 4f 4d 20 74 31  ax(y), x FROM t1
20cf0 29 22 20 77 6f 75 6c 64 20 6e 6f 74 20 6e 65 63  )" would not nec
20d00 65 73 73 61 72 69 6c 79 0a 2a 2a 20 20 20 20 20  essarily.**     
20d10 20 20 20 72 65 74 75 72 6e 20 74 68 65 20 76 61     return the va
20d20 6c 75 65 20 58 20 66 6f 72 20 77 68 69 63 68 20  lue X for which 
20d30 59 20 77 61 73 20 6d 61 78 69 6d 61 6c 2e 29 0a  Y was maximal.).
20d40 2a 2a 0a 2a 2a 20 20 28 32 35 29 20 20 49 66 20  **.**  (25)  If 
20d50 65 69 74 68 65 72 20 74 68 65 20 73 75 62 71 75  either the subqu
20d60 65 72 79 20 6f 72 20 74 68 65 20 70 61 72 65 6e  ery or the paren
20d70 74 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73  t query contains
20d80 20 61 20 77 69 6e 64 6f 77 0a 2a 2a 20 20 20 20   a window.**    
20d90 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20      function in 
20da0 74 68 65 20 73 65 6c 65 63 74 20 6c 69 73 74 20  the select list 
20db0 6f 72 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  or ORDER BY clau
20dc0 73 65 2c 20 66 6c 61 74 74 65 6e 69 6e 67 0a 2a  se, flattening.*
20dd0 2a 20 20 20 20 20 20 20 20 69 73 20 6e 6f 74 20  *        is not 
20de0 61 74 74 65 6d 70 74 65 64 2e 0a 2a 2a 0a 2a 2a  attempted..**.**
20df0 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
20e00 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
20e10 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
20e20 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
20e30 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
20e40 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
20e50 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
20e60 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
20e70 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
20e80 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
20e90 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
20ea0 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
20eb0 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
20ec0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
20ed0 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
20ee0 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
20ef0 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
20f00 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
20f10 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
20f20 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
20f30 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
20f40 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
20f50 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
20f60 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
20f70 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
20f80 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
20f90 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
20fa0 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
20fb0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
20fc0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
20fd0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
20fe0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
20ff0 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72  /* The parent or
21000 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74   outer SELECT st
21010 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
21020 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
21030 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d    /* Index in p-
21040 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68  >pSrc->a[] of th
21050 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79  e inner subquery
21060 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 20   */.  int isAgg 
21070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
21080 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45  ue if outer SELE
21090 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74  CT uses aggregat
210a0 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
210b0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
210c0 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
210d0 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
210e0 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65  hContext;.  Sele
210f0 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20  ct *pParent;    
21100 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e  /* Current UNION
21110 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65   ALL term of the
21120 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a   other query */.
21130 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
21140 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
21150 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
21160 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65  query" */.  Sele
21170 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20  ct *pSub1;      
21180 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
21190 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65  e rightmost sele
211a0 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20  ct in sub-query 
211b0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
211c0 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
211d0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
211e0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
211f0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75  /.  SrcList *pSu
21200 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  bSrc;   /* The F
21210 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
21220 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
21230 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
21240 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
21250 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
21260 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
21270 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
21280 20 69 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20   int iNewParent 
21290 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d  = -1;/* Replacem
212a0 65 6e 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50  ent table for iP
212b0 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  arent */.  int i
212c0 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f  sLeftJoin = 0; /
212d0 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 20 69  * True if pSub i
212e0 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
212f0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
21300 2a 2f 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20  */    .  int i; 
21310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21320 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
21330 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
21340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21350 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
21360 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
21370 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
21380 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
21390 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
213a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
213b0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
213c0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
213d0 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
213e0 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
213f0 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
21400 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
21410 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
21420 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20  >pPrior==0 );.  
21430 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
21440 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
21450 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
21460 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  er) ) return 0;.
21470 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
21480 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
21490 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
214a0 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
214b0 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
214c0 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
214d0 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  ;.  iParent = pS
214e0 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ubitem->iCursor;
214f0 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
21500 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
21510 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
21520 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
21530 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
21540 43 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20  C.  if( p->pWin 
21550 7c 7c 20 70 53 75 62 2d 3e 70 57 69 6e 20 29 20  || pSub->pWin ) 
21560 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
21570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21580 73 74 72 69 63 74 69 6f 6e 20 28 32 35 29 20 2a  striction (25) *
21590 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 70 53 75 62  /.#endif..  pSub
215a0 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
215b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
215c0 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f  Src );.  /* Prio
215d0 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31  r to version 3.1
215e0 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61  .2, when LIMIT a
215f0 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f  nd OFFSET had to
21600 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74   be simple const
21610 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61  ants,.  ** not a
21620 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73  rbitrary express
21630 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
21640 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
21650 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
21660 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
21670 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
21680 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
21690 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
216a0 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
216b0 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
216c0 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
216d0 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
216e0 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
216f0 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
21700 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
21710 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
21720 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
21730 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
21740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
21750 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
21760 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
21770 6d 69 74 20 26 26 20 70 53 75 62 2d 3e 70 4c 69  mit && pSub->pLi
21780 6d 69 74 2d 3e 70 52 69 67 68 74 20 29 20 72 65  mit->pRight ) re
21790 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 52 65 73  turn 0;   /* Res
217a0 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
217b0 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
217c0 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e  ags & SF_Compoun
217d0 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70  d)!=0 && pSub->p
217e0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74  Limit ){.    ret
217f0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21820 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
21830 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (15) */.  }.  i
21840 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63  f( pSubSrc->nSrc
21850 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
21860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21870 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
21880 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69  tion (7)  */.  i
21890 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  f( pSub->selFlag
218a0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20  s & SF_Distinct 
218b0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
218c0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
218d0 74 69 6f 6e 20 28 34 29 20 20 2a 2f 0a 20 20 69  tion (4)  */.  i
218e0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
218f0 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31  && (pSrc->nSrc>1
21900 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20   || isAgg) ){.  
21910 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
21920 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
21930 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20  ions (8)(9) */. 
21940 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64   }.  if( p->pOrd
21950 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f  erBy && pSub->pO
21960 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72  rderBy ){.     r
21970 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219a0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
219b0 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20  n (11) */.  }.  
219c0 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75  if( isAgg && pSu
219d0 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65  b->pOrderBy ) re
219e0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
219f0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
21a00 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20  ction (16) */.  
21a10 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
21a20 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20   && p->pWhere ) 
21a30 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
21a40 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
21a50 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20  ction (19) */.  
21a60 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
21a70 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   && (p->selFlags
21a80 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
21a90 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72  =0 ){.     retur
21aa0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  n 0;         /* 
21ab0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29  Restriction (21)
21ac0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53   */.  }.  if( pS
21ad0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  ub->selFlags & (
21ae0 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 29 7b  SF_Recursive) ){
21af0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f  .    return 0; /
21b00 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28  * Restrictions (
21b10 32 32 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  22) */.  }..  /*
21b20 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62  .  ** If the sub
21b30 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
21b40 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
21b50 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20  LEFT JOIN, then 
21b60 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
21b70 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 6a  y may not be a j
21b80 6f 69 6e 20 69 74 73 65 6c 66 20 28 33 61 29 2e  oin itself (3a).
21b90 20 45 78 61 6d 70 6c 65 20 6f 66 20 77 68 79 20   Example of why 
21ba0 74 68 69 73 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  this is not.  **
21bb0 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20   allowed:.  **. 
21bc0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c   **         t1 L
21bd0 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28  EFT OUTER JOIN (
21be0 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a  t2 JOIN t3).  **
21bf0 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
21c00 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
21c10 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
21c20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
21c30 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
21c40 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20  N t2) JOIN t3.  
21c50 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73  **.  ** which is
21c60 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20   not at all the 
21c70 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a  same thing..  **
21c80 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 75 62  .  ** If the sub
21c90 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
21ca0 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
21cb0 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20  LEFT JOIN, then 
21cc0 74 68 65 20 6f 75 74 65 72 0a 20 20 2a 2a 20 71  the outer.  ** q
21cd0 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 20 61  uery cannot be a
21ce0 6e 20 61 67 67 72 65 67 61 74 65 2e 20 28 33 63  n aggregate. (3c
21cf0 29 20 20 54 68 69 73 20 69 73 20 61 6e 20 61 72  )  This is an ar
21d00 74 69 66 61 63 74 20 6f 66 20 74 68 65 20 77 61  tifact of the wa
21d10 79 0a 20 20 2a 2a 20 61 67 67 72 65 67 61 74 65  y.  ** aggregate
21d20 73 20 61 72 65 20 70 72 6f 63 65 73 73 65 64 20  s are processed 
21d30 2d 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 65  - there is no me
21d40 63 68 61 6e 69 73 6d 20 74 6f 20 64 65 74 65 72  chanism to deter
21d50 6d 69 6e 65 20 69 66 0a 20 20 2a 2a 20 74 68 65  mine if.  ** the
21d60 20 4c 45 46 54 20 4a 4f 49 4e 20 74 61 62 6c 65   LEFT JOIN table
21d70 20 73 68 6f 75 6c 64 20 62 65 20 61 6c 6c 2d 4e   should be all-N
21d80 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  ULL..  **.  ** S
21d90 65 65 20 61 6c 73 6f 20 74 69 63 6b 65 74 73 20  ee also tickets 
21da0 23 33 30 36 2c 20 23 33 35 30 2c 20 61 6e 64 20  #306, #350, and 
21db0 23 33 33 30 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  #3300..  */.  if
21dc0 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 66 67 2e  ( (pSubitem->fg.
21dd0 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
21de0 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  TER)!=0 ){.    i
21df0 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 31 3b 0a 20  sLeftJoin = 1;. 
21e00 20 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e     if( pSubSrc->
21e10 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 20  nSrc>1 || isAgg 
21e20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 53 75  || IsVirtual(pSu
21e30 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 29  bSrc->a[0].pTab)
21e40 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 20 28 33   ){.      /*  (3
21e50 61 29 20 20 20 20 20 20 20 20 20 20 20 20 20 28  a)             (
21e60 33 63 29 20 20 20 20 20 28 33 62 29 20 2a 2f 0a  3c)     (3b) */.
21e70 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
21e80 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
21e90 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 46   SQLITE_EXTRA_IF
21ea0 4e 55 4c 4c 52 4f 57 0a 20 20 65 6c 73 65 20 69  NULLROW.  else i
21eb0 66 28 20 69 46 72 6f 6d 3e 30 20 26 26 20 21 69  f( iFrom>0 && !i
21ec0 73 41 67 67 20 29 7b 0a 20 20 20 20 2f 2a 20 53  sAgg ){.    /* S
21ed0 65 74 74 69 6e 67 20 69 73 4c 65 66 74 4a 6f 69  etting isLeftJoi
21ee0 6e 20 74 6f 20 2d 31 20 63 61 75 73 65 73 20 4f  n to -1 causes O
21ef0 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 6f 70 63 6f  P_IfNullRow opco
21f00 64 65 73 20 74 6f 20 62 65 20 67 65 6e 65 72 61  des to be genera
21f10 74 65 64 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65  ted for.    ** e
21f20 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
21f30 6f 20 61 6e 79 20 72 65 73 75 6c 74 20 63 6f 6c  o any result col
21f40 75 6d 6e 20 66 72 6f 6d 20 73 75 62 71 75 65 72  umn from subquer
21f50 79 20 69 6e 20 61 20 6a 6f 69 6e 2c 20 65 76 65  y in a join, eve
21f60 6e 0a 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20  n.    ** though 
21f70 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6e 65 63  they are not nec
21f80 65 73 73 61 72 79 2e 20 20 54 68 69 73 20 77 69  essary.  This wi
21f90 6c 6c 20 73 74 72 65 73 73 2d 74 65 73 74 20 74  ll stress-test t
21fa0 68 65 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20  he OP_IfNullRow 
21fb0 0a 20 20 20 20 2a 2a 20 6f 70 63 6f 64 65 2e 20  .    ** opcode. 
21fc0 2a 2f 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f 69  */.    isLeftJoi
21fd0 6e 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64  n = -1;.  }.#end
21fe0 69 66 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63  if..  /* Restric
21ff0 74 69 6f 6e 20 28 31 37 29 3a 20 49 66 20 74 68  tion (17): If th
22000 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
22010 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
22020 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 0a 20  , then it must. 
22030 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74 68 65   ** use only the
22040 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
22050 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66  tor. And none of
22060 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65 6c 65   the simple sele
22070 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a 2a 20  ct queries.  ** 
22080 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65  that make up the
22090 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
220a0 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20   are allowed to 
220b0 62 65 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  be aggregate or 
220c0 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75  distinct.  ** qu
220d0 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eries..  */.  if
220e0 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29  ( pSub->pPrior )
220f0 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  {.    if( pSub->
22100 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
22110 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
22120 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 30 29  Restriction (20)
22130 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
22140 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73  ( isAgg || (p->s
22150 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
22160 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72  tinct)!=0 || pSr
22170 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20  c->nSrc!=1 ){.  
22180 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
22190 20 28 31 37 64 31 29 2c 20 28 31 37 64 32 29 2c   (17d1), (17d2),
221a0 20 6f 72 20 28 31 37 64 33 29 20 2a 2f 0a 20 20   or (17d3) */.  
221b0 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62    }.    for(pSub
221c0 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70  1=pSub; pSub1; p
221d0 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69  Sub1=pSub1->pPri
221e0 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  or){.      testc
221f0 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
22200 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
22210 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
22220 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
22230 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
22240 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  se( (pSub1->selF
22250 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
22260 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
22270 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65  ))==SF_Aggregate
22280 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
22290 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20  ( pSub->pSrc!=0 
222a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
222b0 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e   pSub->pEList->n
222c0 45 78 70 72 3d 3d 70 53 75 62 31 2d 3e 70 45 4c  Expr==pSub1->pEL
222d0 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
222e0 20 20 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e      if( (pSub1->
222f0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
22300 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
22310 67 61 74 65 29 29 21 3d 30 20 20 20 20 2f 2a 20  gate))!=0    /* 
22320 28 31 37 62 29 20 2a 2f 0a 20 20 20 20 20 20 20  (17b) */.       
22330 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69 6f  || (pSub1->pPrio
22340 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21 3d  r && pSub1->op!=
22350 54 4b 5f 41 4c 4c 29 20 20 20 20 20 20 20 20 20  TK_ALL)         
22360 20 20 20 20 20 20 20 20 2f 2a 20 28 31 37 61 29          /* (17a)
22370 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20 70 53   */.       || pS
22380 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c  ub1->pSrc->nSrc<
22390 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
223a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223b0 20 20 20 2f 2a 20 28 31 37 63 29 20 2a 2f 0a 20     /* (17c) */. 
223c0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
223d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
223e0 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
223f0 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  ( pSub1->pSrc->n
22400 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a  Src>1 );.    }..
22410 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
22420 6f 6e 20 28 31 38 29 2e 20 2a 2f 0a 20 20 20 20  on (18). */.    
22430 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
22440 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
22450 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
22460 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d   ii<p->pOrderBy-
22470 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
22480 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f         if( p->pO
22490 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e  rderBy->a[ii].u.
224a0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  x.iOrderByCol==0
224b0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
224c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
224d0 20 20 2f 2a 20 45 78 2d 72 65 73 74 72 69 63 74    /* Ex-restrict
224e0 69 6f 6e 20 28 32 33 29 3a 0a 20 20 2a 2a 20 54  ion (23):.  ** T
224f0 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68 61 74  he only way that
22500 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70   the recursive p
22510 61 72 74 20 6f 66 20 61 20 43 54 45 20 63 61 6e  art of a CTE can
22520 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 6d 70 6f   contain a compo
22530 75 6e 64 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  und.  ** subquer
22540 79 20 69 73 20 66 6f 72 20 74 68 65 20 73 75 62  y is for the sub
22550 71 75 65 72 79 20 74 6f 20 62 65 20 6f 6e 65 20  query to be one 
22560 74 65 72 6d 20 6f 66 20 61 20 6a 6f 69 6e 2e 20  term of a join. 
22570 20 42 75 74 20 69 66 20 74 68 65 0a 20 20 2a 2a   But if the.  **
22580 20 73 75 62 71 75 65 72 79 20 69 73 20 61 20 6a   subquery is a j
22590 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20 66 6c  oin, then the fl
225a0 61 74 74 65 6e 69 6e 67 20 68 61 73 20 61 6c 72  attening has alr
225b0 65 61 64 79 20 62 65 65 6e 20 73 74 6f 70 70 65  eady been stoppe
225c0 64 20 62 79 0a 20 20 2a 2a 20 72 65 73 74 72 69  d by.  ** restri
225d0 63 74 69 6f 6e 20 28 31 37 64 33 29 0a 20 20 2a  ction (17d3).  *
225e0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  /.  assert( (p->
225f0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
22600 63 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70  cursive)==0 || p
22610 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  Sub->pPrior==0 )
22620 3b 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77  ;..  /***** If w
22630 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
22640 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  nt, flattening i
22650 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a  s permitted. ***
22660 2a 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52 41 43  **/.  SELECTTRAC
22670 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 66  E(1,pParse,p,("f
22680 6c 61 74 74 65 6e 20 25 73 2e 25 70 20 66 72 6f  latten %s.%p fro
22690 6d 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a 20 20  m term %d\n",.  
226a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226b0 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d 65 2c   pSub->zSelName,
226c0 20 70 53 75 62 2c 20 69 46 72 6f 6d 29 29 3b 0a   pSub, iFrom));.
226d0 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65 20  .  /* Authorize 
226e0 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  the subquery */.
226f0 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
22700 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74 65  ontext = pSubite
22710 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53 54  m->zName;.  TEST
22720 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74 65  ONLY(i =) sqlite
22730 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
22740 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
22750 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74 65  , 0, 0, 0);.  te
22760 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49 54  stcase( i==SQLIT
22770 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61 72  E_DENY );.  pPar
22780 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
22790 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e   = zSavedAuthCon
227a0 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  text;..  /* If t
227b0 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
227c0 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
227d0 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  T statement, the
227e0 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69 6f  n (by restrictio
227f0 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20 31  ns.  ** 17 and 1
22800 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73 74  8 above) it must
22810 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   be a UNION ALL 
22820 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 71  and the parent q
22830 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a 20  uery must .  ** 
22840 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  be of the form:.
22850 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
22860 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74 3e  LECT <expr-list>
22870 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65 72   FROM (<sub-quer
22880 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75 73  y>) <where-claus
22890 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f  e> .  **.  ** fo
228a0 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f 52  llowed by any OR
228b0 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61 6e  DER BY, LIMIT an
228c0 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61 75  d/or OFFSET clau
228d0 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a  ses. This block.
228e0 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d 31    ** creates N-1
228f0 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 70   copies of the p
22900 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74 68  arent query with
22910 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42 59  out any ORDER BY
22920 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a 2a  , LIMIT or .  **
22930 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 20   OFFSET clauses 
22940 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20 74  and joins them t
22950 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 2d  o the left-hand-
22960 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69 67  side of the orig
22970 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67 20  inal.  ** using 
22980 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
22990 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ors. In this cas
229a0 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
229b0 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a 2a  r of simple.  **
229c0 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
229d0 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75  ts in the compou
229e0 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20 20  nd sub-query..  
229f0 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  **.  ** Example:
22a00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
22a10 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20 28  ELECT a+1 FROM (
22a20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
22a30 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a 20  ECT x FROM tab. 
22a40 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
22a50 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
22a60 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74   SELECT y FROM t
22a70 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
22a80 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
22a90 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
22aa0 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a 20  z*2) FROM tab2. 
22ab0 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45 20   **     ) WHERE 
22ac0 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31 0a  a!=5 ORDER BY 1.
22ad0 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73 66    **.  ** Transf
22ae0 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a  ormed into:.  **
22af0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
22b00 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48   x+1 FROM tab WH
22b10 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a 20  ERE x+1!=5.  ** 
22b20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
22b30 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79 2b  **     SELECT y+
22b40 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45  1 FROM tab WHERE
22b50 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20   y+1!=5.  **    
22b60 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
22b70 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28 7a      SELECT abs(z
22b80 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32 20  *2)+1 FROM tab2 
22b90 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b 31  WHERE abs(z*2)+1
22ba0 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52 44  !=5.  **     ORD
22bb0 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a  ER BY 1.  **.  *
22bc0 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20 74  * We call this t
22bd0 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  he "compound-sub
22be0 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  query flattening
22bf0 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 53  "..  */.  for(pS
22c00 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b  ub=pSub->pPrior;
22c10 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75 62   pSub; pSub=pSub
22c20 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 53  ->pPrior){.    S
22c30 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 20  elect *pNew;.   
22c40 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
22c50 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
22c60 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 69  y;.    Expr *pLi
22c70 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b  mit = p->pLimit;
22c80 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72  .    Select *pPr
22c90 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ior = p->pPrior;
22ca0 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
22cb0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53 72   = 0;.    p->pSr
22cc0 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 50  c = 0;.    p->pP
22cd0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rior = 0;.    p-
22ce0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
22cf0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53   pNew = sqlite3S
22d00 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20  electDup(db, p, 
22d10 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  0);.    sqlite3S
22d20 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70 4e 65  electSetName(pNe
22d30 77 2c 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d  w, pSub->zSelNam
22d40 65 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69  e);.    p->pLimi
22d50 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
22d60 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
22d70 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70  rderBy;.    p->p
22d80 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
22d90 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a  p->op = TK_ALL;.
22da0 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
22db0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69  ){.      p->pPri
22dc0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
22dd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
22de0 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72  ew->pPrior = pPr
22df0 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ior;.      if( p
22e00 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e  Prior ) pPrior->
22e10 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
22e20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20      pNew->pNext 
22e30 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50  = p;.      p->pP
22e40 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  rior = pNew;.   
22e50 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 32     SELECTTRACE(2
22e60 2c 70 50 61 72 73 65 2c 70 2c 28 22 63 6f 6d 70  ,pParse,p,("comp
22e70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
22e80 61 74 74 65 6e 65 72 22 0a 20 20 20 20 20 20 20  attener".       
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ea0 20 20 20 20 20 20 20 22 20 63 72 65 61 74 65 73         " creates
22eb0 20 25 73 2e 25 70 20 61 73 20 70 65 65 72 5c 6e   %s.%p as peer\n
22ec0 22 2c 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65  ",pNew->zSelName
22ed0 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20 20 7d 0a  , pNew));.    }.
22ee0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
22ef0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
22f00 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  n 1;.  }..  /* B
22f10 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20  egin flattening 
22f20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74  the iFrom-th ent
22f30 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
22f40 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74  lause .  ** in t
22f50 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
22f60 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53    */.  pSub = pS
22f70 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  ub1 = pSubitem->
22f80 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44  pSelect;..  /* D
22f90 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69  elete the transi
22fa0 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
22fb0 75 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ure associated w
22fc0 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
22fd0 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
22fe0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
22ff0 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61  Subitem->zDataba
23000 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  se);.  sqlite3Db
23010 46 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65  Free(db, pSubite
23020 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  m->zName);.  sql
23030 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
23040 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  Subitem->zAlias)
23050 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44  ;.  pSubitem->zD
23060 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70  atabase = 0;.  p
23070 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  Subitem->zName =
23080 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
23090 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53  zAlias = 0;.  pS
230a0 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ubitem->pSelect 
230b0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72  = 0;..  /* Defer
230c0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61   deleting the Ta
230d0 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ble object assoc
230e0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
230f0 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74   ** subquery unt
23100 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  il code generati
23110 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c  on is.  ** compl
23120 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ete, since there
23130 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74   may still exist
23140 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69   Expr.pTab entri
23150 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66  es that.  ** ref
23160 65 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  er to the subque
23170 72 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c  ry even after fl
23180 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65  attening.  Ticke
23190 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20  t #3346..  **.  
231a0 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61  ** pSubitem->pTa
231b0 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  b is always non-
231c0 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73  NULL by test res
231d0 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65  trictions and te
231e0 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a  sts above..  */.
231f0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75    if( ALWAYS(pSu
23200 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20  bitem->pTab!=0) 
23210 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
23220 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74  abToDel = pSubit
23230 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
23240 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61  ( pTabToDel->nTa
23250 62 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20  bRef==1 ){.     
23260 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
23270 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
23280 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
23290 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  ;.      pTabToDe
232a0 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d  l->pNextZombie =
232b0 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d   pToplevel->pZom
232c0 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54  bieTab;.      pT
232d0 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
232e0 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b  Tab = pTabToDel;
232f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23300 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 54 61    pTabToDel->nTa
23310 62 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  bRef--;.    }.  
23320 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62    pSubitem->pTab
23330 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
23340 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f  The following lo
23350 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  op runs once for
23360 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20   each term in a 
23370 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
23380 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e  y.  ** flattenin
23390 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64 20  g (as described 
233a0 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61  above).  If we a
233b0 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65  re doing a diffe
233c0 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f  rent kind.  ** o
233d0 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61  f flattening - a
233e0 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65   flattening othe
233f0 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e  r than a compoun
23400 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
23410 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65  ening -.  ** the
23420 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79  n this loop only
23430 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a   runs once..  **
23440 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
23450 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65  moves all of the
23460 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f   FROM elements o
23470 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
23480 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  nto the.  ** the
23490 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
234a0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
234b0 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74    Before doing t
234c0 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20  his, remember.  
234d0 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  ** the cursor nu
234e0 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69  mber for the ori
234f0 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72  ginal outer quer
23500 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69  y FROM element i
23510 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20  n.  ** iParent. 
23520 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75 72   The iParent cur
23530 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  sor will never b
23540 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71 75  e used.  Subsequ
23550 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69  ent code.  ** wi
23560 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73 69  ll scan expressi
23570 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ons looking for 
23580 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63  iParent referenc
23590 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20  es and replace. 
235a0 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65   ** those refere
235b0 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65 73  nces with expres
235c0 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c  sions that resol
235d0 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75 65  ve to the subque
235e0 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65  ry FROM.  ** ele
235f0 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77  ments we are now
23600 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a   copying in..  *
23610 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d  /.  for(pParent=
23620 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72  p; pParent; pPar
23630 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72  ent=pParent->pPr
23640 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e  ior, pSub=pSub->
23650 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74  pPrior){.    int
23660 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38   nSubSrc;.    u8
23670 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20   jointype = 0;. 
23680 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75     pSubSrc = pSu
23690 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20  b->pSrc;     /* 
236a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73  FROM clause of s
236b0 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e  ubquery */.    n
236c0 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72 63  SubSrc = pSubSrc
236d0 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62  ->nSrc;  /* Numb
236e0 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73  er of terms in s
236f0 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61  ubquery FROM cla
23700 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20  use */.    pSrc 
23710 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b  = pParent->pSrc;
23720 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
23730 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
23740 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69   query */..    i
23750 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20  f( pSrc ){.     
23760 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
23770 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74  ==p );  /* First
23780 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68   time through th
23790 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
237a0 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69  jointype = pSubi
237b0 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
237c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
237d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
237e0 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64  nt!=p );  /* 2nd
237f0 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
23800 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68  times through th
23810 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
23820 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e  pSrc = pParent->
23830 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
23840 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20  cListAppend(db, 
23850 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
23860 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20  if( pSrc==0 ){. 
23870 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64         assert( d
23880 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
23890 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
238a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
238b0 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  .    /* The subq
238c0 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e 67  uery uses a sing
238d0 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46  le slot of the F
238e0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
238f0 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71  e outer.    ** q
23900 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73 75  uery.  If the su
23910 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20  bquery has more 
23920 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74  than one element
23930 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61   in its FROM cla
23940 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  use,.    ** then
23950 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65   expand the oute
23960 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20  r query to make 
23970 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20  space for it to 
23980 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74  hold all element
23990 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
239a0 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  subquery..    **
239b0 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
239c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
239d0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
239e0 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20  tabA, (SELECT * 
239f0 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29  FROM sub1, sub2)
23a00 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20  , tabB;.    **. 
23a10 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20     ** The outer 
23a20 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74  query has 3 slot
23a30 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  s in its FROM cl
23a40 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20  ause.  One slot 
23a50 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  of the.    ** ou
23a60 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20 6d  ter query (the m
23a70 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75  iddle slot) is u
23a80 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71 75  sed by the subqu
23a90 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20  ery.  The next. 
23aa0 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63     ** block of c
23ab0 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  ode will expand 
23ac0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
23ad0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20 34  FROM clause to 4
23ae0 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a 20 54   slots..    ** T
23af0 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 20 69  he middle slot i
23b00 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77  s expanded to tw
23b10 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72  o slots in order
23b20 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 0a 20   to make space. 
23b30 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 77     ** for the tw
23b40 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  o elements in th
23b50 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
23b60 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20   the subquery.. 
23b70 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53     */.    if( nS
23b80 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  ubSrc>1 ){.     
23b90 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
23ba0 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53   pSrc = sqlite3S
23bb0 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
23bc0 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d  , pSrc, nSubSrc-
23bd0 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20  1,iFrom+1);.    
23be0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
23bf0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
23c00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
23c10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
23c20 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d  ransfer the FROM
23c30 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72   clause terms fr
23c40 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79 20  om the subquery 
23c50 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
23c60 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20  outer query..   
23c70 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
23c80 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29   i<nSubSrc; i++)
23c90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
23ca0 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
23cb0 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d  pSrc->a[i+iFrom]
23cc0 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20  .pUsing);.      
23cd0 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b  assert( pSrc->a[
23ce0 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69 73 54 61  i+iFrom].fg.isTa
23cf0 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  bFunc==0 );.    
23d00 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f    pSrc->a[i+iFro
23d10 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b  m] = pSubSrc->a[
23d20 69 5d 3b 0a 20 20 20 20 20 20 69 4e 65 77 50 61  i];.      iNewPa
23d30 72 65 6e 74 20 3d 20 70 53 75 62 53 72 63 2d 3e  rent = pSubSrc->
23d40 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[i].iCursor;.  
23d50 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
23d60 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
23d70 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
23d80 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
23d90 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 66  pSrc->a[iFrom].f
23da0 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69  g.jointype = joi
23db0 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a  ntype;.  .    /*
23dc0 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74   Now begin subst
23dd0 69 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79  ituting subquery
23de0 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
23df0 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20  essions for .   
23e00 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74   ** references t
23e10 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e  o the iParent in
23e20 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
23e30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
23e40 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
23e50 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54  .    **   SELECT
23e60 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20   a+5, b*10 FROM 
23e70 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61  (SELECT x*3 AS a
23e80 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d  , y+10 AS b FROM
23e90 20 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a   t1) WHERE a>b;.
23ea0 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20      **   \      
23eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
23ec0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75  _____________ su
23ed0 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  bquery _________
23ee0 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20  _/          /.  
23ef0 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f    **    \_______
23f00 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f  ______________ o
23f10 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f  uter query _____
23f20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23f30 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a  _________/.    *
23f40 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b  *.    ** We look
23f50 20 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73   at every expres
23f60 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65  sion in the oute
23f70 72 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72  r query and ever
23f80 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20  y place we see. 
23f90 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62     ** "a" we sub
23fa0 73 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e  stitute "x*3" an
23fb0 64 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65  d every place we
23fc0 20 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73   see "b" we subs
23fd0 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20  titute "y+10".. 
23fe0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
23ff0 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
24000 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73        /* At this
24010 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f 6e 2d   point, any non-
24020 7a 65 72 6f 20 69 4f 72 64 65 72 42 79 43 6f 6c  zero iOrderByCol
24030 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61 74 65   values indicate
24040 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
24050 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75  ** ORDER BY colu
24060 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  mn expression is
24070 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68   identical to th
24080 65 20 69 4f 72 64 65 72 42 79 43 6f 6c 27 74 68  e iOrderByCol'th
24090 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73  .      ** expres
240a0 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 62 79  sion returned by
240b0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
240c0 74 20 70 53 75 62 2e 20 53 69 6e 63 65 20 74 68  t pSub. Since th
240d0 65 73 65 20 76 61 6c 75 65 73 0a 20 20 20 20 20  ese values.     
240e0 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63 65 73   ** do not neces
240f0 73 61 72 69 6c 79 20 63 6f 72 72 65 73 70 6f 6e  sarily correspon
24100 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  d to columns in 
24110 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
24120 20 70 50 61 72 65 6e 74 2c 0a 20 20 20 20 20 20   pParent,.      
24130 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62 65 66  ** zero them bef
24140 6f 72 65 20 74 72 61 6e 73 66 65 72 69 6e 67 20  ore transfering 
24150 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
24160 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  use..      **.  
24170 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69 6e 67      ** Not doing
24180 20 74 68 69 73 20 6d 61 79 20 63 61 75 73 65 20   this may cause 
24190 61 6e 20 65 72 72 6f 72 20 69 66 20 61 20 73 75  an error if a su
241a0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
241b0 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66   this.      ** f
241c0 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
241d0 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 20 63 6f   to flatten a co
241e0 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
241f0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a 20 20   into pParent.  
24200 20 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e 6c 79      ** (the only
24210 20 77 61 79 20 74 68 69 73 20 63 61 6e 20 68 61   way this can ha
24220 70 70 65 6e 20 69 73 20 69 66 20 74 68 65 20 63  ppen is if the c
24230 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
24240 79 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 75  y is.      ** cu
24250 72 72 65 6e 74 6c 79 20 70 61 72 74 20 6f 66 20  rrently part of 
24260 70 53 75 62 2d 3e 70 53 72 63 29 2e 20 53 65 65  pSub->pSrc). See
24270 20 74 69 63 6b 65 74 20 5b 64 31 31 61 36 65 39   ticket [d11a6e9
24280 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20 20 20  08f].  */.      
24290 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
242a0 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
242b0 72 42 79 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  rBy;.      for(i
242c0 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
242d0 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
242e0 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
242f0 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
24300 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Col = 0;.      }
24310 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24320 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
24330 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
24340 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d  rent->pOrderBy =
24350 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20   pOrderBy;.     
24360 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
24370 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
24380 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
24390 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  xprDup(db, pSub-
243a0 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20  >pWhere, 0);.   
243b0 20 69 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e 3e   if( isLeftJoin>
243c0 30 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4a 6f  0 ){.      setJo
243d0 69 6e 45 78 70 72 28 70 57 68 65 72 65 2c 20 69  inExpr(pWhere, i
243e0 4e 65 77 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  NewParent);.    
243f0 7d 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70  }.    pParent->p
24400 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
24410 78 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65 72  xprAnd(db, pWher
24420 65 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65  e, pParent->pWhe
24430 72 65 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  re);.    if( db-
24440 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
24450 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43   ){.      SubstC
24460 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20  ontext x;.      
24470 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  x.pParse = pPars
24480 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62 6c  e;.      x.iTabl
24490 65 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20 20  e = iParent;.   
244a0 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20 3d     x.iNewTable =
244b0 20 69 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20   iNewParent;.   
244c0 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20     x.isLeftJoin 
244d0 3d 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a 20 20  = isLeftJoin;.  
244e0 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d 20 70      x.pEList = p
244f0 53 75 62 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  Sub->pEList;.   
24500 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 26     substSelect(&
24510 78 2c 20 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a  x, pParent, 0);.
24520 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
24530 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75  The flattened qu
24540 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74 20  ery is distinct 
24550 69 66 20 65 69 74 68 65 72 20 74 68 65 20 69 6e  if either the in
24560 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ner or the.    *
24570 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  * outer query is
24580 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20   distinct. .    
24590 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  */.    pParent->
245a0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62  selFlags |= pSub
245b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
245c0 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20  Distinct;.  .   
245d0 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43   /*.    ** SELEC
245e0 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45  T ... FROM (SELE
245f0 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f  CT ... LIMIT a O
24600 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78  FFSET b) LIMIT x
24610 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a   OFFSET y;.    *
24620 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20  *.    ** One is 
24630 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74  tempted to try t
24640 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f  o add a and b to
24650 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d   combine the lim
24660 69 74 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20  its.  But this. 
24670 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77     ** does not w
24680 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69  ork if either li
24690 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e  mit is negative.
246a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
246b0 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  pSub->pLimit ){.
246c0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
246d0 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c  Limit = pSub->pL
246e0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62  imit;.      pSub
246f0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
24700 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
24710 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77  nially, delete w
24720 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74  hat is left of t
24730 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
24740 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63  return.  ** succ
24750 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
24760 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
24770 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23 69 66  db, pSub1);..#if
24780 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
24790 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
247a0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
247b0 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53 45 4c  0x100 ){.    SEL
247c0 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70  ECTTRACE(0x100,p
247d0 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20  Parse,p,("After 
247e0 66 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22 29 29  flattening:\n"))
247f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
24800 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
24810 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
24820 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
24830 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
24840 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
24850 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
24860 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
24870 5f 56 49 45 57 29 20 2a 2f 0a 0a 0a 0a 23 69 66  _VIEW) */....#if
24880 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
24890 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
248a0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
248b0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
248c0 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20  .** Make copies 
248d0 6f 66 20 72 65 6c 65 76 61 6e 74 20 57 48 45 52  of relevant WHER
248e0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f  E clause terms o
248f0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
24900 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 57 48  y into.** the WH
24910 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 73 75  ERE clause of su
24920 62 71 75 65 72 79 2e 20 20 45 78 61 6d 70 6c 65  bquery.  Example
24930 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  :.**.**    SELEC
24940 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T * FROM (SELECT
24950 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20   a AS x, c-d AS 
24960 79 20 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45  y FROM t1) WHERE
24970 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a 2a   x=5 AND y=10;.*
24980 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64  *.** Transformed
24990 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   into:.**.**    
249a0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53  SELECT * FROM (S
249b0 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d  ELECT a AS x, c-
249c0 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20 57  d AS y FROM t1 W
249d0 48 45 52 45 20 61 3d 35 20 41 4e 44 20 63 2d 64  HERE a=5 AND c-d
249e0 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57 48 45 52  =10).**     WHER
249f0 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b 0a  E x=5 AND y=10;.
24a00 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65 20 69  **.** The hope i
24a10 73 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73  s that the terms
24a20 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
24a30 6e 65 72 20 71 75 65 72 79 20 77 69 6c 6c 20 6d  ner query will m
24a40 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a 20 65  ake it more.** e
24a50 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
24a60 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
24a70 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
24a80 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29   if:.**.**   (1)
24a90 20 28 2a 2a 20 54 68 69 73 20 72 65 73 74 72 69   (** This restri
24aa0 63 74 69 6f 6e 20 77 61 73 20 72 65 6d 6f 76 65  ction was remove
24ab0 64 20 6f 6e 20 32 30 31 37 2d 30 39 2d 32 39 2e  d on 2017-09-29.
24ac0 20 20 57 65 20 75 73 65 64 20 74 6f 0a 2a 2a 20    We used to.** 
24ad0 20 20 20 20 20 20 20 20 20 20 64 69 73 61 6c 6c            disall
24ae0 6f 77 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  ow this optimiza
24af0 74 69 6f 6e 20 66 6f 72 20 61 67 67 72 65 67 61  tion for aggrega
24b00 74 65 20 73 75 62 71 75 65 72 69 65 73 2c 20 62  te subqueries, b
24b10 75 74 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20  ut now.**       
24b20 20 20 20 20 69 74 20 69 73 20 61 6c 6c 6f 77 65      it is allowe
24b30 64 20 62 79 20 70 75 74 74 69 6e 67 20 74 68 65  d by putting the
24b40 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20   extra terms on 
24b50 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  the HAVING claus
24b60 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
24b70 54 68 65 20 61 64 64 65 64 20 48 41 56 49 4e 47  The added HAVING
24b80 20 63 6c 61 75 73 65 20 69 73 20 70 6f 69 6e 74   clause is point
24b90 6c 65 73 73 20 69 66 20 74 68 65 20 73 75 62 71  less if the subq
24ba0 75 65 72 79 20 6c 61 63 6b 73 0a 2a 2a 20 20 20  uery lacks.**   
24bb0 20 20 20 20 20 20 20 20 61 20 47 52 4f 55 50 20          a GROUP 
24bc0 42 59 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20  BY clause.  But 
24bd0 73 75 63 68 20 61 20 48 41 56 49 4e 47 20 63 6c  such a HAVING cl
24be0 61 75 73 65 20 69 73 20 61 6c 73 6f 20 68 61 72  ause is also har
24bf0 6d 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  mless.**        
24c00 20 20 20 73 6f 20 74 68 65 72 65 20 64 6f 65 73     so there does
24c10 20 6e 6f 74 20 61 70 70 65 61 72 20 74 6f 20 62   not appear to b
24c20 65 20 61 6e 79 20 72 65 61 73 6f 6e 20 74 6f 20  e any reason to 
24c30 61 64 64 20 65 78 74 72 61 20 6c 6f 67 69 63 0a  add extra logic.
24c40 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74 6f 20  **           to 
24c50 73 75 70 70 72 65 73 73 20 69 74 2e 20 2a 2a 29  suppress it. **)
24c60 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54 68 65  .**.**   (2) The
24c70 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20   inner query is 
24c80 74 68 65 20 72 65 63 75 72 73 69 76 65 20 70 61  the recursive pa
24c90 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e 20 74  rt of a common t
24ca0 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e  able expression.
24cb0 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54 68 65  .**.**   (3) The
24cc0 20 69 6e 6e 65 72 20 71 75 65 72 79 20 68 61 73   inner query has
24cd0 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20   a LIMIT clause 
24ce0 28 73 69 6e 63 65 20 74 68 65 20 63 68 61 6e 67  (since the chang
24cf0 65 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 0a  es to the WHERE.
24d00 2a 2a 20 20 20 20 20 20 20 63 6c 61 75 73 65 20  **       clause 
24d10 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68 65  would change the
24d20 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
24d30 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  LIMIT)..**.**   
24d40 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20 71 75  (4) The inner qu
24d50 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
24d60 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
24d70 46 54 20 4a 4f 49 4e 20 61 6e 64 20 74 68 65 0a  FT JOIN and the.
24d80 2a 2a 20 20 20 20 20 20 20 65 78 70 72 65 73 73  **       express
24d90 69 6f 6e 20 74 6f 20 62 65 20 70 75 73 68 65 64  ion to be pushed
24da0 20 64 6f 77 6e 20 64 6f 65 73 20 6e 6f 74 20 63   down does not c
24db0 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ome from the ON 
24dc0 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  clause.**       
24dd0 6f 6e 20 74 68 61 74 20 4c 45 46 54 20 4a 4f 49  on that LEFT JOI
24de0 4e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20 54  N..**.**   (5) T
24df0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
24e00 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69  expression origi
24e10 6e 61 74 65 73 20 69 6e 20 74 68 65 20 4f 4e 20  nates in the ON 
24e20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 0a  or USING clause.
24e30 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c 45  **       of a LE
24e40 46 54 20 4a 4f 49 4e 20 77 68 65 72 65 20 69 43  FT JOIN where iC
24e50 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 74 68 65  ursor is not the
24e60 20 72 69 67 68 74 2d 68 61 6e 64 20 74 61 62 6c   right-hand tabl
24e70 65 20 6f 66 20 74 68 61 74 0a 2a 2a 20 20 20 20  e of that.**    
24e80 20 20 20 6c 65 66 74 20 6a 6f 69 6e 2e 20 20 41     left join.  A
24e90 6e 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  n example:.**.**
24ea0 20 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43             SELEC
24eb0 54 20 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  T *.**          
24ec0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 31 20   FROM (SELECT 1 
24ed0 41 53 20 61 31 20 55 4e 49 4f 4e 20 41 4c 4c 20  AS a1 UNION ALL 
24ee0 53 45 4c 45 43 54 20 32 29 20 41 53 20 61 61 0a  SELECT 2) AS aa.
24ef0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4a 4f 49  **           JOI
24f00 4e 20 28 53 45 4c 45 43 54 20 31 20 41 53 20 62  N (SELECT 1 AS b
24f10 32 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  2 UNION ALL SELE
24f20 43 54 20 32 29 20 41 53 20 62 62 20 4f 4e 20 28  CT 2) AS bb ON (
24f30 61 31 3d 62 32 29 0a 2a 2a 20 20 20 20 20 20 20  a1=b2).**       
24f40 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 28 53      LEFT JOIN (S
24f50 45 4c 45 43 54 20 38 20 41 53 20 63 33 20 55 4e  ELECT 8 AS c3 UN
24f60 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 39  ION ALL SELECT 9
24f70 29 20 41 53 20 63 63 20 4f 4e 20 28 62 32 3d 32  ) AS cc ON (b2=2
24f80 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 54  );.**.**       T
24f90 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
24fa0 72 20 69 73 20 74 68 72 65 65 20 72 6f 77 73 3a  r is three rows:
24fb0 20 20 28 31 2c 31 2c 4e 55 4c 4c 29 2c 28 32 2c    (1,1,NULL),(2,
24fc0 32 2c 38 29 2c 28 32 2c 32 2c 39 29 2e 0a 2a 2a  2,8),(2,2,9)..**
24fd0 20 20 20 20 20 20 20 42 75 74 20 69 66 20 74 68         But if th
24fe0 65 20 28 62 32 3d 32 29 20 74 65 72 6d 20 77 65  e (b2=2) term we
24ff0 72 65 20 74 6f 20 62 65 20 70 75 73 68 65 64 20  re to be pushed 
25000 64 6f 77 6e 20 69 6e 74 6f 20 74 68 65 20 62 62  down into the bb
25010 20 73 75 62 71 75 65 72 79 2c 0a 2a 2a 20 20 20   subquery,.**   
25020 20 20 20 20 74 68 65 6e 20 74 68 65 20 28 31 2c      then the (1,
25030 31 2c 4e 55 4c 4c 29 20 72 6f 77 20 77 6f 75 6c  1,NULL) row woul
25040 64 20 62 65 20 73 75 70 70 72 65 73 73 65 64 2e  d be suppressed.
25050 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 54 68 65  .**.**   (6) The
25060 20 69 6e 6e 65 72 20 71 75 65 72 79 20 66 65 61   inner query fea
25070 74 75 72 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tures one or mor
25080 65 20 77 69 6e 64 6f 77 2d 66 75 6e 63 74 69 6f  e window-functio
25090 6e 73 20 28 73 69 6e 63 65 20 0a 2a 2a 20 20 20  ns (since .**   
250a0 20 20 20 20 63 68 61 6e 67 65 73 20 74 6f 20 74      changes to t
250b0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
250c0 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 71 75 65  of the inner que
250d0 72 79 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 20  ry could change 
250e0 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 77 69  the .**       wi
250f0 6e 64 6f 77 20 6f 76 65 72 20 77 68 69 63 68 20  ndow over which 
25100 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
25110 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 29   are calculated)
25120 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
25130 20 69 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 61   if no changes a
25140 72 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d  re made and non-
25150 7a 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d  zero if one or m
25160 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ore WHERE clause
25170 0a 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 64 75  .** terms are du
25180 70 6c 69 63 61 74 65 64 20 69 6e 74 6f 20 74 68  plicated into th
25190 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
251a0 74 61 74 69 63 20 69 6e 74 20 70 75 73 68 44 6f  tatic int pushDo
251b0 77 6e 57 68 65 72 65 54 65 72 6d 73 28 0a 20 20  wnWhereTerms(.  
251c0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
251d0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
251e0 6f 6e 74 65 78 74 20 28 66 6f 72 20 6d 61 6c 6c  ontext (for mall
251f0 6f 63 28 29 20 61 6e 64 20 65 72 72 6f 72 20 72  oc() and error r
25200 65 70 6f 72 74 69 6e 67 29 20 2a 2f 0a 20 20 53  eporting) */.  S
25210 65 6c 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20  elect *pSubq,   
25220 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71       /* The subq
25230 75 65 72 79 20 77 68 6f 73 65 20 57 48 45 52 45  uery whose WHERE
25240 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65   clause is to be
25250 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20   augmented */.  
25260 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
25270 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
25280 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
25290 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
252a0 20 20 69 6e 74 20 69 43 75 72 73 6f 72 2c 20 20    int iCursor,  
252b0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
252c0 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
252d0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
252e0 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 20 20 20  t isLeftJoin    
252f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
25300 53 75 62 71 20 69 73 20 74 68 65 20 72 69 67 68  Subq is the righ
25310 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
25320 20 4a 4f 49 4e 20 2a 2f 0a 29 7b 0a 20 20 45 78   JOIN */.){.  Ex
25330 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  pr *pNew;.  int 
25340 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 69 66 28  nChng = 0;.  if(
25350 20 70 57 68 65 72 65 3d 3d 30 20 29 20 72 65 74   pWhere==0 ) ret
25360 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 53 75  urn 0;.  if( pSu
25370 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  bq->selFlags & S
25380 46 5f 52 65 63 75 72 73 69 76 65 20 29 20 72 65  F_Recursive ) re
25390 74 75 72 6e 20 30 3b 20 20 2f 2a 20 72 65 73 74  turn 0;  /* rest
253a0 72 69 63 74 69 6f 6e 20 28 32 29 20 2a 2f 0a 0a  riction (2) */..
253b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
253c0 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
253d0 20 69 66 28 20 70 53 75 62 71 2d 3e 70 57 69 6e   if( pSubq->pWin
253e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
253f0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
25400 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 4f 6e  TE_DEBUG.  /* On
25410 6c 79 20 74 68 65 20 66 69 72 73 74 20 74 65 72  ly the first ter
25420 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  m of a compound 
25430 63 61 6e 20 68 61 76 65 20 61 20 57 49 54 48 20  can have a WITH 
25440 63 6c 61 75 73 65 2e 20 20 42 75 74 20 6d 61 6b  clause.  But mak
25450 65 0a 20 20 2a 2a 20 73 75 72 65 20 6e 6f 20 6f  e.  ** sure no o
25460 74 68 65 72 20 74 65 72 6d 73 20 61 72 65 20 6d  ther terms are m
25470 61 72 6b 65 64 20 53 46 5f 52 65 63 75 72 73 69  arked SF_Recursi
25480 76 65 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 74  ve in case somet
25490 68 69 6e 67 20 63 68 61 6e 67 65 73 0a 20 20 2a  hing changes.  *
254a0 2a 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  * in the future.
254b0 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 53 65  .  */.  {.    Se
254c0 6c 65 63 74 20 2a 70 58 3b 20 20 0a 20 20 20 20  lect *pX;  .    
254d0 66 6f 72 28 70 58 3d 70 53 75 62 71 3b 20 70 58  for(pX=pSubq; pX
254e0 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29  ; pX=pX->pPrior)
254f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
25500 28 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  (pX->selFlags & 
25510 28 53 46 5f 52 65 63 75 72 73 69 76 65 29 29 3d  (SF_Recursive))=
25520 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  =0 );.    }.  }.
25530 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 53  #endif..  if( pS
25540 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29  ubq->pLimit!=0 )
25550 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
25560 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  /* restriction (
25570 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c  3) */.  }.  whil
25580 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54  e( pWhere->op==T
25590 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 6e 43 68  K_AND ){.    nCh
255a0 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77 6e 57 68  ng += pushDownWh
255b0 65 72 65 54 65 72 6d 73 28 70 50 61 72 73 65 2c  ereTerms(pParse,
255c0 20 70 53 75 62 71 2c 20 70 57 68 65 72 65 2d 3e   pSubq, pWhere->
255d0 70 52 69 67 68 74 2c 0a 20 20 20 20 20 20 20 20  pRight,.        
255e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255f0 20 20 20 20 20 20 20 20 69 43 75 72 73 6f 72 2c          iCursor,
25600 20 69 73 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20   isLeftJoin);.  
25610 20 20 70 57 68 65 72 65 20 3d 20 70 57 68 65 72    pWhere = pWher
25620 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20  e->pLeft;.  }.  
25630 69 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e 0a 20  if( isLeftJoin. 
25640 20 20 26 26 20 28 45 78 70 72 48 61 73 50 72 6f    && (ExprHasPro
25650 70 65 72 74 79 28 70 57 68 65 72 65 2c 45 50 5f  perty(pWhere,EP_
25660 46 72 6f 6d 4a 6f 69 6e 29 3d 3d 30 0a 20 20 20  FromJoin)==0.   
25670 20 20 20 20 20 20 7c 7c 20 70 57 68 65 72 65 2d        || pWhere-
25680 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
25690 21 3d 69 43 75 72 73 6f 72 29 0a 20 20 29 7b 0a  !=iCursor).  ){.
256a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a      return 0; /*
256b0 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   restriction (4)
256c0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 45 78   */.  }.  if( Ex
256d0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 57  prHasProperty(pW
256e0 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e  here,EP_FromJoin
256f0 29 20 26 26 20 70 57 68 65 72 65 2d 3e 69 52 69  ) && pWhere->iRi
25700 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 69 43  ghtJoinTable!=iC
25710 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  ursor ){.    ret
25720 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74 72 69  urn 0; /* restri
25730 63 74 69 6f 6e 20 28 35 29 20 2a 2f 0a 20 20 7d  ction (5) */.  }
25740 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
25750 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e  prIsTableConstan
25760 74 28 70 57 68 65 72 65 2c 20 69 43 75 72 73 6f  t(pWhere, iCurso
25770 72 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b  r) ){.    nChng+
25780 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53  +;.    while( pS
25790 75 62 71 20 29 7b 0a 20 20 20 20 20 20 53 75 62  ubq ){.      Sub
257a0 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20  stContext x;.   
257b0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
257c0 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65 2d  3ExprDup(pParse-
257d0 3e 64 62 2c 20 70 57 68 65 72 65 2c 20 30 29 3b  >db, pWhere, 0);
257e0 0a 20 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e  .      unsetJoin
257f0 45 78 70 72 28 70 4e 65 77 2c 20 2d 31 29 3b 0a  Expr(pNew, -1);.
25800 20 20 20 20 20 20 78 2e 70 50 61 72 73 65 20 3d        x.pParse =
25810 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 78   pParse;.      x
25820 2e 69 54 61 62 6c 65 20 3d 20 69 43 75 72 73 6f  .iTable = iCurso
25830 72 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65 77 54  r;.      x.iNewT
25840 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a  able = iCursor;.
25850 20 20 20 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f        x.isLeftJo
25860 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 78 2e  in = 0;.      x.
25870 70 45 4c 69 73 74 20 3d 20 70 53 75 62 71 2d 3e  pEList = pSubq->
25880 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4e  pEList;.      pN
25890 65 77 20 3d 20 73 75 62 73 74 45 78 70 72 28 26  ew = substExpr(&
258a0 78 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  x, pNew);.      
258b0 69 66 28 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c  if( pSubq->selFl
258c0 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
258d0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53  te ){.        pS
258e0 75 62 71 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ubq->pHaving = s
258f0 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
25900 61 72 73 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d  arse->db, pSubq-
25910 3e 70 48 61 76 69 6e 67 2c 20 70 4e 65 77 29 3b  >pHaving, pNew);
25920 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
25930 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70 57 68        pSubq->pWh
25940 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
25950 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  rAnd(pParse->db,
25960 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 2c 20   pSubq->pWhere, 
25970 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
25980 20 20 20 20 20 70 53 75 62 71 20 3d 20 70 53 75       pSubq = pSu
25990 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  bq->pPrior;.    
259a0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
259b0 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Chng;.}.#endif /
259c0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
259d0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
259e0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
259f0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a  ITE_OMIT_VIEW) *
25a00 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 46 75  /../*.** The pFu
25a10 6e 63 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  nc is the only a
25a20 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
25a30 6e 20 69 6e 20 74 68 65 20 71 75 65 72 79 2e 20  n in the query. 
25a40 20 43 68 65 63 6b 20 74 6f 20 73 65 65 0a 2a 2a   Check to see.**
25a50 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
25a60 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
25a70 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74   the min/max opt
25a80 69 6d 69 7a 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a  imization. .**.*
25a90 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  * If the query i
25aa0 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
25ab0 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70  r the min/max op
25ac0 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68 65 6e  timization, then
25ad0 20 73 65 74 0a 2a 2a 20 2a 70 70 4d 69 6e 4d 61   set.** *ppMinMa
25ae0 78 20 74 6f 20 62 65 20 61 6e 20 4f 52 44 45 52  x to be an ORDER
25af0 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65   BY clause to be
25b00 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 6f 70   used for the op
25b10 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e  timization.** an
25b20 64 20 72 65 74 75 72 6e 20 65 69 74 68 65 72 20  d return either 
25b30 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
25b40 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52  N or WHERE_ORDER
25b50 42 59 5f 4d 41 58 20 64 65 70 65 6e 64 69 6e 67  BY_MAX depending
25b60 20 6f 6e 0a 2a 2a 20 77 68 65 74 68 65 72 20 70   on.** whether p
25b70 46 75 6e 63 20 69 73 20 61 20 6d 69 6e 28 29 20  Func is a min() 
25b80 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74 69 6f  or max() functio
25b90 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
25ba0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 63  query is not a c
25bb0 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65  andidate for the
25bc0 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a   min/max optimiz
25bd0 61 74 69 6f 6e 2c 20 72 65 74 75 72 6e 0a 2a 2a  ation, return.**
25be0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
25bf0 4f 52 4d 41 4c 20 28 77 68 69 63 68 20 6d 75 73  ORMAL (which mus
25c00 74 20 62 65 20 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a  t be zero)..**.*
25c10 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
25c20 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 61 66  ust be called af
25c30 74 65 72 20 61 67 67 72 65 67 61 74 65 20 66 75  ter aggregate fu
25c40 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65  nctions have bee
25c50 6e 0a 2a 2a 20 6c 6f 63 61 74 65 64 20 62 75 74  n.** located but
25c60 20 62 65 66 6f 72 65 20 74 68 65 69 72 20 61 72   before their ar
25c70 67 75 6d 65 6e 74 73 20 68 61 76 65 20 62 65 65  guments have bee
25c80 6e 20 73 75 62 6a 65 63 74 65 64 20 74 6f 20 61  n subjected to a
25c90 67 67 72 65 67 61 74 65 0a 2a 2a 20 61 6e 61 6c  ggregate.** anal
25ca0 79 73 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ysis..*/.static 
25cb0 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 73  u8 minMaxQuery(s
25cc0 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78 70 72  qlite3 *db, Expr
25cd0 20 2a 70 46 75 6e 63 2c 20 45 78 70 72 4c 69 73   *pFunc, ExprLis
25ce0 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20  t **ppMinMax){. 
25cf0 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45 52   int eRet = WHER
25d00 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
25d10 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ;      /* Return
25d20 20 76 61 6c 75 65 20 2a 2f 0a 20 20 45 78 70 72   value */.  Expr
25d30 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20 70  List *pEList = p
25d40 46 75 6e 63 2d 3e 78 2e 70 4c 69 73 74 3b 20 20  Func->x.pList;  
25d50 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74    /* Arguments t
25d60 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a  o agg function *
25d70 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
25d80 7a 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20 20  zFunc;          
25d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
25da0 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66  e of aggregate f
25db0 75 6e 63 74 69 6f 6e 20 70 46 75 6e 63 20 2a 2f  unction pFunc */
25dc0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
25dd0 64 65 72 42 79 3b 0a 20 20 75 38 20 73 6f 72 74  derBy;.  u8 sort
25de0 4f 72 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  Order;..  assert
25df0 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 29  ( *ppMinMax==0 )
25e00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 75 6e  ;.  assert( pFun
25e10 63 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55  c->op==TK_AGG_FU
25e20 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 69 66 28 20  NCTION );.  if( 
25e30 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c  pEList==0 || pEL
25e40 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20  ist->nExpr!=1 ) 
25e50 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 20 20 7a  return eRet;.  z
25e60 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e 75 2e  Func = pFunc->u.
25e70 7a 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 73 71  zToken;.  if( sq
25e80 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
25e90 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b  nc, "min")==0 ){
25ea0 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52  .    eRet = WHER
25eb0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20  E_ORDERBY_MIN;. 
25ec0 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 53     sortOrder = S
25ed0 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 0a 20 20  QLITE_SO_ASC;.  
25ee0 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
25ef0 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20  3StrICmp(zFunc, 
25f00 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "max")==0 ){.   
25f10 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
25f20 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 73  DERBY_MAX;.    s
25f30 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54  ortOrder = SQLIT
25f40 45 5f 53 4f 5f 44 45 53 43 3b 0a 20 20 7d 65 6c  E_SO_DESC;.  }el
25f50 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 65  se{.    return e
25f60 52 65 74 3b 0a 20 20 7d 0a 20 20 2a 70 70 4d 69  Ret;.  }.  *ppMi
25f70 6e 4d 61 78 20 3d 20 70 4f 72 64 65 72 42 79 20  nMax = pOrderBy 
25f80 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
25f90 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c  tDup(db, pEList,
25fa0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
25fb0 4f 72 64 65 72 42 79 21 3d 30 20 7c 7c 20 64 62  OrderBy!=0 || db
25fc0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
25fd0 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
25fe0 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30   ) pOrderBy->a[0
25ff0 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f  ].sortOrder = so
26000 72 74 4f 72 64 65 72 3b 0a 20 20 72 65 74 75 72  rtOrder;.  retur
26010 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n eRet;.}../*.**
26020 20 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74   The select stat
26030 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20  ement passed as 
26040 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
26050 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  nt is an aggrega
26060 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65  te query..** The
26070 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
26080 20 69 73 20 74 68 65 20 61 73 73 6f 63 69 61 74   is the associat
26090 65 64 20 61 67 67 72 65 67 61 74 65 2d 69 6e 66  ed aggregate-inf
260a0 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 0a  o object. This .
260b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65 73 74  ** function test
260c0 73 20 69 66 20 74 68 65 20 53 45 4c 45 43 54 20  s if the SELECT 
260d0 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
260e0 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
260f0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62  ount(*) FROM <tb
26100 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74  l>.**.** where t
26110 61 62 6c 65 20 69 73 20 61 20 64 61 74 61 62 61  able is a databa
26120 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20  se table, not a 
26130 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69  sub-select or vi
26140 65 77 2e 20 49 66 20 74 68 65 20 71 75 65 72 79  ew. If the query
26150 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68 20 74  .** does match t
26160 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74 68 65  his pattern, the
26170 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
26180 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
26190 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20  representing.** 
261a0 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72 6e 65  <tbl> is returne
261b0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20  d. Otherwise, 0 
261c0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
261d0 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a 69 73  static Table *is
261e0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65  SimpleCount(Sele
261f0 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a  ct *p, AggInfo *
26200 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62  pAggInfo){.  Tab
26210 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78 70 72  le *pTab;.  Expr
26220 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73 73 65   *pExpr;..  asse
26230 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70 42 79  rt( !p->pGroupBy
26240 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57   );..  if( p->pW
26250 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73  here || p->pELis
26260 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20 20 20  t->nExpr!=1 .   
26270 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  || p->pSrc->nSrc
26280 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e  !=1 || p->pSrc->
26290 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29  a[0].pSelect.  )
262a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
262b0 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e    }.  pTab = p->
262c0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
262d0 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70 45  .  pExpr = p->pE
262e0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
262f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
26300 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65 6c 65   && !pTab->pSele
26310 63 74 20 26 26 20 70 45 78 70 72 20 29 3b 0a 0a  ct && pExpr );..
26320 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
26330 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30  pTab) ) return 0
26340 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
26350 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p!=TK_AGG_FUNCTI
26360 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ON ) return 0;. 
26370 20 69 66 28 20 4e 45 56 45 52 28 70 41 67 67 49   if( NEVER(pAggI
26380 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29  nfo->nFunc==0) )
26390 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
263a0 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e   (pAggInfo->aFun
263b0 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63  c[0].pFunc->func
263c0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55 4e  Flags&SQLITE_FUN
263d0 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65  C_COUNT)==0 ) re
263e0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
263f0 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69  xpr->flags&EP_Di
26400 73 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20  stinct ) return 
26410 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70 54 61  0;..  return pTa
26420 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  b;.}../*.** If t
26430 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 69  he source-list i
26440 74 65 6d 20 70 61 73 73 65 64 20 61 73 20 61 6e  tem passed as an
26450 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 61 75   argument was au
26460 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61 6e 0a  gmented with an.
26470 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  ** INDEXED BY cl
26480 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79 20 74  ause, then try t
26490 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73 70 65  o locate the spe
264a0 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20 49 66  cified index. If
264b0 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20 73 75   there.** was su
264c0 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e 64 20  ch a clause and 
264d0 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
264e0 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c  cannot be found,
264f0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
26500 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c 65 61  TE_ERROR and lea
26510 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70  ve an error in p
26520 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69 73 65  Parse. Otherwise
26530 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70  , populate .** p
26540 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64  From->pIndex and
26550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26560 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
26570 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
26580 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
26590 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
265a0 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  tem *pFrom){.  i
265b0 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26  f( pFrom->pTab &
265c0 26 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e  & pFrom->fg.isIn
265d0 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20 20 54  dexedBy ){.    T
265e0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
265f0 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68  om->pTab;.    ch
26600 61 72 20 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d  ar *zIndexedBy =
26610 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65   pFrom->u1.zInde
26620 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64 65 78  xedBy;.    Index
26630 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
26640 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
26650 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  x; .        pIdx
26660 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
26670 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  mp(pIdx->zName, 
26680 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a 20 20  zIndexedBy); .  
26690 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d        pIdx=pIdx-
266a0 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20  >pNext.    );.  
266b0 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20    if( !pIdx ){. 
266c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
266d0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
266e0 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22   such index: %s"
266f0 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20 30 29  , zIndexedBy, 0)
26700 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
26710 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
26720 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
26730 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
26740 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42  }.    pFrom->pIB
26750 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20  Index = pIdx;.  
26760 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
26770 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65  E_OK;.}./*.** De
26780 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45  tect compound SE
26790 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
267a0 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45  that use an ORDE
267b0 52 20 42 59 20 63 6c 61 75 73 65 20 77 69 74 68  R BY clause with
267c0 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74   .** an alternat
267d0 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ive collating se
267e0 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  quence..**.**   
267f0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
26800 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
26810 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52  T ... FROM t2 OR
26820 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54  DER BY .. COLLAT
26830 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  E ....**.** Thes
26840 65 20 61 72 65 20 72 65 77 72 69 74 74 65 6e 20  e are rewritten 
26850 61 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a  as a subquery:.*
26860 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
26870 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
26880 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
26890 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
268a0 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45   t2).**     ORDE
268b0 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45  R BY ... COLLATE
268c0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ....**.** This 
268d0 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
268e0 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61  s necessary beca
268f0 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c  use the multiSel
26900 65 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75  ectOrderBy() rou
26910 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68  tine.** above th
26920 61 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  at generates the
26930 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
26940 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68  ound SELECT with
26950 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
26960 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65  use.** uses a me
26970 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68  rge algorithm th
26980 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65 20  at requires the 
26990 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  same collating s
269a0 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a  equence on the.*
269b0 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  * result columns
269c0 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52   as on the ORDER
269d0 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65   BY clause.  See
269e0 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a   ticket.** http:
269f0 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
26a00 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37  /src/info/670957
26a10 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  4d2a.**.** This 
26a20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
26a30 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f  s only needed fo
26a40 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53  r EXCEPT, INTERS
26a50 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a  ECT, and UNION..
26a60 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ** The UNION ALL
26a70 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20   operator works 
26a80 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53  fine with multiS
26a90 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 65  electOrderBy() e
26aa0 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72  ven when.** ther
26ab0 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65  e are COLLATE te
26ac0 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
26ad0 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   BY..*/.static i
26ae0 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75  nt convertCompou
26af0 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
26b00 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ry(Walker *pWalk
26b10 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
26b20 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63    int i;.  Selec
26b30 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63  t *pNew;.  Selec
26b40 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33  t *pX;.  sqlite3
26b50 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45   *db;.  struct E
26b60 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
26b70 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
26b80 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Src;.  Parse *pP
26b90 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75  arse;.  Token du
26ba0 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  mmy;..  if( p->p
26bb0 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72  Prior==0 ) retur
26bc0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
26bd0 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
26be0 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  y==0 ) return WR
26bf0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f  C_Continue;.  fo
26c00 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70  r(pX=p; pX && (p
26c10 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  X->op==TK_ALL ||
26c20 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45   pX->op==TK_SELE
26c30 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69  CT); pX=pX->pPri
26c40 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d  or){}.  if( pX==
26c50 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
26c60 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70  ontinue;.  a = p
26c70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20  ->pOrderBy->a;. 
26c80 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72   for(i=p->pOrder
26c90 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d  By->nExpr-1; i>=
26ca0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28  0; i--){.    if(
26cb0 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61   a[i].pExpr->fla
26cc0 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
26cd0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
26ce0 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20  f( i<0 ) return 
26cf0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20  WRC_Continue;.. 
26d00 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
26d10 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74  this point, that
26d20 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73   means the trans
26d30 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71  formation is req
26d40 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61  uired. */..  pPa
26d50 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
26d60 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
26d70 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77  arse->db;.  pNew
26d80 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
26d90 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
26da0 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
26db0 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
26dc0 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
26dd0 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30  memset(&dummy, 0
26de0 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29  , sizeof(dummy))
26df0 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71  ;.  pNewSrc = sq
26e00 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
26e10 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73  ndFromTerm(pPars
26e20 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70  e,0,0,0,&dummy,p
26e30 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20  New,0,0);.  if( 
26e40 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74  pNewSrc==0 ) ret
26e50 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
26e60 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70   *pNew = *p;.  p
26e70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63  ->pSrc = pNewSrc
26e80 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20  ;.  p->pEList = 
26e90 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
26ea0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
26eb0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
26ec0 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30 29   TK_ASTERISK, 0)
26ed0 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  );.  p->op = TK_
26ee0 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68  SELECT;.  p->pWh
26ef0 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ere = 0;.  pNew-
26f00 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20  >pGroupBy = 0;. 
26f10 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
26f20 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64   0;.  pNew->pOrd
26f30 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70  erBy = 0;.  p->p
26f40 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e  Prior = 0;.  p->
26f50 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  pNext = 0;.  p->
26f60 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e  pWith = 0;.  p->
26f70 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
26f80 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65  Compound;.  asse
26f90 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  rt( (p->selFlags
26fa0 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 29   & SF_Converted)
26fb0 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46  ==0 );.  p->selF
26fc0 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65  lags |= SF_Conve
26fd0 72 74 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20  rted;.  assert( 
26fe0 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20  pNew->pPrior!=0 
26ff0 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f  );.  pNew->pPrio
27000 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b  r->pNext = pNew;
27010 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
27020 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  = 0;.  return WR
27030 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
27040 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
27050 65 20 69 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  e if the FROM cl
27060 61 75 73 65 20 74 65 72 6d 20 70 46 72 6f 6d 20  ause term pFrom 
27070 68 61 73 20 74 61 62 6c 65 2d 76 61 6c 75 65 64  has table-valued
27080 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 67   function.** arg
27090 75 6d 65 6e 74 73 2e 20 20 49 66 20 69 74 20 64  uments.  If it d
270a0 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  oes, leave an er
270b0 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
270c0 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
270d0 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69  .** non-zero, si
270e0 6e 63 65 20 70 46 72 6f 6d 20 69 73 20 6e 6f 74  nce pFrom is not
270f0 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 61   allowed to be a
27100 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75   table-valued fu
27110 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
27120 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65 46 75  c int cannotBeFu
27130 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  nction(Parse *pP
27140 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63  arse, struct Src
27150 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
27160 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  ){.  if( pFrom->
27170 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a  fg.isTabFunc ){.
27180 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
27190 4d 73 67 28 70 50 61 72 73 65 2c 20 22 27 25 73  Msg(pParse, "'%s
271a0 27 20 69 73 20 6e 6f 74 20 61 20 66 75 6e 63 74  ' is not a funct
271b0 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61  ion", pFrom->zNa
271c0 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
271d0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
271e0 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  0;.}..#ifndef SQ
271f0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a  LITE_OMIT_CTE./*
27200 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 57 69  .** Argument pWi
27210 74 68 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  th (which may be
27220 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f   NULL) points to
27230 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f   a linked list o
27240 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49 54  f nested .** WIT
27250 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d  H contexts, from
27260 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d   inner to outerm
27270 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61 62 6c  ost. If the tabl
27280 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
27290 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  .** FROM clause 
272a0 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20 69 73  element pItem is
272b0 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e   really a common
272c0 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73 69 6f  -table-expressio
272d0 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e  n (CTE) .** then
272e0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
272f0 72 20 74 6f 20 74 68 65 20 43 54 45 20 64 65 66  r to the CTE def
27300 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68 61 74  inition for that
27310 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73   table. Otherwis
27320 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c  e.** return NULL
27330 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e  ..**.** If a non
27340 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 72  -NULL value is r
27350 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a 70 70  eturned, set *pp
27360 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e 74  Context to point
27370 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a 20   to the With.** 
27380 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68 65 20  object that the 
27390 72 65 74 75 72 6e 65 64 20 43 54 45 20 62 65 6c  returned CTE bel
273a0 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  ongs to..*/.stat
273b0 69 63 20 73 74 72 75 63 74 20 43 74 65 20 2a 73  ic struct Cte *s
273c0 65 61 72 63 68 57 69 74 68 28 0a 20 20 57 69 74  earchWith(.  Wit
273d0 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20  h *pWith,       
273e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
273f0 43 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d 6f 73  Current innermos
27400 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 2a 2f  t WITH clause */
27410 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
27420 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20  t_item *pItem,  
27430 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
27440 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73  e element to res
27450 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a  olve */.  With *
27460 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20 20 20  *ppContext      
27470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
27480 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20 72 65  : WITH clause re
27490 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e  turn value belon
274a0 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f  gs to */.){.  co
274b0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
274c0 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44  .  if( pItem->zD
274d0 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20 28 7a  atabase==0 && (z
274e0 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e  Name = pItem->zN
274f0 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 57  ame)!=0 ){.    W
27500 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  ith *p;.    for(
27510 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d  p=pWith; p; p=p-
27520 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20 20  >pOuter){.      
27530 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
27540 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b  (i=0; i<p->nCte;
27550 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
27560 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
27570 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d  p(zName, p->a[i]
27580 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
27590 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e 74 65          *ppConte
275a0 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  xt = p;.        
275b0 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69    return &p->a[i
275c0 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
275d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
275e0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
275f0 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
27600 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20 61 20  tor maintains a 
27610 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76 65 20  stack of active 
27620 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20  WITH clauses.** 
27630 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d  with the inner-m
27640 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20  ost WITH clause 
27650 62 65 69 6e 67 20 61 74 20 74 68 65 20 74 6f 70  being at the top
27660 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a   of the stack..*
27670 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
27680 65 20 70 75 73 68 65 73 20 74 68 65 20 57 49 54  e pushes the WIT
27690 48 20 63 6c 61 75 73 65 20 70 61 73 73 65 64 20  H clause passed 
276a0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
276b0 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74  gument.** onto t
276c0 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
276d0 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e 74  ack. If argument
276e0 20 62 46 72 65 65 20 69 73 20 74 72 75 65 2c 20   bFree is true, 
276f0 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54  then this.** WIT
27700 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65  H clause will ne
27710 76 65 72 20 62 65 20 70 6f 70 70 65 64 20 66 72  ver be popped fr
27720 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20 49 6e  om the stack. In
27730 20 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a 2a   this case it.**
27740 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64   should be freed
27750 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
27760 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e  Parse object. In
27770 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 77 68   other cases, wh
27780 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20  en.** bFree==0, 
27790 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20  the With object 
277a0 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61 6c  will be freed al
277b0 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53 45 4c  ong with the SEL
277c0 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ECT .** statemen
277d0 74 20 77 69 74 68 20 77 68 69 63 68 20 69 74 20  t with which it 
277e0 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a  is associated..*
277f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
27800 74 68 50 75 73 68 28 50 61 72 73 65 20 2a 70 50  thPush(Parse *pP
27810 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69 74  arse, With *pWit
27820 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a 20 20  h, u8 bFree){.  
27830 61 73 73 65 72 74 28 20 62 46 72 65 65 3d 3d 30  assert( bFree==0
27840 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70 57 69   || (pParse->pWi
27850 74 68 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  th==0 && pParse-
27860 3e 70 57 69 74 68 54 6f 46 72 65 65 3d 3d 30 29  >pWithToFree==0)
27870 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20   );.  if( pWith 
27880 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
27890 50 61 72 73 65 2d 3e 70 57 69 74 68 21 3d 70 57  Parse->pWith!=pW
278a0 69 74 68 20 29 3b 0a 20 20 20 20 70 57 69 74 68  ith );.    pWith
278b0 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61 72 73  ->pOuter = pPars
278c0 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50  e->pWith;.    pP
278d0 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57  arse->pWith = pW
278e0 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62 46 72  ith;.    if( bFr
278f0 65 65 20 29 20 70 50 61 72 73 65 2d 3e 70 57 69  ee ) pParse->pWi
27900 74 68 54 6f 46 72 65 65 20 3d 20 70 57 69 74 68  thToFree = pWith
27910 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
27920 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
27930 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20  cks if argument 
27940 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20  pFrom refers to 
27950 61 20 43 54 45 20 64 65 63 6c 61 72 65 64 20 62  a CTE declared b
27960 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61  y .** a WITH cla
27970 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  use on the stack
27980 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74   currently maint
27990 61 69 6e 65 64 20 62 79 20 74 68 65 20 70 61 72  ained by the par
279a0 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20  ser. And,.** if 
279b0 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73  currently proces
279c0 73 69 6e 67 20 61 20 43 54 45 20 65 78 70 72 65  sing a CTE expre
279d0 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20  ssion, if it is 
279e0 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72  a recursive.** r
279f0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
27a00 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a  current CTE..**.
27a10 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c  ** If pFrom fall
27a20 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66  s into either of
27a30 20 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72   the two categor
27a40 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d  ies above, pFrom
27a50 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74  ->pTab.** and ot
27a60 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 70  her fields are p
27a70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69  opulated accordi
27a80 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72  ngly. The caller
27a90 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a   should check.**
27aa0 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30   (pFrom->pTab!=0
27ab0 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  ) to determine w
27ac0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
27ad0 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68  successful match
27ae0 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a  .** was found..*
27af0 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
27b00 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20 66  not a match is f
27b10 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ound, SQLITE_OK 
27b20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
27b30 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  o error.** occur
27b40 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64  s. If an error d
27b50 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72  oes occur, an er
27b60 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
27b70 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  tored in the.** 
27b80 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20  parser and some 
27b90 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
27ba0 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
27bb0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
27bc0 74 69 63 20 69 6e 74 20 77 69 74 68 45 78 70 61  tic int withExpa
27bd0 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57  nd(.  Walker *pW
27be0 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74  alker, .  struct
27bf0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
27c00 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20  From.){.  Parse 
27c10 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
27c20 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c  r->pParse;.  sql
27c30 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
27c40 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20  e->db;.  struct 
27c50 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20  Cte *pCte;      
27c60 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63           /* Matc
27c70 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c  hed CTE (or NULL
27c80 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f   if no match) */
27c90 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20  .  With *pWith; 
27ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cb0 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73     /* WITH claus
27cc0 65 20 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f  e that pCte belo
27cd0 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
27ce0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
27cf0 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d  ==0 );..  pCte =
27d00 20 73 65 61 72 63 68 57 69 74 68 28 70 50 61 72   searchWith(pPar
27d10 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d  se->pWith, pFrom
27d20 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28  , &pWith);.  if(
27d30 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62   pCte ){.    Tab
27d40 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78  le *pTab;.    Ex
27d50 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
27d60 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
27d70 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  ;.    Select *pL
27d80 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  eft;            
27d90 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74      /* Left-most
27da0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
27db0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61  t */.    int bMa
27dc0 79 52 65 63 75 72 73 69 76 65 3b 20 20 20 20 20  yRecursive;     
27dd0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
27de0 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65  f compound joine
27df0 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d  d by UNION [ALL]
27e00 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53   */.    With *pS
27e10 61 76 65 64 57 69 74 68 3b 20 20 20 20 20 20 20  avedWith;       
27e20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
27e30 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65   value of pParse
27e40 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20  ->pWith */..    
27e50 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65  /* If pCte->zCte
27e60 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  Err is non-NULL 
27e70 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
27e80 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e 20 69  hen this is an i
27e90 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65  llegal.    ** re
27ea0 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
27eb0 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e 20 4c  e to CTE pCte. L
27ec0 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
27ed0 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
27ee0 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e  rn.    ** early.
27ef0 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72   If pCte->zCteEr
27f00 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  r is NULL, then 
27f10 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  this is not a re
27f20 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
27f30 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  e..    ** In thi
27f40 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e  s case, proceed.
27f50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74    */.    if( pCt
27f60 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a 20 20  e->zCteErr ){.  
27f70 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
27f80 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43 74 65  Msg(pParse, pCte
27f90 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43 74 65 2d  ->zCteErr, pCte-
27fa0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  >zName);.      r
27fb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
27fc0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
27fd0 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69  ( cannotBeFuncti
27fe0 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d  on(pParse, pFrom
27ff0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
28000 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 61 73  E_ERROR;..    as
28010 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
28020 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f  b==0 );.    pFro
28030 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
28040 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
28050 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
28060 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28  Table));.    if(
28070 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
28080 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
28090 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d   pTab->nTabRef =
280a0 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e   1;.    pTab->zN
280b0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
280c0 74 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e  trDup(db, pCte->
280d0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62  zName);.    pTab
280e0 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
280f0 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45    pTab->nRowLogE
28100 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
28110 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
28120 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
28130 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
28140 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65  ags |= TF_Epheme
28150 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62  ral | TF_NoVisib
28160 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70 46 72  leRowid;.    pFr
28170 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
28180 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
28190 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74  b, pCte->pSelect
281a0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 0);.    if( db
281b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
281c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
281d0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61  OMEM_BKPT;.    a
281e0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53  ssert( pFrom->pS
281f0 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a  elect );..    /*
28200 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69   Check if this i
28210 73 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54  s a recursive CT
28220 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d  E. */.    pSel =
28230 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
28240 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72 73 69  .    bMayRecursi
28250 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d  ve = ( pSel->op=
28260 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d  =TK_ALL || pSel-
28270 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
28280 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63  .    if( bMayRec
28290 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
282a0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63  int i;.      Src
282b0 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72  List *pSrc = pFr
282c0 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72  om->pSelect->pSr
282d0 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  c;.      for(i=0
282e0 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20  ; i<pSrc->nSrc; 
282f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74  i++){.        st
28300 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
28310 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63  m *pItem = &pSrc
28320 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[i];.        
28330 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  if( pItem->zData
28340 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20  base==0 .       
28350 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d    && pItem->zNam
28360 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26  e!=0 .         &
28370 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  & 0==sqlite3StrI
28380 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  Cmp(pItem->zName
28390 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20  , pCte->zName). 
283a0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
283b0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
283c0 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20  b = pTab;.      
283d0 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73      pItem->fg.is
283e0 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20  Recursive = 1;. 
283f0 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
28400 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  TabRef++;.      
28410 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61      pSel->selFla
28420 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72 73 69  gs |= SF_Recursi
28430 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ve;.        }.  
28440 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
28450 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63   /* Only one rec
28460 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
28470 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a   is permitted. *
28480 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  / .    if( pTab-
28490 3e 6e 54 61 62 52 65 66 3e 32 20 29 7b 0a 20 20  >nTabRef>2 ){.  
284a0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
284b0 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20 20 70  Msg(.          p
284c0 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65  Parse, "multiple
284d0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72   references to r
284e0 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20  ecursive table: 
284f0 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  %s", pCte->zName
28500 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
28510 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
28520 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ROR;.    }.    a
28530 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 54 61  ssert( pTab->nTa
28540 62 52 65 66 3d 3d 31 20 7c 7c 20 0a 20 20 20 20  bRef==1 || .    
28550 20 20 20 20 20 20 20 20 28 28 70 53 65 6c 2d 3e          ((pSel->
28560 73 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75  selFlags&SF_Recu
28570 72 73 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e  rsive) && pTab->
28580 6e 54 61 62 52 65 66 3d 3d 32 20 29 29 3b 0a 0a  nTabRef==2 ));..
28590 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
285a0 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65  r = "circular re
285b0 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20  ference: %s";.  
285c0 20 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70    pSavedWith = p
285d0 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20  Parse->pWith;.  
285e0 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
285f0 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28  = pWith;.    if(
28600 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29   bMayRecursive )
28610 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  {.      Select *
28620 70 50 72 69 6f 72 20 3d 20 70 53 65 6c 2d 3e 70  pPrior = pSel->p
28630 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 61 73 73  Prior;.      ass
28640 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 57 69  ert( pPrior->pWi
28650 74 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  th==0 );.      p
28660 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 70  Prior->pWith = p
28670 53 65 6c 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  Sel->pWith;.    
28680 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
28690 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 50 72  ect(pWalker, pPr
286a0 69 6f 72 29 3b 0a 20 20 20 20 20 20 70 50 72 69  ior);.      pPri
286b0 6f 72 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20  or->pWith = 0;. 
286c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
286d0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
286e0 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
286f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
28700 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
28710 68 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66  h;..    for(pLef
28720 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70  t=pSel; pLeft->p
28730 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65  Prior; pLeft=pLe
28740 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20  ft->pPrior);.   
28750 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d   pEList = pLeft-
28760 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28  >pEList;.    if(
28770 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a   pCte->pCols ){.
28780 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74        if( pEList
28790 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   && pEList->nExp
287a0 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e  r!=pCte->pCols->
287b0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
287c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
287d0 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
287e0 25 73 20 68 61 73 20 25 64 20 76 61 6c 75 65 73  %s has %d values
287f0 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22   for %d columns"
28800 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ,.            pC
28810 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73  te->zName, pELis
28820 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e  t->nExpr, pCte->
28830 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20  pCols->nExpr.   
28840 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
28850 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
28860 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20  pSavedWith;.    
28870 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28880 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
28890 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
288a0 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20  pCte->pCols;.   
288b0 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43   }..    sqlite3C
288c0 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
288d0 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  st(pParse, pELis
288e0 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  t, &pTab->nCol, 
288f0 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
28900 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73    if( bMayRecurs
28910 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ive ){.      if(
28920 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
28930 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29  & SF_Recursive )
28940 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e  {.        pCte->
28950 7a 43 74 65 45 72 72 20 3d 20 22 6d 75 6c 74 69  zCteErr = "multi
28960 70 6c 65 20 72 65 63 75 72 73 69 76 65 20 72 65  ple recursive re
28970 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20  ferences: %s";. 
28980 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28990 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
289a0 72 20 3d 20 22 72 65 63 75 72 73 69 76 65 20 72  r = "recursive r
289b0 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75  eference in a su
289c0 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20  bquery: %s";.   
289d0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
289e0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
289f0 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20  lker, pSel);.   
28a00 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74   }.    pCte->zCt
28a10 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50  eErr = 0;.    pP
28a20 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53  arse->pWith = pS
28a30 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20  avedWith;.  }.. 
28a40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28a50 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
28a60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28a70 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  _CTE./*.** If th
28a80 65 20 53 45 4c 45 43 54 20 70 61 73 73 65 64 20  e SELECT passed 
28a90 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
28aa0 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73  gument has an as
28ab0 73 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a  sociated WITH .*
28ac0 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74  * clause, pop it
28ad0 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20   from the stack 
28ae0 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
28af0 66 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  f the Parse obje
28b00 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ct..**.** This f
28b10 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
28b20 61 73 20 74 68 65 20 78 53 65 6c 65 63 74 43 61  as the xSelectCa
28b30 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61  llback2() callba
28b40 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33  ck by.** sqlite3
28b50 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77  SelectExpand() w
28b60 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45  hen walking a SE
28b70 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72 65 73  LECT tree to res
28b80 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61  olve table.** na
28b90 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52  mes and other FR
28ba0 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
28bb0 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ts. .*/.static v
28bc0 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74  oid selectPopWit
28bd0 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  h(Walker *pWalke
28be0 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
28bf0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
28c00 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
28c10 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c  ;.  if( OK_IF_AL
28c20 57 41 59 53 5f 54 52 55 45 28 70 50 61 72 73 65  WAYS_TRUE(pParse
28c30 2d 3e 70 57 69 74 68 29 20 26 26 20 70 2d 3e 70  ->pWith) && p->p
28c40 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
28c50 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20 66 69  With *pWith = fi
28c60 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e  ndRightmost(p)->
28c70 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 70  pWith;.    if( p
28c80 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 20  With!=0 ){.     
28c90 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
28ca0 3e 70 57 69 74 68 3d 3d 70 57 69 74 68 20 29 3b  >pWith==pWith );
28cb0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70  .      pParse->p
28cc0 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f  With = pWith->pO
28cd0 75 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  uter;.    }.  }.
28ce0 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
28cf0 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a  selectPopWith 0.
28d00 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
28d10 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 73  e SrcList_item s
28d20 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
28d30 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
28d40 67 75 6d 65 6e 74 20 72 65 70 72 65 73 65 6e 74  gument represent
28d50 73 20 61 0a 2a 2a 20 73 75 62 2d 71 75 65 72 79  s a.** sub-query
28d60 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
28d70 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
28d80 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
28d90 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f  function.** allo
28da0 63 61 74 65 73 20 61 6e 64 20 70 6f 70 75 6c 61  cates and popula
28db0 74 65 73 20 74 68 65 20 53 72 63 4c 69 73 74 5f  tes the SrcList_
28dc0 69 74 65 6d 2e 70 54 61 62 20 6f 62 6a 65 63 74  item.pTab object
28dd0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
28de0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
28df0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
28e00 77 69 73 65 2c 20 69 66 20 61 6e 20 4f 4f 4d 20  wise, if an OOM 
28e10 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
28e20 65 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ered,.** SQLITE_
28e30 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  NOMEM..*/.int sq
28e40 6c 69 74 65 33 45 78 70 61 6e 64 53 75 62 71 75  lite3ExpandSubqu
28e50 65 72 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  ery(Parse *pPars
28e60 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  e, struct SrcLis
28e70 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a  t_item *pFrom){.
28e80 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
28e90 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
28ea0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
28eb0 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 20  .  assert( pSel 
28ec0 29 3b 0a 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62  );.  pFrom->pTab
28ed0 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65   = pTab = sqlite
28ee0 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
28ef0 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
28f00 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20  (Table));.  if( 
28f10 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
28f20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
28f30 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d   pTab->nTabRef =
28f40 20 31 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d   1;.  if( pFrom-
28f50 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 70  >zAlias ){.    p
28f60 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Tab->zName = sql
28f70 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
28f80 72 73 65 2d 3e 64 62 2c 20 70 46 72 6f 6d 2d 3e  rse->db, pFrom->
28f90 7a 41 6c 69 61 73 29 3b 0a 20 20 7d 65 6c 73 65  zAlias);.  }else
28fa0 7b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d  {.    pTab->zNam
28fb0 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
28fc0 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
28fd0 73 75 62 71 75 65 72 79 5f 25 70 22 2c 20 28 76  subquery_%p", (v
28fe0 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 7d 0a  oid*)pTab);.  }.
28ff0 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70    while( pSel->p
29000 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20  Prior ){ pSel = 
29010 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a  pSel->pPrior; }.
29020 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73    sqlite3Columns
29030 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
29040 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73  rse, pSel->pELis
29050 74 2c 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70  t,&pTab->nCol,&p
29060 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 70 54  Tab->aCol);.  pT
29070 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
29080 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45    pTab->nRowLogE
29090 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
290a0 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
290b0 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
290c0 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  .  pTab->tabFlag
290d0 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61  s |= TF_Ephemera
290e0 6c 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  l;..  return SQL
290f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
29100 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
29110 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61   a Walker callba
29120 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e  ck for "expandin
29130 67 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  g" a SELECT stat
29140 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e  ement..** "Expan
29150 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64  ding" means to d
29160 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  o the following:
29170 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d  .**.**    (1)  M
29180 61 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75  ake sure VDBE cu
29190 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
291a0 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
291b0 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20  to every.**     
291c0 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74      element of t
291d0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
291e0 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69  **.**    (2)  Fi
291f0 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  ll in the pTabLi
29200 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65  st->a[].pTab fie
29210 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69  lds in the SrcLi
29220 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20  st that .**     
29230 20 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d      defines FROM
29240 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76   clause.  When v
29250 69 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74  iews appear in t
29260 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a  he FROM clause,.
29270 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20  **         fill 
29280 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53  pTabList->a[].pS
29290 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70  elect with a cop
292a0 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
292b0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  statement.**    
292c0 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d       that implem
292d0 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20  ents the view.  
292e0 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f  A copy is made o
292f0 66 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c  f the view's SEL
29300 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  ECT.**         s
29310 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74  tatement so that
29320 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d   we can freely m
29330 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20  odify or delete 
29340 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a  that statement.*
29350 2a 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75  *         withou
29360 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74  t worrying about
29370 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20   messing up the 
29380 70 65 72 73 69 73 74 65 6e 74 20 72 65 70 72 65  persistent repre
29390 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20  sentation.**    
293a0 20 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77       of the view
293b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20  ..**.**    (3)  
293c0 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65  Add terms to the
293d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
293e0 20 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65   accommodate the
293f0 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
29400 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a  .**         on j
29410 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20  oins and the ON 
29420 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
29430 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a   of joins..**.**
29440 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68      (4)  Scan th
29450 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  e list of column
29460 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
29470 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f  set (pEList) loo
29480 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  king.**         
29490 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
294a0 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f   the "*" operato
294b0 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a  r or the TABLE.*
294c0 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20   operator..**   
294d0 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20        If found, 
294e0 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20  expand each "*" 
294f0 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
29500 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c  mn in every tabl
29510 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64  e.**         and
29520 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65   TABLE.* to be e
29530 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54  very column in T
29540 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  ABLE..**.*/.stat
29550 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70  ic int selectExp
29560 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57  ander(Walker *pW
29570 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
29580 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
29590 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
295a0 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  arse;.  int i, j
295b0 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  , k;.  SrcList *
295c0 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72  pTabList;.  Expr
295d0 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
295e0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
295f0 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71  tem *pFrom;.  sq
29600 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
29610 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
29620 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45  pE, *pRight, *pE
29630 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c  xpr;.  u16 selFl
29640 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67  ags = p->selFlag
29650 73 3b 0a 20 20 75 33 32 20 65 6c 69 73 74 46 6c  s;.  u32 elistFl
29660 61 67 73 20 3d 20 30 3b 0a 0a 20 20 70 2d 3e 73  ags = 0;..  p->s
29670 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78  elFlags |= SF_Ex
29680 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62  panded;.  if( db
29690 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20  ->mallocFailed  
296a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
296b0 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 61  C_Abort;.  }.  a
296c0 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d  ssert( p->pSrc!=
296d0 30 20 29 3b 0a 20 20 69 66 28 20 28 73 65 6c 46  0 );.  if( (selF
296e0 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64  lags & SF_Expand
296f0 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ed)!=0 ){.    re
29700 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
29710 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d    }.  pTabList =
29720 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
29730 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
29740 20 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73    sqlite3WithPus
29750 68 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 57 69  h(pParse, p->pWi
29760 74 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61  th, 0);..  /* Ma
29770 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e  ke sure cursor n
29780 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
29790 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
297a0 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a   entries in.  **
297b0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
297c0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
297d0 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
297e0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
297f0 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
29800 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a  rse, pTabList);.
29810 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76  .  /* Look up ev
29820 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  ery table named 
29830 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
29840 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  se of the select
29850 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e  .  If.  ** an en
29860 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  try of the FROM 
29870 63 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71  clause is a subq
29880 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20  uery instead of 
29890 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c  a table or view,
298a0 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74  .  ** then creat
298b0 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61  e a transient ta
298c0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ble structure to
298d0 20 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75   describe the su
298e0 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66  bquery..  */.  f
298f0 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
29900 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
29910 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
29920 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
29930 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
29940 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
29950 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 3d 3d  fg.isRecursive==
29960 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62  0 || pFrom->pTab
29970 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
29980 46 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72  From->fg.isRecur
29990 73 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sive ) continue;
299a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
299b0 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23  om->pTab==0 );.#
299c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
299d0 49 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77  IT_CTE.    if( w
299e0 69 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65  ithExpand(pWalke
299f0 72 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75  r, pFrom) ) retu
29a00 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
29a10 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61    if( pFrom->pTa
29a20 62 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64  b ) {} else.#end
29a30 69 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  if.    if( pFrom
29a40 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69  ->zName==0 ){.#i
29a50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29a60 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20  T_SUBQUERY.     
29a70 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20   Select *pSel = 
29a80 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
29a90 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71        /* A sub-q
29aa0 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d  uery in the FROM
29ab0 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c   clause of a SEL
29ac0 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ECT */.      ass
29ad0 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a  ert( pSel!=0 );.
29ae0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
29af0 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a  rom->pTab==0 );.
29b00 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
29b10 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
29b20 6b 65 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74  ker, pSel) ) ret
29b30 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
29b40 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
29b50 45 78 70 61 6e 64 53 75 62 71 75 65 72 79 28 70  ExpandSubquery(p
29b60 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20  Parse, pFrom) ) 
29b70 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
29b80 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
29b90 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
29ba0 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f  ordinary table o
29bb0 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74  r view name in t
29bc0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
29bd0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
29be0 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
29bf0 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
29c00 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c  Tab = pTab = sql
29c10 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
29c20 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70  tem(pParse, 0, p
29c30 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  From);.      if(
29c40 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
29c50 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
29c60 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61     if( pTab->nTa
29c70 62 52 65 66 3e 3d 30 78 66 66 66 66 20 29 7b 0a  bRef>=0xffff ){.
29c80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
29c90 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
29ca0 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65  "too many refere
29cb0 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20  nces to \"%s\": 
29cc0 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20  max 65535",.    
29cd0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
29ce0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72  me);.        pFr
29cf0 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  om->pTab = 0;.  
29d00 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
29d10 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
29d20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62        pTab->nTab
29d30 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Ref++;.      if(
29d40 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
29d50 29 20 26 26 20 63 61 6e 6e 6f 74 42 65 46 75 6e  ) && cannotBeFun
29d60 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46  ction(pParse, pF
29d70 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rom) ){.        
29d80 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
29d90 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21 64  ;.      }.#if !d
29da0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
29db0 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
29dc0 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49  ined (SQLITE_OMI
29dd0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
29de0 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
29df0 75 61 6c 28 70 54 61 62 29 20 7c 7c 20 70 54 61  ual(pTab) || pTa
29e00 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
29e10 20 20 20 20 20 20 69 31 36 20 6e 43 6f 6c 3b 0a        i16 nCol;.
29e20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
29e30 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
29e40 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
29e50 61 62 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  ab) ) return WRC
29e60 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20  _Abort;.        
29e70 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
29e80 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20  Select==0 );.   
29e90 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c       pFrom->pSel
29ea0 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
29eb0 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d  ectDup(db, pTab-
29ec0 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
29ed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
29ee0 65 63 74 53 65 74 4e 61 6d 65 28 70 46 72 6f 6d  ectSetName(pFrom
29ef0 2d 3e 70 53 65 6c 65 63 74 2c 20 70 54 61 62 2d  ->pSelect, pTab-
29f00 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
29f10 20 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   nCol = pTab->nC
29f20 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  ol;.        pTab
29f30 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20  ->nCol = -1;.   
29f40 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
29f50 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
29f60 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pFrom->pSelect);
29f70 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  .        pTab->n
29f80 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20  Col = nCol;.    
29f90 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
29fa0 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20  ..    /* Locate 
29fb0 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20  the index named 
29fc0 62 79 20 74 68 65 20 49 4e 44 45 58 45 44 20 42  by the INDEXED B
29fd0 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79  Y clause, if any
29fe0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
29ff0 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f  ite3IndexedByLoo
2a000 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f  kup(pParse, pFro
2a010 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  m) ){.      retu
2a020 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
2a030 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
2a040 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65  ocess NATURAL ke
2a050 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61  ywords, and ON a
2a060 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
2a070 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a   of joins..  */.
2a080 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2a090 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65  Failed || sqlite
2a0a0 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72  ProcessJoin(pPar
2a0b0 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65  se, p) ){.    re
2a0c0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
2a0d0 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76    }..  /* For ev
2a0e0 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63  ery "*" that occ
2a0f0 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  urs in the colum
2a100 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74  n list, insert t
2a110 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a  he names of.  **
2a120 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
2a130 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64  all tables.  And
2a140 20 66 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45   for every TABLE
2a150 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61  .* insert the na
2a160 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20  mes.  ** of all 
2a170 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45  columns in TABLE
2a180 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
2a190 73 65 72 74 65 64 20 61 20 73 70 65 63 69 61 6c  serted a special
2a1a0 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a   expression.  **
2a1b0 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41 53 54   with the TK_AST
2a1c0 45 52 49 53 4b 20 6f 70 65 72 61 74 6f 72 20 66  ERISK operator f
2a1d0 6f 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74  or each "*" that
2a1e0 20 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   it found in the
2a1f0 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6c 69 73   column.  ** lis
2a200 74 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  t.  The followin
2a210 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20  g code just has 
2a220 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b  to locate the TK
2a230 5f 41 53 54 45 52 49 53 4b 0a 20 20 2a 2a 20 65  _ASTERISK.  ** e
2a240 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65  xpressions and e
2a250 78 70 61 6e 64 20 65 61 63 68 20 6f 6e 65 20 74  xpand each one t
2a260 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
2a270 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a  l columns in.  *
2a280 2a 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20  * all tables..  
2a290 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73  **.  ** The firs
2a2a0 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63  t loop just chec
2a2b0 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
2a2c0 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f  re are any "*" o
2a2d0 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68  perators.  ** th
2a2e0 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e  at need expandin
2a2f0 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d  g..  */.  for(k=
2a300 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
2a310 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45  pr; k++){.    pE
2a320 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e   = pEList->a[k].
2a330 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
2a340 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45 52 49  E->op==TK_ASTERI
2a350 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  SK ) break;.    
2a360 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
2a370 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52  TK_DOT || pE->pR
2a380 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61  ight!=0 );.    a
2a390 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
2a3a0 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c  K_DOT || (pE->pL
2a3b0 65 66 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c  eft!=0 && pE->pL
2a3c0 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20  eft->op==TK_ID) 
2a3d0 29 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  );.    if( pE->o
2a3e0 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d  p==TK_DOT && pE-
2a3f0 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f  >pRight->op==TK_
2a400 41 53 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b  ASTERISK ) break
2a410 3b 0a 20 20 20 20 65 6c 69 73 74 46 6c 61 67 73  ;.    elistFlags
2a420 20 7c 3d 20 70 45 2d 3e 66 6c 61 67 73 3b 0a 20   |= pE->flags;. 
2a430 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69 73   }.  if( k<pELis
2a440 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
2a450 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65 20  /*.    ** If we 
2a460 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61 6e  get here it mean
2a470 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
2a480 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
2a490 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a 2a   more "*".    **
2a4a0 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
2a4b0 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e  need to be expan
2a4c0 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f 75  ded.  Loop throu
2a4d0 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
2a4e0 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  on.    ** in the
2a4f0 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20   result set and 
2a500 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65 20  expand them one 
2a510 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  by one..    */. 
2a520 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2a530 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45 4c  st_item *a = pEL
2a540 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70 72  ist->a;.    Expr
2a550 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  List *pNew = 0;.
2a560 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
2a570 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
2a580 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67 4e  s;.    int longN
2a590 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26 20  ames = (flags & 
2a5a0 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
2a5b0 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20 20  mes)!=0.        
2a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
2a5d0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2a5e0 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 3d  _ShortColNames)=
2a5f0 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30  =0;..    for(k=0
2a600 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
2a610 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70  r; k++){.      p
2a620 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
2a630 20 20 20 20 20 20 65 6c 69 73 74 46 6c 61 67 73        elistFlags
2a640 20 7c 3d 20 70 45 2d 3e 66 6c 61 67 73 3b 0a 20   |= pE->flags;. 
2a650 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45       pRight = pE
2a660 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
2a670 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d  assert( pE->op!=
2a680 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74  TK_DOT || pRight
2a690 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
2a6a0 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54 45   pE->op!=TK_ASTE
2a6b0 52 49 53 4b 0a 20 20 20 20 20 20 20 26 26 20 28  RISK.       && (
2a6c0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
2a6d0 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  | pRight->op!=TK
2a6e0 5f 41 53 54 45 52 49 53 4b 29 0a 20 20 20 20 20  _ASTERISK).     
2a6f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
2a700 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65  his particular e
2a710 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e  xpression does n
2a720 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  ot need to be ex
2a730 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20  panded..        
2a740 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
2a750 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
2a760 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
2a770 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
2a780 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2a790 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
2a7a0 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
2a7b0 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20  Expr-1].zName = 
2a7c0 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[k].zName;.    
2a7d0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
2a7e0 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70  ew->nExpr-1].zSp
2a7f0 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b  an = a[k].zSpan;
2a800 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  .          a[k].
2a810 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
2a820 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20       a[k].zSpan 
2a830 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
2a840 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70         a[k].pExp
2a850 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  r = 0;.      }el
2a860 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
2a870 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
2a880 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41  s a "*" or a "TA
2a890 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73  BLE.*" and needs
2a8a0 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a   to be.        *
2a8b0 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20  * expanded. */. 
2a8c0 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65         int table
2a8d0 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f  Seen = 0;      /
2a8e0 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20  * Set to 1 when 
2a8f0 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f  TABLE matches */
2a900 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
2a910 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  TName = 0;      
2a920 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65   /* text of name
2a930 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20   of TABLE */.   
2a940 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
2a950 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20  =TK_DOT ){.     
2a960 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
2a970 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20  >pLeft!=0 );.   
2a980 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
2a990 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2a9a0 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e  pE->pLeft, EP_In
2a9b0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
2a9c0 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45       zTName = pE
2a9d0 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  ->pLeft->u.zToke
2a9e0 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
2a9f0 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46       for(i=0, pF
2aa00 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
2aa10 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
2aa20 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
2aa30 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
2aa40 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
2aa50 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
2aa60 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
2aa70 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
2aa80 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
2aa90 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d  zTabName = pFrom
2aaa0 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ->zAlias;.      
2aab0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2aac0 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b  zSchemaName = 0;
2aad0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
2aae0 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  Db;.          if
2aaf0 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b  ( zTabName==0 ){
2ab00 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61  .            zTa
2ab10 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
2ab20 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ame;.          }
2ab30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64  .          if( d
2ab40 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2ab50 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2ab60 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c     if( pSub==0 |
2ab70 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  | (pSub->selFlag
2ab80 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
2ab90 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
2aba0 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20       pSub = 0;. 
2abb0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
2abc0 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33  TName && sqlite3
2abd0 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20  StrICmp(zTName, 
2abe0 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  zTabName)!=0 ){.
2abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
2ac00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2ac10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2ac20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
2ac30 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
2ac40 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
2ac50 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63  .            zSc
2ac60 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d  hemaName = iDb>=
2ac70 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  0 ? db->aDb[iDb]
2ac80 2e 7a 44 62 53 4e 61 6d 65 20 3a 20 22 2a 22 3b  .zDbSName : "*";
2ac90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2aca0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
2acb0 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
2acc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2acd0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54  char *zName = pT
2ace0 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
2acf0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  e;.            c
2ad00 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20  har *zColname;  
2ad10 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65 64 20  /* The computed 
2ad20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
2ad30 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
2ad40 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d  *zToFree;   /* M
2ad50 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67 20 74  alloced string t
2ad60 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
2ad70 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  freed */.       
2ad80 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e       Token sColn
2ad90 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ame;  /* Compute
2ada0 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73  d column name as
2adb0 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20   a token */..   
2adc0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2add0 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20   zName );.      
2ade0 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
2adf0 20 26 26 20 70 53 75 62 0a 20 20 20 20 20 20 20   && pSub.       
2ae00 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
2ae10 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 53  MatchSpanName(pS
2ae20 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  ub->pEList->a[j]
2ae30 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d  .zSpan, 0, zTNam
2ae40 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20  e, 0)==0.       
2ae50 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2ae60 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2ae70 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
2ae80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
2ae90 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72   a column is mar
2aea0 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e 27 2c  ked as 'hidden',
2aeb0 20 6f 6d 69 74 20 69 74 20 66 72 6f 6d 20 74 68   omit it from th
2aec0 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20 20  e expanded.     
2aed0 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c 74         ** result
2aee0 2d 73 65 74 20 6c 69 73 74 20 75 6e 6c 65 73 73  -set list unless
2aef0 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   the SELECT has 
2af00 74 68 65 20 53 46 5f 49 6e 63 6c 75 64 65 48 69  the SF_IncludeHi
2af10 64 64 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20  dden.           
2af20 20 2a 2a 20 62 69 74 20 73 65 74 2e 0a 20 20 20   ** bit set..   
2af30 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2af40 20 20 20 20 20 20 20 20 69 66 28 20 28 70 2d 3e          if( (p->
2af50 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 49 6e  selFlags & SF_In
2af60 63 6c 75 64 65 48 69 64 64 65 6e 29 3d 3d 30 0a  cludeHidden)==0.
2af70 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
2af80 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26  IsHiddenColumn(&
2af90 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 0a  pTab->aCol[j]) .
2afa0 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
2afb0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
2afc0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2afd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2afe0 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a   tableSeen = 1;.
2aff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2b000 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d   i>0 && zTName==
2b010 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2b020 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 66     if( (pFrom->f
2b030 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
2b040 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20 20 20  NATURAL)!=0.    
2b050 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 74              && t
2b060 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
2b070 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69 2c 20  ex(pTabList, i, 
2b080 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20  zName, 0, 0).   
2b090 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20             ){.  
2b0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b0b0 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f   In a NATURAL jo
2b0c0 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69  in, omit the joi
2b0d0 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74  n columns from t
2b0e0 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  he .            
2b0f0 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20      ** table to 
2b100 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
2b110 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20   join */.       
2b120 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2b130 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
2b140 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2b150 20 69 66 28 20 73 71 6c 69 74 65 33 49 64 4c 69   if( sqlite3IdLi
2b160 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70  stIndex(pFrom->p
2b170 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30  Using, zName)>=0
2b180 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b190 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e      /* In a join
2b1a0 20 77 69 74 68 20 61 20 55 53 49 4e 47 20 63 6c   with a USING cl
2b1b0 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d  ause, omit colum
2b1c0 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  ns in the.      
2b1d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 69            ** usi
2b1e0 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 74  ng clause from t
2b1f0 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
2b200 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20  right. */.      
2b210 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2b220 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
2b230 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2b240 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 52  }.            pR
2b250 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
2b260 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e  pr(db, TK_ID, zN
2b270 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2b280 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61    zColname = zNa
2b290 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
2b2a0 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  zToFree = 0;.   
2b2b0 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
2b2c0 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69  gNames || pTabLi
2b2d0 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20  st->nSrc>1 ){.  
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
2b2f0 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20   *pLeft;.       
2b300 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73         pLeft = s
2b310 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
2b320 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b  K_ID, zTabName);
2b330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2b340 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
2b350 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
2b360 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  OT, pLeft, pRigh
2b370 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
2b380 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d    if( zSchemaNam
2b390 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
2b3a0 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
2b3b0 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
2b3c0 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29  ID, zSchemaName)
2b3d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2b3e0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
2b3f0 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
2b400 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45  K_DOT, pLeft, pE
2b410 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
2b420 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b430 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65      if( longName
2b440 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
2b450 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
2b460 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
2b470 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62  b, "%s.%s", zTab
2b480 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  Name, zName);.  
2b490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
2b4a0 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65  oFree = zColname
2b4b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2b4c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  }.            }e
2b4d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2b4e0 20 20 20 70 45 78 70 72 20 3d 20 70 52 69 67 68     pExpr = pRigh
2b4f0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  t;.            }
2b500 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
2b510 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  w = sqlite3ExprL
2b520 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
2b530 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a  , pNew, pExpr);.
2b540 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2b550 74 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 73 43  te3TokenInit(&sC
2b560 6f 6c 6e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65  olname, zColname
2b570 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
2b580 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
2b590 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
2b5a0 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20 30  ew, &sColname, 0
2b5b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2b5c0 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e 73  f( pNew && (p->s
2b5d0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73  elFlags & SF_Nes
2b5e0 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a 20  tedFrom)!=0 ){. 
2b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
2b600 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
2b610 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e 61  m *pX = &pNew->a
2b620 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b  [pNew->nExpr-1];
2b630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2b640 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20 20  f( pSub ){.     
2b650 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a             pX->z
2b660 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62  Span = sqlite3Db
2b670 53 74 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  StrDup(db, pSub-
2b680 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53  >pEList->a[j].zS
2b690 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pan);.          
2b6a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b6b0 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a  pX->zSpan==0 );.
2b6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
2b6d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2b6e0 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d       pX->zSpan =
2b6f0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
2b700 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c 0a  db, "%s.%s.%s",.
2b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b730 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65             zSche
2b740 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65  maName, zTabName
2b750 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20  , zColname);.   
2b760 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2b770 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
2b780 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
2b790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b7a0 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49 73       pX->bSpanIs
2b7b0 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Tab = 1;.       
2b7c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b7d0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2b7e0 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a 20  (db, zToFree);. 
2b7f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b800 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2b810 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a 20   !tableSeen ){. 
2b820 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
2b830 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ame ){.         
2b840 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2b850 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
2b860 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  uch table: %s", 
2b870 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  zTName);.       
2b880 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b890 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2b8a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
2b8b0 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66 69  o tables specifi
2b8c0 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed");.          
2b8d0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2b8e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
2b8f0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2b900 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29 3b  ete(db, pEList);
2b910 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d  .    p->pEList =
2b920 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28   pNew;.  }.  if(
2b930 20 70 2d 3e 70 45 4c 69 73 74 20 29 7b 0a 20 20   p->pEList ){.  
2b940 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
2b950 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69  >nExpr>db->aLimi
2b960 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
2b970 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 20 20  OLUMN] ){.      
2b980 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2b990 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
2b9a0 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73  y columns in res
2b9b0 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 20 20 20  ult set");.     
2b9c0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
2b9d0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
2b9e0 20 28 65 6c 69 73 74 46 6c 61 67 73 20 26 20 28   (elistFlags & (
2b9f0 45 50 5f 48 61 73 46 75 6e 63 7c 45 50 5f 53 75  EP_HasFunc|EP_Su
2ba00 62 71 75 65 72 79 29 29 21 3d 30 20 29 7b 0a 20  bquery))!=0 ){. 
2ba10 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
2ba20 20 7c 3d 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65   |= SF_ComplexRe
2ba30 73 75 6c 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  sult;.    }.  }.
2ba40 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2ba50 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
2ba60 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f  No-op routine fo
2ba70 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65  r the parse-tree
2ba80 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   walker..**.** W
2ba90 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2baa0 20 69 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78   is the Walker.x
2bab0 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65  ExprCallback the
2bac0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
2bad0 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64  es.** are walked
2bae0 20 77 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74   without any act
2baf0 69 6f 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e  ions being taken
2bb00 20 61 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20   at each node.  
2bb10 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77  Presumably,.** w
2bb20 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2bb30 20 69 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c   is used for Wal
2bb40 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
2bb50 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65  k then .** Walke
2bb60 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
2bb70 6b 20 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73  k is set to do s
2bb80 6f 6d 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20  omething useful 
2bb90 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75  for every .** su
2bba0 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61  bquery in the pa
2bbb0 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e  rser tree..*/.in
2bbc0 74 20 73 71 6c 69 74 65 33 45 78 70 72 57 61 6c  t sqlite3ExprWal
2bbd0 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f  kNoop(Walker *No
2bbe0 74 55 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74  tUsed, Expr *Not
2bbf0 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
2bc00 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
2bc10 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
2bc20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
2bc30 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
2bc40 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f  No-op routine fo
2bc50 72 20 74 68 65 20 70 61 72 73 65 2d 74 72 65 65  r the parse-tree
2bc60 20 77 61 6c 6b 65 72 20 66 6f 72 20 53 45 4c 45   walker for SELE
2bc70 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
2bc80 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68  * subquery in th
2bc90 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a  e parser tree..*
2bca0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
2bcb0 65 63 74 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b  ectWalkNoop(Walk
2bcc0 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c  er *NotUsed, Sel
2bcd0 65 63 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  ect *NotUsed2){.
2bce0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2bcf0 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
2bd00 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
2bd10 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2bd20 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ..#if SQLITE_DEB
2bd30 55 47 0a 2f 2a 0a 2a 2a 20 41 6c 77 61 79 73 20  UG./*.** Always 
2bd40 61 73 73 65 72 74 2e 20 20 54 68 69 73 20 78 53  assert.  This xS
2bd50 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 69  electCallback2 i
2bd60 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 72  mplementation pr
2bd70 6f 76 65 73 20 74 68 61 74 20 74 68 65 0a 2a 2a  oves that the.**
2bd80 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b   xSelectCallback
2bd90 32 20 69 73 20 6e 65 76 65 72 20 69 6e 76 6f 6b  2 is never invok
2bda0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
2bdb0 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 41 73 73  te3SelectWalkAss
2bdc0 65 72 74 32 28 57 61 6c 6b 65 72 20 2a 4e 6f 74  ert2(Walker *Not
2bdd0 55 73 65 64 2c 20 53 65 6c 65 63 74 20 2a 4e 6f  Used, Select *No
2bde0 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
2bdf0 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
2be00 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
2be10 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
2be20 7d 0a 23 65 6e 64 69 66 0a 2f 2a 0a 2a 2a 20 54  }.#endif./*.** T
2be30 68 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70  his routine "exp
2be40 61 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73  ands" a SELECT s
2be50 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c  tatement and all
2be60 20 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69   of its subqueri
2be70 65 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74  es..** For addit
2be80 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
2be90 6e 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61  n on what it mea
2bea0 6e 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61  ns to "expand" a
2beb0 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
2bec0 6d 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f  ment, see the co
2bed0 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c  mment on the sel
2bee0 65 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72  ectExpand worker
2bef0 20 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e   callback above.
2bf00 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67  .**.** Expanding
2bf10 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2bf20 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
2bf30 20 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73   step in process
2bf40 69 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20  ing a.** SELECT 
2bf50 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
2bf60 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2bf70 20 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65   must be expande
2bf80 64 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65  d before.** name
2bf90 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70   resolution is p
2bfa0 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20  erformed..**.** 
2bfb0 49 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  If anything goes
2bfc0 20 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72   wrong, an error
2bfd0 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
2bfe0 74 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e  ten into pParse.
2bff0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
2c000 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74  function can det
2c010 65 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ect the problem 
2c020 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50  by looking at pP
2c030 61 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e  arse->nErr.** an
2c040 64 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d  d/or pParse->db-
2c050 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a  >mallocFailed..*
2c060 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
2c070 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
2c080 64 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  d(Parse *pParse,
2c090 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
2c0a0 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20  ){.  Walker w;. 
2c0b0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
2c0c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
2c0d0 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72  lkNoop;.  w.pPar
2c0e0 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69  se = pParse;.  i
2c0f0 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f  f( OK_IF_ALWAYS_
2c100 54 52 55 45 28 70 50 61 72 73 65 2d 3e 68 61 73  TRUE(pParse->has
2c110 43 6f 6d 70 6f 75 6e 64 29 20 29 7b 0a 20 20 20  Compound) ){.   
2c120 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2c130 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70  ck = convertComp
2c140 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71  oundSelectToSubq
2c150 75 65 72 79 3b 0a 20 20 20 20 77 2e 78 53 65 6c  uery;.    w.xSel
2c160 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30  ectCallback2 = 0
2c170 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
2c180 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
2c190 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53  ect);.  }.  w.xS
2c1a0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2c1b0 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a  selectExpander;.
2c1c0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2c1d0 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70  ack2 = selectPop
2c1e0 57 69 74 68 3b 0a 20 20 73 71 6c 69 74 65 33 57  With;.  sqlite3W
2c1f0 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
2c200 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  elect);.}...#ifn
2c210 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c220 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
2c230 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e  his is a Walker.
2c240 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
2c250 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
2c260 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79   sqlite3SelectTy
2c270 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65  peInfo().** inte
2c280 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rface..**.** For
2c290 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73   each FROM-claus
2c2a0 65 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20  e subquery, add 
2c2b0 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64  Column.zType and
2c2c0 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a   Column.zColl.**
2c2d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
2c2e0 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
2c2f0 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
2c300 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
2c310 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75  et.** of that su
2c320 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  bquery..**.** Th
2c330 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
2c340 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
2c350 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
2c360 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64   was constructed
2c370 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70  .** by selectExp
2c380 61 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20  ander() but the 
2c390 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
2c3a0 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  on information w
2c3b0 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74  as omitted.** at
2c3c0 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61   that point beca
2c3d0 75 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20  use identifiers 
2c3e0 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  had not yet been
2c3f0 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73   resolved.  This
2c400 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
2c410 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e  alled after iden
2c420 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f  tifier resolutio
2c430 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
2c440 64 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  d selectAddSubqu
2c450 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b  eryTypeInfo(Walk
2c460 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
2c470 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
2c480 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20   *pParse;.  int 
2c490 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  i;.  SrcList *pT
2c4a0 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  abList;.  struct
2c4b0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2c4c0 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  From;..  assert(
2c4d0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
2c4e0 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20  F_Resolved );.  
2c4f0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2c500 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
2c510 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e   ) return;.  p->
2c520 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48  selFlags |= SF_H
2c530 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50  asTypeInfo;.  pP
2c540 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
2c550 70 50 61 72 73 65 3b 0a 20 20 70 54 61 62 4c 69  pParse;.  pTabLi
2c560 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
2c570 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
2c580 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
2c590 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
2c5a0 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
2c5b0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
2c5c0 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
2c5d0 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
2c5e0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  );.    if( (pTab
2c5f0 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
2c600 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b  Ephemeral)!=0 ){
2c610 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d  .      /* A sub-
2c620 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f  query in the FRO
2c630 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45  M clause of a SE
2c640 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 53 65  LECT */.      Se
2c650 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
2c660 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
2c670 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20     if( pSel ){. 
2c680 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
2c690 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  el->pPrior ) pSe
2c6a0 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
2c6b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2c6c0 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e  3SelectAddColumn
2c6d0 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
2c6e0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70  (pParse, pTab, p
2c6f0 53 65 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sel);.      }.  
2c700 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
2c710 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
2c720 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61 74  utine adds datat
2c730 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e  ype and collatin
2c740 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72  g sequence infor
2c750 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65  mation to.** the
2c760 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
2c770 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c  s of all FROM-cl
2c780 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 20  ause subqueries 
2c790 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  in a.** SELECT s
2c7a0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
2c7b0 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  Use this routine
2c7c0 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f   after name reso
2c7d0 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
2c7e0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
2c7f0 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
2c800 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
2c810 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
2c820 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c830 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
2c840 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53  Walker w;.  w.xS
2c850 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2c860 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
2c870 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65  kNoop;.  w.xSele
2c880 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65  ctCallback2 = se
2c890 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
2c8a0 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78  ypeInfo;.  w.xEx
2c8b0 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  prCallback = sql
2c8c0 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70  ite3ExprWalkNoop
2c8d0 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
2c8e0 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
2c8f0 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
2c900 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a  Select);.#endif.
2c910 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
2c920 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
2c930 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2c940 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
2c950 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  .  The.** follow
2c960 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73  ing is accomplis
2c970 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  hed:.**.**     *
2c980 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75    VDBE Cursor nu
2c990 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e  mbers are assign
2c9a0 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63  ed to all FROM-c
2c9b0 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  lause terms..** 
2c9c0 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c      *  Ephemeral
2c9d0 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61   Table objects a
2c9e0 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
2c9f0 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
2ca00 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20  ubqueries..**   
2ca10 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e    *  ON and USIN
2ca20 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68  G clauses are sh
2ca30 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45  ifted into WHERE
2ca40 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20   statements.**  
2ca50 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20     *  Wildcards 
2ca60 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a  "*" and "TABLE.*
2ca70 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73  " in result sets
2ca80 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a   are expanded..*
2ca90 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66  *     *  Identif
2caa0 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69  iers in expressi
2cab0 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74  on are matched t
2cac0 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  o tables..**.** 
2cad0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  This routine act
2cae0 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  s recursively on
2caf0 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20   all subqueries 
2cb00 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43  within the SELEC
2cb10 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
2cb20 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20  e3SelectPrep(.  
2cb30 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2cb40 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
2cb50 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
2cb60 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
2cb70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2cb80 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2cb90 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
2cba0 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
2cbb0 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d  pOuterNC  /* Nam
2cbc0 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f  e context for co
2cbd0 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20  ntainer */.){.  
2cbe0 61 73 73 65 72 74 28 20 70 21 3d 30 20 7c 7c 20  assert( p!=0 || 
2cbf0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
2cc00 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
2cc10 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
2cc20 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
2cc30 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65  urn;.  if( p->se
2cc40 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
2cc50 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e  ypeInfo ) return
2cc60 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
2cc70 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20  tExpand(pParse, 
2cc80 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p);.  if( pParse
2cc90 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65  ->nErr || pParse
2cca0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2ccb0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
2ccc0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
2ccd0 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  ectNames(pParse,
2cce0 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20   p, pOuterNC);. 
2ccf0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
2cd00 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  r || pParse->db-
2cd10 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
2cd20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
2cd30 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
2cd40 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d  fo(pParse, p);.}
2cd50 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
2cd60 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
2cd70 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  mulator..**.** T
2cd80 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
2cd90 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65  umulator is a se
2cda0 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t of memory cell
2cdb0 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69  s that hold.** i
2cdc0 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
2cdd0 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c  lts while calcul
2cde0 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ating an aggrega
2cdf0 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  te.  This.** rou
2ce00 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
2ce10 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65 73 20  ode that stores 
2ce20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20  NULLs in all of 
2ce30 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  those memory.** 
2ce40 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
2ce50 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d   void resetAccum
2ce60 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
2ce70 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
2ce80 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
2ce90 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
2cea0 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
2ceb0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
2cec0 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e  unc *pFunc;.  in
2ced0 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49 6e 66  t nReg = pAggInf
2cee0 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67 49  o->nFunc + pAggI
2cef0 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  nfo->nColumn;.  
2cf00 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20 72 65  if( nReg==0 ) re
2cf10 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c  turn;.#ifdef SQL
2cf20 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56  ITE_DEBUG.  /* V
2cf30 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c 20 41  erify that all A
2cf40 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65 72 73  ggInfo registers
2cf50 20 61 72 65 20 77 69 74 68 69 6e 20 74 68 65 20   are within the 
2cf60 72 61 6e 67 65 20 73 70 65 63 69 66 69 65 64 20  range specified 
2cf70 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e  by.  ** AggInfo.
2cf80 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d  mnReg..AggInfo.m
2cf90 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65 72 74  xReg */.  assert
2cfa0 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f  ( nReg==pAggInfo
2cfb0 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e 66 6f  ->mxReg-pAggInfo
2cfc0 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66  ->mnReg+1 );.  f
2cfd0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
2cfe0 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  fo->nColumn; i++
2cff0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2d000 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d  AggInfo->aCol[i]
2d010 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d  .iMem>=pAggInfo-
2d020 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20  >mnReg.         
2d030 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f  && pAggInfo->aCo
2d040 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  l[i].iMem<=pAggI
2d050 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
2d060 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
2d070 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2d080 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
2d090 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  ( pAggInfo->aFun
2d0a0 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49  c[i].iMem>=pAggI
2d0b0 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20  nfo->mnReg.     
2d0c0 20 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d      && pAggInfo-
2d0d0 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d  >aFunc[i].iMem<=
2d0e0 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20  pAggInfo->mxReg 
2d0f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2d100 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d110 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  3(v, OP_Null, 0,
2d120 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67   pAggInfo->mnReg
2d130 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  , pAggInfo->mxRe
2d140 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d  g);.  for(pFunc=
2d150 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c  pAggInfo->aFunc,
2d160 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f   i=0; i<pAggInfo
2d170 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
2d180 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  unc++){.    if( 
2d190 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
2d1a0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  >=0 ){.      Exp
2d1b0 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70  r *pE = pFunc->p
2d1c0 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
2d1d0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2d1e0 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53  erty(pE, EP_xIsS
2d1f0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
2d200 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d  if( pE->x.pList=
2d210 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73  =0 || pE->x.pLis
2d220 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  t->nExpr!=1 ){. 
2d230 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
2d240 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2d250 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67 61  DISTINCT aggrega
2d260 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65 78  tes must have ex
2d270 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20  actly one ".    
2d280 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74         "argument
2d290 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e  ");.        pFun
2d2a0 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d  c->iDistinct = -
2d2b0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
2d2c0 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
2d2d0 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69  *pKeyInfo = sqli
2d2e0 74 65 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  te3KeyInfoFromEx
2d2f0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2d300 45 2d 3e 78 2e 70 4c 69 73 74 2c 30 2c 30 29 3b  E->x.pList,0,0);
2d310 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2d320 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2d330 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
2d340 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
2d350 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
2d360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d370 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
2d380 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
2d390 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2d3a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
2d3b0 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61  e the OP_AggFina
2d3c0 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20  lize opcode for 
2d3d0 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20  every aggregate 
2d3e0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
2d3f0 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
2d400 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
2d410 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67  void finalizeAgg
2d420 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20  Functions(Parse 
2d430 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
2d440 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
2d450 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2d460 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
2d470 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
2d480 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f  o_func *pF;.  fo
2d490 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
2d4a0 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
2d4b0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
2d4c0 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78  +, pF++){.    Ex
2d4d0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
2d4e0 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
2d4f0 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
2d500 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2d510 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
2d520 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
2d530 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d540 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p2(v, OP_AggFina
2d550 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
2d560 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
2d570 72 20 3a 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  r : 0);.    sqli
2d580 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28  te3VdbeAppendP4(
2d590 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  v, pF->pFunc, P4
2d5a0 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d  _FUNCDEF);.  }.}
2d5b0 0a 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  .../*.** Update 
2d5c0 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
2d5d0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
2d5e0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61   an aggregate ba
2d5f0 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75  sed on.** the cu
2d600 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
2d610 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ition..**.** If 
2d620 72 65 67 41 63 63 20 69 73 20 6e 6f 6e 2d 7a 65  regAcc is non-ze
2d630 72 6f 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ro and there are
2d640 20 6e 6f 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78   no min() or max
2d650 28 29 20 61 67 67 72 65 67 61 74 65 73 0a 2a 2a  () aggregates.**
2d660 20 69 6e 20 70 41 67 67 49 6e 66 6f 2c 20 74 68   in pAggInfo, th
2d670 65 6e 20 6f 6e 6c 79 20 70 6f 70 75 6c 61 74 65  en only populate
2d680 20 74 68 65 20 70 41 67 67 49 6e 66 6f 2d 3e 6e   the pAggInfo->n
2d690 41 63 63 75 6d 75 6c 61 74 6f 72 20 61 63 63 75  Accumulator accu
2d6a0 6d 75 6c 61 74 6f 72 0a 2a 2a 20 72 65 67 69 73  mulator.** regis
2d6b0 74 65 72 73 20 69 20 72 65 67 69 73 74 65 72 20  ters i register 
2d6c0 72 65 67 41 63 63 20 63 6f 6e 74 61 69 6e 73 20  regAcc contains 
2d6d0 30 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  0. The caller wi
2d6e0 6c 6c 20 74 61 6b 65 20 63 61 72 65 0a 2a 2a 20  ll take care.** 
2d6f0 6f 66 20 73 65 74 74 69 6e 67 20 61 6e 64 20 63  of setting and c
2d700 6c 65 61 72 69 6e 67 20 72 65 67 41 63 63 2e 0a  learing regAcc..
2d710 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
2d720 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72  pdateAccumulator
2d730 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
2d740 69 6e 74 20 72 65 67 41 63 63 2c 20 41 67 67 49  int regAcc, AggI
2d750 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
2d760 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
2d770 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
2d780 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74   i;.  int regHit
2d790 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72   = 0;.  int addr
2d7a0 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73  HitTest = 0;.  s
2d7b0 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75  truct AggInfo_fu
2d7c0 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74  nc *pF;.  struct
2d7d0 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
2d7e0 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64  ;..  pAggInfo->d
2d7f0 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
2d800 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
2d810 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
2d820 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
2d830 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
2d840 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69   int nArg;.    i
2d850 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b  nt addrNext = 0;
2d860 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b  .    int regAgg;
2d870 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
2d880 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
2d890 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
2d8a0 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
2d8b0 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
2d8c0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
2d8d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
2d8e0 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  t ){.      nArg 
2d8f0 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
2d900 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 73        regAgg = s
2d910 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e  qlite3GetTempRan
2d920 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29  ge(pParse, nArg)
2d930 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2d940 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
2d950 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72  pParse, pList, r
2d960 65 67 41 67 67 2c 20 30 2c 20 53 51 4c 49 54 45  egAgg, 0, SQLITE
2d970 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20  _ECEL_DUP);.    
2d980 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72  }else{.      nAr
2d990 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67  g = 0;.      reg
2d9a0 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Agg = 0;.    }. 
2d9b0 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74     if( pF->iDist
2d9c0 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
2d9d0 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69   addrNext = sqli
2d9e0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
2d9f0 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
2da00 61 73 65 28 20 6e 41 72 67 3d 3d 30 20 29 3b 20  ase( nArg==0 ); 
2da10 20 2f 2a 20 45 72 72 6f 72 20 63 6f 6e 64 69 74   /* Error condit
2da20 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  ion */.      tes
2da30 74 63 61 73 65 28 20 6e 41 72 67 3e 31 20 29 3b  tcase( nArg>1 );
2da40 20 20 20 2f 2a 20 41 6c 73 6f 20 61 6e 20 65 72     /* Also an er
2da50 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64  ror */.      cod
2da60 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65  eDistinct(pParse
2da70 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c  , pF->iDistinct,
2da80 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20 72 65   addrNext, 1, re
2da90 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gAgg);.    }.   
2daa0 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e   if( pF->pFunc->
2dab0 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
2dac0 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c  TE_FUNC_NEEDCOLL
2dad0 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
2dae0 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
2daf0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
2db00 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2db10 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
2db20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
2db30 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73  t!=0 );  /* pLis
2db40 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e  t!=0 if pF->pFun
2db50 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a  c has NEEDCOLL *
2db60 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  /.      for(j=0,
2db70 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
2db80 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72   !pColl && j<nAr
2db90 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  g; j++, pItem++)
2dba0 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  {.        pColl 
2dbb0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
2dbc0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
2dbd0 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
2dbe0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
2dbf0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
2dc00 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
2dc10 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2dc20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2dc30 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41   regHit==0 && pA
2dc40 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
2dc50 61 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20  ator ) regHit = 
2dc60 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2dc70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2dc80 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f  eAddOp4(v, OP_Co
2dc90 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30  llSeq, regHit, 0
2dca0 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f  , 0, (char *)pCo
2dcb0 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b  ll, P4_COLLSEQ);
2dcc0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2dcd0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2dce0 4f 50 5f 41 67 67 53 74 65 70 30 2c 20 30 2c 20  OP_AggStep0, 0, 
2dcf0 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d  regAgg, pF->iMem
2dd00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
2dd10 62 65 41 70 70 65 6e 64 50 34 28 76 2c 20 70 46  beAppendP4(v, pF
2dd20 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
2dd30 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  DEF);.    sqlite
2dd40 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2dd50 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20   (u8)nArg);.    
2dd60 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2dd70 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
2dd80 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e  Parse, regAgg, n
2dd90 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
2dda0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
2ddb0 65 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67  e(pParse, regAgg
2ddc0 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28  , nArg);.    if(
2ddd0 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20   addrNext ){.   
2dde0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2ddf0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
2de00 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73  drNext);.      s
2de10 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
2de20 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
2de30 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65    }.  }..  /* Be
2de40 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20  fore populating 
2de50 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
2de60 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72  registers, clear
2de70 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
2de80 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  e..  ** Otherwis
2de90 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  e, if any of the
2dea0 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e   required column
2deb0 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65   values are alre
2dec0 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a  ady present .  *
2ded0 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20  * in registers, 
2dee0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
2def0 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f  ) may use OP_SCo
2df00 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76  py to copy the v
2df10 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d  alue.  ** to pC-
2df20 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68  >iMem. But by th
2df30 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65  e time the value
2df40 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72   is used, the or
2df50 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a  iginal register.
2df60 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65    ** may have be
2df70 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64  en used, invalid
2df80 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c  ating the underl
2df90 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64  ying buffer hold
2dfa0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78  ing the.  ** tex
2dfb0 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e  t or blob value.
2dfc0 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33   See ticket [883
2dfd0 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20  034dcb5]..  **. 
2dfe0 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75   ** Another solu
2dff0 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f  tion would be to
2e000 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53   change the OP_S
2e010 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70  Copy used to cop
2e020 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61  y cached.  ** va
2e030 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f  lues to an OP_Co
2e040 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  py..  */.  if( r
2e050 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67  egHit==0 && pAgg
2e060 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
2e070 6f 72 20 29 7b 0a 20 20 20 20 72 65 67 48 69 74  or ){.    regHit
2e080 20 3d 20 72 65 67 41 63 63 3b 0a 20 20 7d 0a 20   = regAcc;.  }. 
2e090 20 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20   if( regHit ){. 
2e0a0 20 20 20 61 64 64 72 48 69 74 54 65 73 74 20 3d     addrHitTest =
2e0b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2e0c0 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p1(v, OP_If, reg
2e0d0 48 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  Hit); VdbeCovera
2e0e0 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ge(v);.  }.  sql
2e0f0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
2e100 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
2e110 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e  r(i=0, pC=pAggIn
2e120 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67  fo->aCol; i<pAgg
2e130 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
2e140 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a  or; i++, pC++){.
2e150 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2e160 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e  ode(pParse, pC->
2e170 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29  pExpr, pC->iMem)
2e180 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f  ;.  }.  pAggInfo
2e190 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30  ->directMode = 0
2e1a0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
2e1b0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2e1c0 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69 74  );.  if( addrHit
2e1d0 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Test ){.    sqli
2e1e0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2e1f0 76 2c 20 61 64 64 72 48 69 74 54 65 73 74 29 3b  v, addrHitTest);
2e200 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
2e210 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78  d a single OP_Ex
2e220 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
2e230 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f  n to the VDBE to
2e240 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c   explain a simpl
2e250 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75  e.** count(*) qu
2e260 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75  ery ("SELECT cou
2e270 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22  nt(*) FROM pTab"
2e280 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  )..*/.#ifndef SQ
2e290 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
2e2a0 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  N.static void ex
2e2b0 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
2e2c0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2e2d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2e2e0 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
2e2f0 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
2e300 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
2e310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
2e320 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
2e330 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
2e340 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
2e350 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75        /* Index u
2e360 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
2e370 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  scan, or NULL */
2e380 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  .){.  if( pParse
2e390 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
2e3a0 20 20 20 20 69 6e 74 20 62 43 6f 76 65 72 20 3d      int bCover =
2e3b0 20 28 70 49 64 78 21 3d 30 20 26 26 20 28 48 61   (pIdx!=0 && (Ha
2e3c0 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20  sRowid(pTab) || 
2e3d0 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  !IsPrimaryKeyInd
2e3e0 65 78 28 70 49 64 78 29 29 29 3b 0a 20 20 20 20  ex(pIdx)));.    
2e3f0 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61  sqlite3VdbeExpla
2e400 69 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 22 53  in(pParse, 0, "S
2e410 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73  CAN TABLE %s%s%s
2e420 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ",.        pTab-
2e430 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
2e440 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49 4e 47  bCover ? " USING
2e450 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20   COVERING INDEX 
2e460 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20  " : "",.        
2e470 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d 3e 7a  bCover ? pIdx->z
2e480 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b  Name : "".    );
2e490 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
2e4a0 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d  efine explainSim
2e4b0 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a  pleCount(a,b,c).
2e4c0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 71  #endif../*.** sq
2e4d0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20  lite3WalkExpr() 
2e4e0 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79  callback used by
2e4f0 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28 29   havingToWhere()
2e500 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
2e510 6f 64 65 20 70 61 73 73 65 64 20 74 6f 20 74 68  ode passed to th
2e520 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 61 20  e callback is a 
2e530 54 4b 5f 41 4e 44 20 6e 6f 64 65 2c 20 72 65 74  TK_AND node, ret
2e540 75 72 6e 20 0a 2a 2a 20 57 52 43 5f 43 6f 6e 74  urn .** WRC_Cont
2e550 69 6e 75 65 20 74 6f 20 74 65 6c 6c 20 73 71 6c  inue to tell sql
2e560 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20 74  ite3WalkExpr() t
2e570 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
2e580 68 20 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a  h child nodes..*
2e590 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
2e5a0 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
2e5b0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
2e5c0 61 6c 73 6f 20 63 68 65 63 6b 20 69 66 20 74 68  also check if th
2e5d0 65 20 0a 2a 2a 20 73 75 62 2d 65 78 70 72 65 73  e .** sub-expres
2e5e0 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74 68 65  sion matches the
2e5f0 20 63 72 69 74 65 72 69 61 20 66 6f 72 20 62 65   criteria for be
2e600 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  ing moved to the
2e610 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65   WHERE.** clause
2e620 2e 20 49 66 20 73 6f 2c 20 61 64 64 20 69 74 20  . If so, add it 
2e630 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
2e640 75 73 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20  use and replace 
2e650 74 68 65 20 73 75 62 2d 65 78 70 72 65 73 73 69  the sub-expressi
2e660 6f 6e 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  on.** within the
2e670 20 48 41 56 49 4e 47 20 65 78 70 72 65 73 73 69   HAVING expressi
2e680 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 73 74 61  on with a consta
2e690 6e 74 20 22 31 22 2e 0a 2a 2f 0a 73 74 61 74 69  nt "1"..*/.stati
2e6a0 63 20 69 6e 74 20 68 61 76 69 6e 67 54 6f 57 68  c int havingToWh
2e6b0 65 72 65 45 78 70 72 43 62 28 57 61 6c 6b 65 72  ereExprCb(Walker
2e6c0 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
2e6d0 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70  *pExpr){.  if( p
2e6e0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44  Expr->op!=TK_AND
2e6f0 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   ){.    Select *
2e700 70 53 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  pS = pWalker->u.
2e710 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28  pSelect;.    if(
2e720 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
2e730 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42 79 28  nstantOrGroupBy(
2e740 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c  pWalker->pParse,
2e750 20 70 45 78 70 72 2c 20 70 53 2d 3e 70 47 72 6f   pExpr, pS->pGro
2e760 75 70 42 79 29 20 29 7b 0a 20 20 20 20 20 20 73  upBy) ){.      s
2e770 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 61  qlite3 *db = pWa
2e780 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e 64 62  lker->pParse->db
2e790 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  ;.      Expr *pN
2e7a0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
2e7b0 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54  Alloc(db, TK_INT
2e7c0 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e  EGER, &sqlite3In
2e7d0 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29 3b 0a  tTokens[1], 0);.
2e7e0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
2e7f0 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
2e800 70 57 68 65 72 65 20 3d 20 70 53 2d 3e 70 57 68  pWhere = pS->pWh
2e810 65 72 65 3b 0a 20 20 20 20 20 20 20 20 53 57 41  ere;.        SWA
2e820 50 28 45 78 70 72 2c 20 2a 70 4e 65 77 2c 20 2a  P(Expr, *pNew, *
2e830 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
2e840 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
2e850 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65 72 65  prAnd(db, pWhere
2e860 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
2e870 20 70 53 2d 3e 70 57 68 65 72 65 20 3d 20 70 4e   pS->pWhere = pN
2e880 65 77 3b 0a 20 20 20 20 20 20 20 20 70 57 61 6c  ew;.        pWal
2e890 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31 3b 0a  ker->eCode = 1;.
2e8a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2e8b0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2e8c0 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ne;.  }.  return
2e8d0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
2e8e0 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  ../*.** Transfer
2e8f0 20 65 6c 69 67 69 62 6c 65 20 74 65 72 6d 73 20   eligible terms 
2e900 66 72 6f 6d 20 74 68 65 20 48 41 56 49 4e 47 20  from the HAVING 
2e910 63 6c 61 75 73 65 20 6f 66 20 61 20 71 75 65 72  clause of a quer
2e920 79 2c 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 70  y, which is.** p
2e930 72 6f 63 65 73 73 65 64 20 61 66 74 65 72 20 67  rocessed after g
2e940 72 6f 75 70 69 6e 67 2c 20 74 6f 20 74 68 65 20  rouping, to the 
2e950 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 77 68  WHERE clause, wh
2e960 69 63 68 20 69 73 20 70 72 6f 63 65 73 73 65 64  ich is processed
2e970 20 62 65 66 6f 72 65 0a 2a 2a 20 67 72 6f 75 70   before.** group
2e980 69 6e 67 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ing. For example
2e990 2c 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  , the query:.**.
2e9a0 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
2e9b0 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48 45 52  OM <tables> WHER
2e9c0 45 20 61 3d 3f 20 47 52 4f 55 50 20 42 59 20 62  E a=? GROUP BY b
2e9d0 20 48 41 56 49 4e 47 20 62 3d 3f 20 41 4e 44 20   HAVING b=? AND 
2e9e0 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65  c=?.**.** can be
2e9f0 20 72 65 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a   rewritten as:.*
2ea00 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  *.**   SELECT * 
2ea10 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48  FROM <tables> WH
2ea20 45 52 45 20 61 3d 3f 20 41 4e 44 20 62 3d 3f 20  ERE a=? AND b=? 
2ea30 47 52 4f 55 50 20 42 59 20 62 20 48 41 56 49 4e  GROUP BY b HAVIN
2ea40 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20 74 65  G c=?.**.** A te
2ea50 72 6d 20 6f 66 20 74 68 65 20 48 41 56 49 4e 47  rm of the HAVING
2ea60 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65   expression is e
2ea70 6c 69 67 69 62 6c 65 20 66 6f 72 20 74 72 61 6e  ligible for tran
2ea80 73 66 65 72 20 69 66 20 69 74 20 63 6f 6e 73 69  sfer if it consi
2ea90 73 74 73 0a 2a 2a 20 65 6e 74 69 72 65 6c 79 20  sts.** entirely 
2eaa0 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20 61 6e 64  of constants and
2eab0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
2eac0 74 20 61 72 65 20 61 6c 73 6f 20 47 52 4f 55 50  t are also GROUP
2ead0 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 0a 2a   BY terms that.*
2eae0 2a 20 75 73 65 20 74 68 65 20 22 42 49 4e 41 52  * use the "BINAR
2eaf0 59 22 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  Y" collation seq
2eb00 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  uence..*/.static
2eb10 20 76 6f 69 64 20 68 61 76 69 6e 67 54 6f 57 68   void havingToWh
2eb20 65 72 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ere(Parse *pPars
2eb30 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
2eb40 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b   Walker sWalker;
2eb50 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b  .  memset(&sWalk
2eb60 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57  er, 0, sizeof(sW
2eb70 61 6c 6b 65 72 29 29 3b 0a 20 20 73 57 61 6c 6b  alker));.  sWalk
2eb80 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  er.pParse = pPar
2eb90 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45  se;.  sWalker.xE
2eba0 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 68 61  xprCallback = ha
2ebb0 76 69 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43  vingToWhereExprC
2ebc0 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75 2e 70  b;.  sWalker.u.p
2ebd0 53 65 6c 65 63 74 20 3d 20 70 3b 0a 20 20 73 71  Select = p;.  sq
2ebe0 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 73  lite3WalkExpr(&s
2ebf0 57 61 6c 6b 65 72 2c 20 70 2d 3e 70 48 61 76 69  Walker, p->pHavi
2ec00 6e 67 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  ng);.#if SELECTT
2ec10 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
2ec20 66 28 20 73 57 61 6c 6b 65 72 2e 65 43 6f 64 65  f( sWalker.eCode
2ec30 20 26 26 20 28 73 71 6c 69 74 65 33 53 65 6c 65   && (sqlite3Sele
2ec40 63 74 54 72 61 63 65 20 26 20 30 78 31 30 30 29  ctTrace & 0x100)
2ec50 21 3d 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43  !=0 ){.    SELEC
2ec60 54 54 52 41 43 45 28 30 78 31 30 30 2c 70 50 61  TTRACE(0x100,pPa
2ec70 72 73 65 2c 70 2c 28 22 4d 6f 76 65 20 48 41 56  rse,p,("Move HAV
2ec80 49 4e 47 20 74 65 72 6d 73 20 69 6e 74 6f 20 57  ING terms into W
2ec90 48 45 52 45 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  HERE:\n"));.    
2eca0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
2ecb0 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
2ecc0 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
2ecd0 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
2ece0 20 69 66 20 74 68 65 20 70 54 68 69 73 20 65 6e   if the pThis en
2ecf0 74 72 79 20 6f 66 20 70 54 61 62 4c 69 73 74 20  try of pTabList 
2ed00 69 73 20 61 20 73 65 6c 66 2d 6a 6f 69 6e 20 6f  is a self-join o
2ed10 66 20 61 20 70 72 69 6f 72 20 76 69 65 77 2e 0a  f a prior view..
2ed20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65  ** If it is, the
2ed30 6e 20 72 65 74 75 72 6e 20 74 68 65 20 53 72 63  n return the Src
2ed40 4c 69 73 74 5f 69 74 65 6d 20 66 6f 72 20 74 68  List_item for th
2ed50 65 20 70 72 69 6f 72 20 76 69 65 77 2e 20 20 49  e prior view.  I
2ed60 66 20 69 74 20 69 73 20 6e 6f 74 2c 0a 2a 2a 20  f it is not,.** 
2ed70 74 68 65 6e 20 72 65 74 75 72 6e 20 30 2e 0a 2a  then return 0..*
2ed80 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
2ed90 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 69 73  SrcList_item *is
2eda0 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 0a 20 20  SelfJoinView(.  
2edb0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
2edc0 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
2edd0 53 65 61 72 63 68 20 66 6f 72 20 73 65 6c 66 2d  Search for self-
2ede0 6a 6f 69 6e 73 20 69 6e 20 74 68 69 73 20 46 52  joins in this FR
2edf0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  OM clause */.  s
2ee00 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2ee10 65 6d 20 2a 70 54 68 69 73 20 20 20 2f 2a 20 53  em *pThis   /* S
2ee20 65 61 72 63 68 20 66 6f 72 20 70 72 69 6f 72 20  earch for prior 
2ee30 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69  reference to thi
2ee40 73 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 29 7b  s subquery */.){
2ee50 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2ee60 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
2ee70 20 66 6f 72 28 70 49 74 65 6d 20 3d 20 70 54 61   for(pItem = pTa
2ee80 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c  bList->a; pItem<
2ee90 70 54 68 69 73 3b 20 70 49 74 65 6d 2b 2b 29 7b  pThis; pItem++){
2eea0 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
2eeb0 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63 6f 6e  pSelect==0 ) con
2eec0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
2eed0 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f  Item->fg.viaCoro
2eee0 75 74 69 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65  utine ) continue
2eef0 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  ;.    if( pItem-
2ef00 3e 7a 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74  >zName==0 ) cont
2ef10 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71  inue;.    if( sq
2ef20 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 49  lite3_stricmp(pI
2ef30 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20  tem->zDatabase, 
2ef40 70 54 68 69 73 2d 3e 7a 44 61 74 61 62 61 73 65  pThis->zDatabase
2ef50 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
2ef60 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2ef70 5f 73 74 72 69 63 6d 70 28 70 49 74 65 6d 2d 3e  _stricmp(pItem->
2ef80 7a 4e 61 6d 65 2c 20 70 54 68 69 73 2d 3e 7a 4e  zName, pThis->zN
2ef90 61 6d 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  ame)!=0 ) contin
2efa0 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ue;.    if( sqli
2efb0 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30  te3ExprCompare(0
2efc0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 54 68  , .          pTh
2efd0 69 73 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68  is->pSelect->pWh
2efe0 65 72 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  ere, pItem->pSel
2eff0 65 63 74 2d 3e 70 57 68 65 72 65 2c 20 2d 31 29  ect->pWhere, -1)
2f000 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f   .    ){.      /
2f010 2a 20 54 68 65 20 76 69 65 77 20 77 61 73 20 6d  * The view was m
2f020 6f 64 69 66 69 65 64 20 62 79 20 73 6f 6d 65 20  odified by some 
2f030 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  other optimizati
2f040 6f 6e 20 73 75 63 68 20 61 73 0a 20 20 20 20 20  on such as.     
2f050 20 2a 2a 20 70 75 73 68 44 6f 77 6e 57 68 65 72   ** pushDownWher
2f060 65 54 65 72 6d 73 28 29 20 2a 2f 0a 20 20 20 20  eTerms() */.    
2f070 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2f080 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49 74  }.    return pIt
2f090 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  em;.  }.  return
2f0a0 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   0;.}..#ifdef SQ
2f0b0 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57  LITE_COUNTOFVIEW
2f0c0 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a  _OPTIMIZATION./*
2f0d0 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 74  .** Attempt to t
2f0e0 72 61 6e 73 66 6f 72 6d 20 61 20 71 75 65 72 79  ransform a query
2f0f0 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a   of the form.**.
2f100 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  **    SELECT cou
2f110 6e 74 28 2a 29 20 46 52 4f 4d 20 28 53 45 4c 45  nt(*) FROM (SELE
2f120 43 54 20 78 20 46 52 4f 4d 20 74 31 20 55 4e 49  CT x FROM t1 UNI
2f130 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 79 20  ON ALL SELECT y 
2f140 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a 20 49  FROM t2).**.** I
2f150 6e 74 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  nto this:.**.** 
2f160 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
2f170 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2f180 74 31 29 2b 28 53 45 4c 45 43 54 20 63 6f 75 6e  t1)+(SELECT coun
2f190 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 0a 2a 2a  t(*) FROM t2).**
2f1a0 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 66 6f 72  .** The transfor
2f1b0 6d 61 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f 72 6b  mation only work
2f1c0 73 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  s if all of the 
2f1d0 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
2f1e0 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54  ue:.**.**   *  T
2f1f0 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 61  he subquery is a
2f200 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 66 20 74 77   UNION ALL of tw
2f210 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 73 0a  o or more terms.
2f220 2a 2a 20 20 20 2a 20 20 54 68 65 72 65 20 69 73  **   *  There is
2f230 20 6e 6f 20 57 48 45 52 45 20 6f 72 20 47 52 4f   no WHERE or GRO
2f240 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e 47 20  UP BY or HAVING 
2f250 63 6c 61 75 73 65 73 20 6f 6e 20 74 68 65 20 73  clauses on the s
2f260 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 20 20 2a  ubqueries.**   *
2f270 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
2f280 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20 63 6f  y is a simple co
2f290 75 6e 74 28 2a 29 0a 2a 2a 0a 2a 2a 20 52 65 74  unt(*).**.** Ret
2f2a0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
2f2b0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
2f2c0 75 6e 64 65 72 74 61 6b 65 6e 2e 0a 2a 2f 0a 73  undertaken..*/.s
2f2d0 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 4f  tatic int countO
2f2e0 66 56 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f  fViewOptimizatio
2f2f0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
2f300 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53   Select *p){.  S
2f310 65 6c 65 63 74 20 2a 70 53 75 62 2c 20 2a 70 50  elect *pSub, *pP
2f320 72 69 6f 72 3b 0a 20 20 45 78 70 72 20 2a 70 45  rior;.  Expr *pE
2f330 78 70 72 3b 0a 20 20 45 78 70 72 20 2a 70 43 6f  xpr;.  Expr *pCo
2f340 75 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  unt;.  sqlite3 *
2f350 64 62 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65  db;.  if( (p->se
2f360 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
2f370 65 67 61 74 65 29 3d 3d 30 20 29 20 72 65 74 75  egate)==0 ) retu
2f380 72 6e 20 30 3b 20 20 20 2f 2a 20 54 68 69 73 20  rn 0;   /* This 
2f390 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
2f3a0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  */.  if( p->pELi
2f3b0 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72  st->nExpr!=1 ) r
2f3c0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
2f3d0 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c 65         /* Single
2f3e0 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a   result column *
2f3f0 2f 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e 70  /.  pExpr = p->p
2f400 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
2f410 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  r;.  if( pExpr->
2f420 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op!=TK_AGG_FUNCT
2f430 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ION ) return 0; 
2f440 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
2f450 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
2f460 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
2f470 33 5f 73 74 72 69 63 6d 70 28 70 45 78 70 72 2d  3_stricmp(pExpr-
2f480 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 63 6f 75 6e 74  >u.zToken,"count
2f490 22 29 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ") ) return 0;  
2f4a0 2f 2a 20 49 73 20 63 6f 75 6e 74 28 29 20 2a 2f  /* Is count() */
2f4b0 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 78 2e  .  if( pExpr->x.
2f4c0 70 4c 69 73 74 21 3d 30 20 29 20 72 65 74 75 72  pList!=0 ) retur
2f4d0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
2f4e0 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
2f4f0 63 6f 75 6e 74 28 2a 29 20 2a 2f 0a 20 20 69 66  count(*) */.  if
2f500 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21  ( p->pSrc->nSrc!
2f510 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
2f520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f530 2f 2a 20 4f 6e 65 20 74 61 62 6c 65 20 69 6e 20  /* One table in 
2f540 46 52 4f 4d 20 20 2a 2f 0a 20 20 70 53 75 62 20  FROM  */.  pSub 
2f550 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
2f560 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28 20 70  pSelect;.  if( p
2f570 53 75 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Sub==0 ) return 
2f580 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2f590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f5a0 54 68 65 20 46 52 4f 4d 20 69 73 20 61 20 73 75  The FROM is a su
2f5b0 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66 28 20  bquery */.  if( 
2f5c0 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  pSub->pPrior==0 
2f5d0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
2f5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f5f0 20 4d 75 73 74 20 62 65 20 61 20 63 6f 6d 70 6f   Must be a compo
2f600 75 6e 64 20 72 79 20 2a 2f 0a 20 20 64 6f 7b 0a  und ry */.  do{.
2f610 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 6f 70      if( pSub->op
2f620 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 70 53 75 62  !=TK_ALL && pSub
2f630 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75 72  ->pPrior ) retur
2f640 6e 20 30 3b 20 20 2f 2a 20 4d 75 73 74 20 62 65  n 0;  /* Must be
2f650 20 55 4e 49 4f 4e 20 41 4c 4c 20 2a 2f 0a 20 20   UNION ALL */.  
2f660 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
2f670 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  re ) return 0;  
2f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f690 20 20 20 20 2f 2a 20 4e 6f 20 57 48 45 52 45 20      /* No WHERE 
2f6a0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 69 66  clause */.    if
2f6b0 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
2f6c0 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20   & SF_Aggregate 
2f6d0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
2f6e0 2f 2a 20 4e 6f 74 20 61 6e 20 61 67 67 72 65 67  /* Not an aggreg
2f6f0 61 74 65 20 2a 2f 0a 20 20 20 20 70 53 75 62 20  ate */.    pSub 
2f700 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20  = pSub->pPrior; 
2f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f730 52 65 70 65 61 74 20 6f 76 65 72 20 63 6f 6d 70  Repeat over comp
2f740 6f 75 6e 64 20 2a 2f 0a 20 20 7d 77 68 69 6c 65  ound */.  }while
2f750 28 20 70 53 75 62 20 29 3b 0a 0a 20 20 2f 2a 20  ( pSub );..  /* 
2f760 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
2f770 20 70 6f 69 6e 74 20 74 68 65 6e 20 69 74 20 69   point then it i
2f780 73 20 4f 4b 20 74 6f 20 70 65 72 66 6f 72 6d 20  s OK to perform 
2f790 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  the transformati
2f7a0 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50  on */..  db = pP
2f7b0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 43 6f 75  arse->db;.  pCou
2f7c0 6e 74 20 3d 20 70 45 78 70 72 3b 0a 20 20 70 45  nt = pExpr;.  pE
2f7d0 78 70 72 20 3d 20 30 3b 0a 20 20 70 53 75 62 20  xpr = 0;.  pSub 
2f7e0 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
2f7f0 70 53 65 6c 65 63 74 3b 0a 20 20 70 2d 3e 70 53  pSelect;.  p->pS
2f800 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
2f810 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 53   = 0;.  sqlite3S
2f820 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
2f830 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70 2d 3e   p->pSrc);.  p->
2f840 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62  pSrc = sqlite3Db
2f850 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
2f860 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
2f870 2d 3e 70 53 72 63 29 29 3b 0a 20 20 77 68 69 6c  ->pSrc));.  whil
2f880 65 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20 45  e( pSub ){.    E
2f890 78 70 72 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20  xpr *pTerm;.    
2f8a0 70 50 72 69 6f 72 20 3d 20 70 53 75 62 2d 3e 70  pPrior = pSub->p
2f8b0 50 72 69 6f 72 3b 0a 20 20 20 20 70 53 75 62 2d  Prior;.    pSub-
2f8c0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
2f8d0 20 70 53 75 62 2d 3e 70 4e 65 78 74 20 3d 20 30   pSub->pNext = 0
2f8e0 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65 6c 46  ;.    pSub->selF
2f8f0 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65  lags |= SF_Aggre
2f900 67 61 74 65 3b 0a 20 20 20 20 70 53 75 62 2d 3e  gate;.    pSub->
2f910 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
2f920 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 20 20 70 53  Compound;.    pS
2f930 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d  ub->nSelectRow =
2f940 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   0;.    sqlite3E
2f950 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
2f960 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b  , pSub->pEList);
2f970 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70 50 72  .    pTerm = pPr
2f980 69 6f 72 20 3f 20 73 71 6c 69 74 65 33 45 78 70  ior ? sqlite3Exp
2f990 72 44 75 70 28 64 62 2c 20 70 43 6f 75 6e 74 2c  rDup(db, pCount,
2f9a0 20 30 29 20 3a 20 70 43 6f 75 6e 74 3b 0a 20 20   0) : pCount;.  
2f9b0 20 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 20 3d    pSub->pEList =
2f9c0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2f9d0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
2f9e0 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 70 54  , pTerm);.    pT
2f9f0 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 50 45 78  erm = sqlite3PEx
2fa00 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 53 45  pr(pParse, TK_SE
2fa10 4c 45 43 54 2c 20 30 2c 20 30 29 3b 0a 20 20 20  LECT, 0, 0);.   
2fa20 20 73 71 6c 69 74 65 33 50 45 78 70 72 41 64 64   sqlite3PExprAdd
2fa30 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
2fa40 54 65 72 6d 2c 20 70 53 75 62 29 3b 0a 20 20 20  Term, pSub);.   
2fa50 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b   if( pExpr==0 ){
2fa60 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
2fa70 54 65 72 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Term;.    }else{
2fa80 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73  .      pExpr = s
2fa90 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
2faa0 73 65 2c 20 54 4b 5f 50 4c 55 53 2c 20 70 54 65  se, TK_PLUS, pTe
2fab0 72 6d 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  rm, pExpr);.    
2fac0 7d 0a 20 20 20 20 70 53 75 62 20 3d 20 70 50 72  }.    pSub = pPr
2fad0 69 6f 72 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 45  ior;.  }.  p->pE
2fae0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
2faf0 20 3d 20 70 45 78 70 72 3b 0a 20 20 70 2d 3e 73   = pExpr;.  p->s
2fb00 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 41  elFlags &= ~SF_A
2fb10 67 67 72 65 67 61 74 65 3b 0a 0a 23 69 66 20 53  ggregate;..#if S
2fb20 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
2fb30 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
2fb40 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
2fb50 34 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45 43  400 ){.    SELEC
2fb60 54 54 52 41 43 45 28 30 78 34 30 30 2c 70 50 61  TTRACE(0x400,pPa
2fb70 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 63 6f  rse,p,("After co
2fb80 75 6e 74 2d 6f 66 2d 76 69 65 77 20 6f 70 74 69  unt-of-view opti
2fb90 6d 69 7a 61 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a  mization:\n"));.
2fba0 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2fbb0 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2fbc0 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
2fbd0 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
2fbe0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f  dif /* SQLITE_CO
2fbf0 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49  UNTOFVIEW_OPTIMI
2fc00 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ZATION */../*.**
2fc10 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
2fc20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  or the SELECT st
2fc30 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e  atement given in
2fc40 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e   the p argument.
2fc50 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73    .**.** The res
2fc60 75 6c 74 73 20 61 72 65 20 72 65 74 75 72 6e 65  ults are returne
2fc70 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  d according to t
2fc80 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73 74  he SelectDest st
2fc90 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20  ructure..** See 
2fca0 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69  comments in sqli
2fcb0 74 65 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74  teInt.h for furt
2fcc0 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  her information.
2fcd0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2fce0 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
2fcf0 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
2fd00 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73  .  If any errors
2fd10 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65   are.** encounte
2fd20 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70  red, then an app
2fd30 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d  ropriate error m
2fd40 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
2fd50 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72  n.** pParse->zEr
2fd60 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rMsg..**.** This
2fd70 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f   routine does NO
2fd80 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65 63  T free the Selec
2fd90 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73  t structure pass
2fda0 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63  ed in.  The.** c
2fdb0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
2fdc0 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74  needs to do that
2fdd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2fde0 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
2fdf0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2fe00 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
2fe10 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
2fe20 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
2fe30 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
2fe40 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
2fe50 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c   coded. */.  Sel
2fe60 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
2fe70 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
2fe80 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72 79  o with the query
2fe90 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
2fea0 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
2feb0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2fec0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68  counters */.  Wh
2fed0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
2fee0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66       /* Return f
2fef0 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65  rom sqlite3Where
2ff00 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62  Begin() */.  Vdb
2ff10 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
2ff20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
2ff30 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72  al machine under
2ff40 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
2ff50 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20  .  int isAgg;   
2ff60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2ff70 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73  e for select lis
2ff80 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a  ts like "count(*
2ff90 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  )" */.  ExprList
2ffa0 20 2a 70 45 4c 69 73 74 20 3d 20 30 3b 20 20 2f   *pEList = 0;  /
2ffb0 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  * List of column
2ffc0 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f  s to extract. */
2ffd0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
2ffe0 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73  List;     /* Lis
2fff0 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73  t of tables to s
30000 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  elect from */.  
30010 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
30020 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
30030 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ERE clause.  May
30040 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
30050 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
30060 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55  ;    /* The GROU
30070 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61  P BY clause.  Ma
30080 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
30090 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20  xpr *pHaving;   
300a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56        /* The HAV
300b0 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79  ING clause.  May
300c0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   be NULL */.  in
300d0 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20  t rc = 1;       
300e0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
300f0 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69   return from thi
30100 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
30110 44 69 73 74 69 6e 63 74 43 74 78 20 73 44 69 73  DistinctCtx sDis
30120 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f  tinct; /* Info o
30130 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68  n how to code th
30140 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
30150 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20  rd */.  SortCtx 
30160 73 53 6f 72 74 3b 20 20 20 20 20 20 20 20 20 2f  sSort;         /
30170 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  * Info on how to
30180 20 63 6f 64 65 20 74 68 65 20 4f 52 44 45 52 20   code the ORDER 
30190 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 41  BY clause */.  A
301a0 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b  ggInfo sAggInfo;
301b0 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
301c0 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67 67  tion used by agg
301d0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 2a  regate queries *
301e0 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20 20  /.  int iEnd;   
301f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
30200 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e 64  dress of the end
30210 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a 2f   of the query */
30220 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
30230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
30240 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
30250 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69  tion */.  ExprLi
30260 73 74 20 2a 70 4d 69 6e 4d 61 78 4f 72 64 65 72  st *pMinMaxOrder
30270 42 79 20 3d 20 30 3b 20 20 2f 2a 20 41 64 64 65  By = 0;  /* Adde
30280 64 20 4f 52 44 45 52 20 42 59 20 66 6f 72 20 6d  d ORDER BY for m
30290 69 6e 2f 6d 61 78 20 71 75 65 72 69 65 73 20 2a  in/max queries *
302a0 2f 0a 20 20 75 38 20 6d 69 6e 4d 61 78 46 6c 61  /.  u8 minMaxFla
302b0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
302c0 20 20 20 2f 2a 20 46 6c 61 67 20 66 6f 72 20 6d     /* Flag for m
302d0 69 6e 2f 6d 61 78 20 71 75 65 72 69 65 73 20 2a  in/max queries *
302e0 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  /..  db = pParse
302f0 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71 6c 69  ->db;.  v = sqli
30300 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
30310 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  e);.  if( p==0 |
30320 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
30330 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
30340 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rr ){.    return
30350 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   1;.  }.  if( sq
30360 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
30370 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
30380 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29  LECT, 0, 0, 0) )
30390 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d   return 1;.  mem
303a0 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30  set(&sAggInfo, 0
303b0 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66  , sizeof(sAggInf
303c0 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 54  o));.#if SELECTT
303d0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 53  RACE_ENABLED.  S
303e0 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
303f0 72 73 65 2c 70 2c 20 28 22 62 65 67 69 6e 20 70  rse,p, ("begin p
30400 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22 2c 20 70  rocessing:\n", p
30410 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61  Parse->addrExpla
30420 69 6e 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  in));.  if( sqli
30430 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
30440 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 73 71   0x100 ){.    sq
30450 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
30460 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
30470 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
30480 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
30490 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
304a0 73 74 21 3d 53 52 54 5f 44 69 73 74 46 69 66 6f  st!=SRT_DistFifo
304b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
304c0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20  >pOrderBy==0 || 
304d0 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52  pDest->eDest!=SR
304e0 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65  T_Fifo );.  asse
304f0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
30500 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
30510 73 74 21 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st!=SRT_DistQueu
30520 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
30530 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
30540 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
30550 52 54 5f 51 75 65 75 65 20 29 3b 0a 20 20 69 66  RT_Queue );.  if
30560 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72  ( IgnorableOrder
30570 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
30580 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65   assert(pDest->e
30590 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73  Dest==SRT_Exists
305a0 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
305b0 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a  ==SRT_Union || .
305c0 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74             pDest
305d0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63  ->eDest==SRT_Exc
305e0 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ept || pDest->eD
305f0 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64  est==SRT_Discard
30600 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ||.           p
30610 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
30620 5f 51 75 65 75 65 20 20 7c 7c 20 70 44 65 73 74  _Queue  || pDest
30630 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ->eDest==SRT_Dis
30640 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20 20  tFifo ||.       
30650 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
30660 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  ==SRT_DistQueue 
30670 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
30680 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20 20  =SRT_Fifo);.    
30690 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d  /* If ORDER BY m
306a0 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  akes no differen
306b0 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ce in the output
306c0 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f   then neither do
306d0 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e  es.    ** DISTIN
306e0 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20  CT so it can be 
306f0 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a  removed too. */.
30700 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
30710 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
30720 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
30730 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
30740 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
30750 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
30760 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
30770 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
30780 2c 20 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  , p, 0);.  if( p
30790 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
307a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
307b0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
307c0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73  ct_end;.  }.  as
307d0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21  sert( p->pEList!
307e0 3d 30 20 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  =0 );.#if SELECT
307f0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
30800 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
30810 74 54 72 61 63 65 20 26 20 30 78 31 30 34 20 29  tTrace & 0x104 )
30820 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
30830 45 28 30 78 31 30 34 2c 70 50 61 72 73 65 2c 70  E(0x104,pParse,p
30840 2c 20 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72  , ("after name r
30850 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b  esolution:\n"));
30860 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
30870 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
30880 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
30890 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
308a0 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
308b0 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
308c0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
308d0 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  e, p);.  }..#ifn
308e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
308f0 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 69 66 28  WINDOWFUNC.  if(
30900 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 52 65   sqlite3WindowRe
30910 77 72 69 74 65 28 70 50 61 72 73 65 2c 20 70 29  write(pParse, p)
30920 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
30930 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 69 66  ect_end;.  }.#if
30940 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
30950 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
30960 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
30970 30 78 31 30 38 20 29 7b 0a 20 20 20 20 53 45 4c  0x108 ){.    SEL
30980 45 43 54 54 52 41 43 45 28 30 78 31 30 34 2c 70  ECTTRACE(0x104,p
30990 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74 65 72  Parse,p, ("after
309a0 20 77 69 6e 64 6f 77 20 72 65 77 72 69 74 65 3a   window rewrite:
309b0 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  \n"));.    sqlit
309c0 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74  e3TreeViewSelect
309d0 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23  (0, p, 0);.  }.#
309e0 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20  endif.#endif /* 
309f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
30a00 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 70 54 61 62  OWFUNC */.  pTab
30a10 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
30a20 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65    isAgg = (p->se
30a30 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
30a40 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 6d 65 6d  egate)!=0;.  mem
30a50 73 65 74 28 26 73 53 6f 72 74 2c 20 30 2c 20 73  set(&sSort, 0, s
30a60 69 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a 20  izeof(sSort));. 
30a70 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20   sSort.pOrderBy 
30a80 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a  = p->pOrderBy;..
30a90 20 20 2f 2a 20 54 72 79 20 74 6f 20 76 61 72 69    /* Try to vari
30aa0 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ous optimization
30ab0 73 20 28 66 6c 61 74 74 65 6e 69 6e 67 20 73 75  s (flattening su
30ac0 62 71 75 65 72 69 65 73 2c 20 61 6e 64 20 73 74  bqueries, and st
30ad0 72 65 6e 67 74 68 0a 20 20 2a 2a 20 72 65 64 75  rength.  ** redu
30ae0 63 74 69 6f 6e 20 6f 66 20 6a 6f 69 6e 20 6f 70  ction of join op
30af0 65 72 61 74 6f 72 73 29 20 69 6e 20 74 68 65 20  erators) in the 
30b00 46 52 4f 4d 20 63 6c 61 75 73 65 20 75 70 20 69  FROM clause up i
30b10 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 71 75 65  nto the main que
30b20 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  ry.  */.#if !def
30b30 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
30b40 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
30b50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
30b60 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69  IT_VIEW).  for(i
30b70 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26  =0; !p->pPrior &
30b80 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  & i<pTabList->nS
30b90 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
30ba0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
30bb0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62  m *pItem = &pTab
30bc0 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
30bd0 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
30be0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Item->pSelect;. 
30bf0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
30c00 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 0a 20   pItem->pTab;.. 
30c10 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 4c 45     /* Convert LE
30c20 46 54 20 4a 4f 49 4e 20 69 6e 74 6f 20 4a 4f 49  FT JOIN into JOI
30c30 4e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 74  N if there are t
30c40 65 72 6d 73 20 6f 66 20 74 68 65 20 72 69 67 68  erms of the righ
30c50 74 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6f  t table.    ** o
30c60 66 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20  f the LEFT JOIN 
30c70 75 73 65 64 20 69 6e 20 74 68 65 20 57 48 45 52  used in the WHER
30c80 45 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f  E clause..    */
30c90 0a 20 20 20 20 69 66 28 20 28 70 49 74 65 6d 2d  .    if( (pItem-
30ca0 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
30cb0 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20 20 20 20  T_LEFT)!=0.     
30cc0 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 6d  && sqlite3ExprIm
30cd0 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f 77 28  pliesNonNullRow(
30ce0 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d  p->pWhere, pItem
30cf0 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20 20 20 20  ->iCursor).     
30d00 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
30d10 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
30d20 45 5f 53 69 6d 70 6c 69 66 79 4a 6f 69 6e 29 0a  E_SimplifyJoin).
30d30 20 20 20 20 29 7b 0a 20 20 20 20 20 20 53 45 4c      ){.      SEL
30d40 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70  ECTTRACE(0x100,p
30d50 50 61 72 73 65 2c 70 2c 0a 20 20 20 20 20 20 20  Parse,p,.       
30d60 20 20 20 20 20 20 20 20 20 28 22 4c 45 46 54 2d           ("LEFT-
30d70 4a 4f 49 4e 20 73 69 6d 70 6c 69 66 69 65 73 20  JOIN simplifies 
30d80 74 6f 20 4a 4f 49 4e 20 6f 6e 20 74 65 72 6d 20  to JOIN on term 
30d90 25 64 5c 6e 22 2c 69 29 29 3b 0a 20 20 20 20 20  %d\n",i));.     
30da0 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74   pItem->fg.joint
30db0 79 70 65 20 26 3d 20 7e 28 4a 54 5f 4c 45 46 54  ype &= ~(JT_LEFT
30dc0 7c 4a 54 5f 4f 55 54 45 52 29 3b 0a 20 20 20 20  |JT_OUTER);.    
30dd0 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28    unsetJoinExpr(
30de0 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d  p->pWhere, pItem
30df0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
30e00 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 66 75 74  }..    /* No fut
30e10 68 65 72 20 61 63 74 69 6f 6e 20 69 66 20 74 68  her action if th
30e20 69 73 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  is term of the F
30e30 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f  ROM clause is no
30e40 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20   a subquery */. 
30e50 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29     if( pSub==0 )
30e60 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
30e70 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d 61 74 63  /* Catch mismatc
30e80 68 20 69 6e 20 74 68 65 20 64 65 63 6c 61 72 65  h in the declare
30e90 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61 20 76  d columns of a v
30ea0 69 65 77 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  iew and the numb
30eb0 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 63 6f 6c  er of.    ** col
30ec0 75 6d 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45  umns in the SELE
30ed0 43 54 20 6f 6e 20 74 68 65 20 52 48 53 20 2a 2f  CT on the RHS */
30ee0 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e  .    if( pTab->n
30ef0 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45 4c 69 73  Col!=pSub->pELis
30f00 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
30f10 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
30f20 67 28 70 50 61 72 73 65 2c 20 22 65 78 70 65 63  g(pParse, "expec
30f30 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 66  ted %d columns f
30f40 6f 72 20 27 25 73 27 20 62 75 74 20 67 6f 74 20  or '%s' but got 
30f50 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
30f60 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
30f70 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a 4e 61  >nCol, pTab->zNa
30f80 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  me, pSub->pEList
30f90 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
30fa0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
30fb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
30fc0 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 66 6c 61  o not try to fla
30fd0 74 74 65 6e 20 61 6e 20 61 67 67 72 65 67 61 74  tten an aggregat
30fe0 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  e subquery..    
30ff0 2a 2a 0a 20 20 20 20 2a 2a 20 46 6c 61 74 74 65  **.    ** Flatte
31000 6e 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74  ning an aggregat
31010 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6f 6e  e subquery is on
31020 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74  ly possible if t
31030 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 20  he outer query. 
31040 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 6a     ** is not a j
31050 6f 69 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65  oin.  But if the
31060 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
31070 6e 6f 74 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e  not a join, then
31080 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20   the subquery.  
31090 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 69 6d 70    ** will be imp
310a0 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f  lemented as a co
310b0 2d 72 6f 75 74 69 6e 65 20 61 6e 64 20 74 68 65  -routine and the
310c0 72 65 20 69 73 20 6e 6f 20 61 64 76 61 6e 74 61  re is no advanta
310d0 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 66 6c 61  ge to.    ** fla
310e0 74 74 65 6e 69 6e 67 20 69 6e 20 74 68 61 74 20  ttening in that 
310f0 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
31100 20 69 66 28 20 28 70 53 75 62 2d 3e 73 65 6c 46   if( (pSub->selF
31110 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
31120 61 74 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  ate)!=0 ) contin
31130 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
31140 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  pSub->pGroupBy==
31150 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  0 );..    /* If 
31160 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
31170 63 6f 6e 74 61 69 6e 73 20 61 20 22 63 6f 6d 70  contains a "comp
31180 6c 65 78 22 20 72 65 73 75 6c 74 20 73 65 74 20  lex" result set 
31190 28 74 68 61 74 20 69 73 2c 0a 20 20 20 20 2a 2a  (that is,.    **
311a0 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   if the result s
311b0 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  et of the outer 
311c0 71 75 65 72 79 20 75 73 65 73 20 66 75 6e 63 74  query uses funct
311d0 69 6f 6e 73 20 6f 72 20 73 75 62 71 75 65 72 69  ions or subqueri
311e0 65 73 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  es).    ** and i
311f0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63  f the subquery c
31200 6f 6e 74 61 69 6e 73 20 61 6e 20 4f 52 44 45 52  ontains an ORDER
31210 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 69   BY clause and i
31220 66 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 6c 6c  f.    ** it will
31230 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   be implemented 
31240 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c  as a co-routine,
31250 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61   then do not fla
31260 74 74 65 6e 2e 20 20 54 68 69 73 0a 20 20 20 20  tten.  This.    
31270 2a 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 61  ** restriction a
31280 6c 6c 6f 77 73 20 53 51 4c 20 63 6f 6e 73 74 72  llows SQL constr
31290 75 63 74 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ucts like this:.
312a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 53      **.    **  S
312b0 45 4c 45 43 54 20 65 78 70 65 6e 73 69 76 65 5f  ELECT expensive_
312c0 66 75 6e 63 74 69 6f 6e 28 78 29 0a 20 20 20 20  function(x).    
312d0 2a 2a 20 20 20 20 46 52 4f 4d 20 28 53 45 4c 45  **    FROM (SELE
312e0 43 54 20 78 20 46 52 4f 4d 20 74 61 62 20 4f 52  CT x FROM tab OR
312f0 44 45 52 20 42 59 20 79 20 4c 49 4d 49 54 20 31  DER BY y LIMIT 1
31300 30 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  0);.    **.    *
31310 2a 20 54 68 65 20 65 78 70 65 6e 73 69 76 65 5f  * The expensive_
31320 66 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 6f 6e  function() is on
31330 6c 79 20 63 6f 6d 70 75 74 65 64 20 6f 6e 20 74  ly computed on t
31340 68 65 20 31 30 20 72 6f 77 73 20 74 68 61 74 0a  he 10 rows that.
31350 20 20 20 20 2a 2a 20 61 72 65 20 6f 75 74 70 75      ** are outpu
31360 74 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 65  t, rather than e
31370 76 65 72 79 20 72 6f 77 20 6f 66 20 74 68 65 20  very row of the 
31380 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  table..    **.  
31390 20 20 2a 2a 20 54 68 65 20 72 65 71 75 69 72 65    ** The require
313a0 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20 6f 75  ment that the ou
313b0 74 65 72 20 71 75 65 72 79 20 68 61 76 65 20 61  ter query have a
313c0 20 63 6f 6d 70 6c 65 78 20 72 65 73 75 6c 74 20   complex result 
313d0 73 65 74 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73  set.    ** means
313e0 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67   that flattening
313f0 20 64 6f 65 73 20 6f 63 63 75 72 20 6f 6e 20 73   does occur on s
31400 69 6d 70 6c 65 72 20 53 51 4c 20 63 6f 6e 73 74  impler SQL const
31410 72 61 69 6e 74 73 20 77 69 74 68 6f 75 74 0a 20  raints without. 
31420 20 20 20 2a 2a 20 74 68 65 20 65 78 70 65 6e 73     ** the expens
31430 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 6c  ive_function() l
31440 69 6b 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ike:.    **.    
31450 2a 2a 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f  **  SELECT x FRO
31460 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  M (SELECT x FROM
31470 20 74 61 62 20 4f 52 44 45 52 20 42 59 20 79 20   tab ORDER BY y 
31480 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20 20 20 2a  LIMIT 10);.    *
31490 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  /.    if( pSub->
314a0 70 4f 72 64 65 72 42 79 21 3d 30 0a 20 20 20 20  pOrderBy!=0.    
314b0 20 26 26 20 69 3d 3d 30 0a 20 20 20 20 20 26 26   && i==0.     &&
314c0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
314d0 53 46 5f 43 6f 6d 70 6c 65 78 52 65 73 75 6c 74  SF_ComplexResult
314e0 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
314f0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a  abList->nSrc==1.
31500 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54 61           || (pTa
31510 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a  bList->a[1].fg.j
31520 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46 54  ointype&(JT_LEFT
31530 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 29 0a  |JT_CROSS))!=0).
31540 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e      ){.      con
31550 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
31560 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62    if( flattenSub
31570 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  query(pParse, p,
31580 20 69 2c 20 69 73 41 67 67 29 20 29 7b 0a 20 20   i, isAgg) ){.  
31590 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62 71      /* This subq
315a0 75 65 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f  uery can be abso
315b0 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70 61  rbed into its pa
315c0 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69  rent. */.      i
315d0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
315e0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
315f0 53 72 63 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  Src;.    if( db-
31600 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
31610 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
31620 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61  .    if( !Ignora
31630 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
31640 29 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74  ) ){.      sSort
31650 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  .pOrderBy = p->p
31660 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
31670 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64   }.#endif..#ifnd
31680 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
31690 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20  OMPOUND_SELECT. 
316a0 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d 70 6f   /* Handle compo
316b0 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
316c0 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68 65 20  ments using the 
316d0 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69 53 65  separate multiSe
316e0 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72 6f 63  lect().  ** proc
316f0 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  edure..  */.  if
31700 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
31710 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c     rc = multiSel
31720 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70  ect(pParse, p, p
31730 44 65 73 74 29 3b 0a 23 69 66 20 53 45 4c 45 43  Dest);.#if SELEC
31740 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
31750 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
31760 78 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 65 6e  x1,pParse,p,("en
31770 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  d compound-selec
31780 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e 22 29  t processing\n")
31790 29 3b 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69  );.    if( (sqli
317a0 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26  te3SelectTrace &
317b0 20 30 78 32 30 30 30 29 21 3d 30 20 26 26 20 45   0x2000)!=0 && E
317c0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50  xplainQueryPlanP
317d0 61 72 65 6e 74 28 70 50 61 72 73 65 29 3d 3d 30  arent(pParse)==0
317e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
317f0 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
31800 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  0, p, 0);.    }.
31810 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
31820 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 20 45 78 70  ->pNext==0 ) Exp
31830 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70  lainQueryPlanPop
31840 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 72 65  (pParse);.    re
31850 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
31860 64 69 66 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61  dif..  /* For ea
31870 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46  ch term in the F
31880 52 4f 4d 20 63 6c 61 75 73 65 2c 20 64 6f 20 74  ROM clause, do t
31890 77 6f 20 74 68 69 6e 67 73 3a 0a 20 20 2a 2a 20  wo things:.  ** 
318a0 28 31 29 20 41 75 74 68 6f 72 69 7a 65 64 20 75  (1) Authorized u
318b0 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c  nreferenced tabl
318c0 65 73 0a 20 20 2a 2a 20 28 32 29 20 47 65 6e 65  es.  ** (2) Gene
318d0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c  rate code for al
318e0 6c 20 73 75 62 2d 71 75 65 72 69 65 73 0a 20 20  l sub-queries.  
318f0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
31900 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
31910 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
31920 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
31930 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
31940 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65  ->a[i];.    Sele
31950 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
31960 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 0a 23   Select *pSub;.#
31970 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
31980 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
31990 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
319a0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
319b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
319c0 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
319d0 74 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  t;.#endif..    /
319e0 2a 20 49 73 73 75 65 20 53 51 4c 49 54 45 5f 52  * Issue SQLITE_R
319f0 45 41 44 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  EAD authorizatio
31a00 6e 73 20 77 69 74 68 20 61 20 66 61 6b 65 20 63  ns with a fake c
31a10 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66 6f 72 20 61  olumn name for a
31a20 6e 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 73  ny.    ** tables
31a30 20 74 68 61 74 20 61 72 65 20 72 65 66 65 72 65   that are refere
31a40 6e 63 65 64 20 62 75 74 20 66 72 6f 6d 20 77 68  nced but from wh
31a50 69 63 68 20 6e 6f 20 76 61 6c 75 65 73 20 61 72  ich no values ar
31a60 65 20 65 78 74 72 61 63 74 65 64 2e 0a 20 20 20  e extracted..   
31a70 20 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20   ** Examples of 
31a80 77 68 65 72 65 20 74 68 65 73 65 20 6b 69 6e 64  where these kind
31a90 73 20 6f 66 20 6e 75 6c 6c 20 53 51 4c 49 54 45  s of null SQLITE
31aa0 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61 74  _READ authorizat
31ab0 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 77 6f 75 6c  ions.    ** woul
31ac0 64 20 6f 63 63 75 72 3a 0a 20 20 20 20 2a 2a 0a  d occur:.    **.
31ad0 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43      **     SELEC
31ae0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
31af0 74 31 3b 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f  t1;   -- SQLITE_
31b00 52 45 41 44 20 74 31 2e 22 22 0a 20 20 20 20 2a  READ t1."".    *
31b10 2a 20 20 20 20 20 53 45 4c 45 43 54 20 74 31 2e  *     SELECT t1.
31b20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 3b 20 20  * FROM t1, t2;  
31b30 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20   -- SQLITE_READ 
31b40 74 32 2e 22 22 0a 20 20 20 20 2a 2a 0a 20 20 20  t2."".    **.   
31b50 20 2a 2a 20 54 68 65 20 66 61 6b 65 20 63 6f 6c   ** The fake col
31b60 75 6d 6e 20 6e 61 6d 65 20 69 73 20 61 6e 20 65  umn name is an e
31b70 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20 49 74  mpty string.  It
31b80 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
31b90 20 61 20 74 61 62 6c 65 20 74 6f 0a 20 20 20 20   a table to.    
31ba0 2a 2a 20 68 61 76 65 20 61 20 63 6f 6c 75 6d 6e  ** have a column
31bb0 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 65 6d   named by the em
31bc0 70 74 79 20 73 74 72 69 6e 67 2c 20 69 6e 20 77  pty string, in w
31bd0 68 69 63 68 20 63 61 73 65 20 74 68 65 72 65 20  hich case there 
31be0 69 73 20 6e 6f 20 77 61 79 20 74 6f 0a 20 20 20  is no way to.   
31bf0 20 2a 2a 20 64 69 73 74 69 6e 67 75 69 73 68 20   ** distinguish 
31c00 62 65 74 77 65 65 6e 20 61 6e 20 75 6e 72 65 66  between an unref
31c10 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20 61 6e  erenced table an
31c20 64 20 61 6e 20 61 63 74 75 61 6c 20 72 65 66 65  d an actual refe
31c30 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 20 20 20  rence to the.   
31c40 20 2a 2a 20 22 22 20 63 6f 6c 75 6d 6e 2e 20 54   ** "" column. T
31c50 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69  he original desi
31c60 67 6e 20 77 61 73 20 66 6f 72 20 74 68 65 20 66  gn was for the f
31c70 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ake column name 
31c80 74 6f 20 62 65 20 61 20 4e 55 4c 4c 2c 0a 20 20  to be a NULL,.  
31c90 20 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64    ** which would
31ca0 20 62 65 20 75 6e 61 6d 62 69 67 75 6f 75 73 2e   be unambiguous.
31cb0 20 20 42 75 74 20 6c 65 67 61 63 79 20 61 75 74    But legacy aut
31cc0 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62  horization callb
31cd0 61 63 6b 73 20 6d 69 67 68 74 0a 20 20 20 20 2a  acks might.    *
31ce0 2a 20 61 73 73 75 6d 65 20 74 68 65 20 63 6f 6c  * assume the col
31cf0 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6e 6f 6e 2d  umn name is non-
31d00 4e 55 4c 4c 20 61 6e 64 20 73 65 67 66 61 75 6c  NULL and segfaul
31d10 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  t.  The use of a
31d20 6e 20 65 6d 70 74 79 0a 20 20 20 20 2a 2a 20 73  n empty.    ** s
31d30 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 66 61  tring for the fa
31d40 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 73  ke column name s
31d50 65 65 6d 73 20 73 61 66 65 72 2e 0a 20 20 20 20  eems safer..    
31d60 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  */.    if( pItem
31d70 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30 20 29 7b 0a  ->colUsed==0 ){.
31d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
31d90 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
31da0 51 4c 49 54 45 5f 52 45 41 44 2c 20 70 49 74 65  QLITE_READ, pIte
31db0 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22 2c 20 70 49  m->zName, "", pI
31dc0 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
31dd0 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  .    }..#if !def
31de0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
31df0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
31e00 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
31e10 49 54 5f 56 49 45 57 29 0a 20 20 20 20 2f 2a 20  IT_VIEW).    /* 
31e20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
31e30 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65  r all sub-querie
31e40 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
31e50 61 75 73 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ause.    */.    
31e60 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53  pSub = pItem->pS
31e70 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28 20 70  elect;.    if( p
31e80 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Sub==0 ) continu
31e90 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74  e;..    /* Somet
31ea0 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  imes the code fo
31eb0 72 20 61 20 73 75 62 71 75 65 72 79 20 77 69 6c  r a subquery wil
31ec0 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 6d  l be generated m
31ed0 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ore than.    ** 
31ee0 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73 75 62  once, if the sub
31ef0 71 75 65 72 79 20 69 73 20 70 61 72 74 20 6f 66  query is part of
31f00 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
31f10 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e in a LEFT JOIN
31f20 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65 78 61  ,.    ** for exa
31f30 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63  mple.  In that c
31f40 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65  ase, do not rege
31f50 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20  nerate the code 
31f60 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20 20 20  to manifest.    
31f70 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74 68 65  ** a view or the
31f80 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69   co-routine to i
31f90 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65 77 2e  mplement a view.
31fa0 20 20 54 68 65 20 66 69 72 73 74 20 69 6e 73 74    The first inst
31fb0 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  ance.    ** is s
31fc0 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f 75 67  ufficient, thoug
31fd0 68 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  h the subroutine
31fe0 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74 68 65   to manifest the
31ff0 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65 64 0a   view does need.
32000 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76      ** to be inv
32010 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20  oked again. */. 
32020 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64     if( pItem->ad
32030 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20  drFillSub ){.   
32040 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
32050 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30  .viaCoroutine==0
32060 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
32070 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  he subroutine th
32080 61 74 20 6d 61 6e 69 66 65 73 74 73 20 74 68 65  at manifests the
32090 20 76 69 65 77 20 6d 69 67 68 74 20 62 65 20 61   view might be a
320a0 20 6f 6e 65 2d 74 69 6d 65 20 72 6f 75 74 69 6e   one-time routin
320b0 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  e,.        ** or
320c0 20 69 74 20 6d 69 67 68 74 20 6e 65 65 64 20 74   it might need t
320d0 6f 20 62 65 20 72 65 72 75 6e 20 6f 6e 20 65 61  o be rerun on ea
320e0 63 68 20 69 74 65 72 61 74 69 6f 6e 20 62 65 63  ch iteration bec
320f0 61 75 73 65 20 69 74 0a 20 20 20 20 20 20 20 20  ause it.        
32100 2a 2a 20 65 6e 63 6f 64 65 73 20 61 20 63 6f 72  ** encodes a cor
32110 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
32120 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 65 73  . */.        tes
32130 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 56 64  tcase( sqlite3Vd
32140 62 65 47 65 74 4f 70 28 76 2c 20 70 49 74 65 6d  beGetOp(v, pItem
32150 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 2d 3e  ->addrFillSub)->
32160 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 6e 63 65 20  opcode==OP_Once 
32170 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
32180 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
32190 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d  OP_Gosub, pItem-
321a0 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74 65  >regReturn, pIte
321b0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29 3b  m->addrFillSub);
321c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
321d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
321e0 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
321f0 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20 62   Parse.nHeight b
32200 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66 20  y the height of 
32210 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70 72  the largest expr
32220 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72  ession.    ** tr
32230 65 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 62  ee referred to b
32240 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72 65  y this, the pare
32250 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20 63  nt select. The c
32260 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20 20  hild select.    
32270 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65  ** may contain e
32280 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 20  xpression trees 
32290 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a  of at most.    *
322a0 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  * (SQLITE_MAX_EX
322b0 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e 6e  PR_DEPTH-Parse.n
322c0 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e 20  Height) height. 
322d0 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20 20  This is a bit.  
322e0 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72    ** more conser
322f0 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63 65  vative than nece
32300 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68 20  ssary, but much 
32310 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66 6f  easier than enfo
32320 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20  rcing.    ** an 
32330 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20  exact limit..   
32340 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   */.    pParse->
32350 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69 74  nHeight += sqlit
32360 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67  e3SelectExprHeig
32370 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 4d  ht(p);..    /* M
32380 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 63 6f  ake copies of co
32390 6e 73 74 61 6e 74 20 57 48 45 52 45 2d 63 6c 61  nstant WHERE-cla
323a0 75 73 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  use terms in the
323b0 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 77   outer query dow
323c0 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64 65 20  n.    ** inside 
323d0 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
323e0 68 69 73 20 63 61 6e 20 68 65 6c 70 20 74 68 65  his can help the
323f0 20 73 75 62 71 75 65 72 79 20 74 6f 20 72 75 6e   subquery to run
32400 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c   more efficientl
32410 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
32420 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e  ( OptimizationEn
32430 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45  abled(db, SQLITE
32440 5f 50 75 73 68 44 6f 77 6e 29 0a 20 20 20 20 20  _PushDown).     
32450 26 26 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65  && pushDownWhere
32460 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53  Terms(pParse, pS
32470 75 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 70  ub, p->pWhere, p
32480 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 0a 20  Item->iCursor,. 
32490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
324a0 20 20 20 20 20 20 20 20 20 20 28 70 49 74 65 6d            (pItem
324b0 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
324c0 4a 54 5f 4f 55 54 45 52 29 21 3d 30 29 0a 20 20  JT_OUTER)!=0).  
324d0 20 20 29 7b 0a 23 69 66 20 53 45 4c 45 43 54 54    ){.#if SELECTT
324e0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20  RACE_ENABLED.   
324f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 65     if( sqlite3Se
32500 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
32510 30 20 29 7b 0a 20 20 20 20 20 20 20 20 53 45 4c  0 ){.        SEL
32520 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70  ECTTRACE(0x100,p
32530 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20  Parse,p,("After 
32540 57 48 45 52 45 2d 63 6c 61 75 73 65 20 70 75 73  WHERE-clause pus
32550 68 2d 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a 20 20  h-down:\n"));.  
32560 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
32570 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
32580 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  , 0);.      }.#e
32590 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
325a0 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
325b0 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
325c0 2c 28 22 50 75 73 68 2d 64 6f 77 6e 20 6e 6f 74  ,("Push-down not
325d0 20 70 6f 73 73 69 62 6c 65 5c 6e 22 29 29 3b 0a   possible\n"));.
325e0 20 20 20 20 7d 0a 0a 20 20 20 20 7a 53 61 76 65      }..    zSave
325f0 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  dAuthContext = p
32600 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
32610 65 78 74 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ext;.    pParse-
32620 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
32630 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20  pItem->zName;.. 
32640 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
32650 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ode to implement
32660 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20 20   the subquery.  
32670 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
32680 73 75 62 71 75 65 72 79 20 69 73 20 69 6d 70 6c  subquery is impl
32690 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d  emented as a co-
326a0 72 6f 75 74 69 6e 65 20 69 66 20 74 68 65 20 73  routine if the s
326b0 75 62 71 75 65 72 79 20 69 73 0a 20 20 20 20 2a  ubquery is.    *
326c0 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
326d0 62 65 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  be the outer loo
326e0 70 20 28 73 6f 20 74 68 61 74 20 69 74 20 64 6f  p (so that it do
326f0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
32700 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65  e.    ** compute
32710 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  d more than once
32720 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
32730 54 4f 44 4f 3a 20 41 72 65 20 74 68 65 72 65 20  TODO: Are there 
32740 6f 74 68 65 72 20 72 65 61 73 6f 6e 73 20 62 65  other reasons be
32750 73 69 64 65 20 28 31 29 20 74 6f 20 75 73 65 20  side (1) to use 
32760 61 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 20 20 20  a co-routine.   
32770 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   ** implementati
32780 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on?.    */.    i
32790 66 28 20 69 3d 3d 30 0a 20 20 20 20 20 26 26 20  f( i==0.     && 
327a0 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d  (pTabList->nSrc=
327b0 3d 31 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =1.            |
327c0 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  | (pTabList->a[1
327d0 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28 4a  ].fg.jointype&(J
327e0 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
327f0 29 21 3d 30 29 20 20 2f 2a 20 28 31 29 20 2a 2f  )!=0)  /* (1) */
32800 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
32810 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d   Implement a co-
32820 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
32830 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  l return a singl
32840 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
32850 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
32860 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74   on each invocat
32870 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
32880 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 20      int addrTop 
32890 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
328a0 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b 0a 20  rentAddr(v)+1;. 
328b0 20 20 20 20 0a 20 20 20 20 20 20 70 49 74 65 6d      .      pItem
328c0 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
328d0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
328e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
328f0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
32900 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
32910 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20  ->regReturn, 0, 
32920 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20  addrTop);.      
32930 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
32940 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  "%s", pItem->pTa
32950 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
32960 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
32970 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a  lSub = addrTop;.
32980 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
32990 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
329a0 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t, SRT_Coroutine
329b0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
329c0 72 6e 29 3b 0a 20 20 20 20 20 20 45 78 70 6c 61  rn);.      Expla
329d0 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
329e0 72 73 65 2c 20 31 2c 20 22 43 4f 2d 52 4f 55 54  rse, 1, "CO-ROUT
329f0 49 4e 45 20 30 78 25 70 22 2c 20 70 53 75 62 29  INE 0x%p", pSub)
32a00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
32a10 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
32a20 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  Sub, &dest);.   
32a30 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e     pItem->pTab->
32a40 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75  nRowLogEst = pSu
32a50 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  b->nSelectRow;. 
32a60 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 76       pItem->fg.v
32a70 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b  iaCoroutine = 1;
32a80 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
32a90 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e 69  gResult = dest.i
32aa0 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sdst;.      sqli
32ab0 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
32ac0 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d 3e 72 65  ine(v, pItem->re
32ad0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
32ae0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
32af0 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d 31  ere(v, addrTop-1
32b00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
32b10 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
32b20 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
32b30 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47  else{.      /* G
32b40 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
32b50 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 66  tine that will f
32b60 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ill an ephemeral
32b70 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20   table with.    
32b80 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74    ** the content
32b90 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65 72   of this subquer
32ba0 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  y.  pItem->addrF
32bb0 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e  illSub will poin
32bc0 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  t.      ** to th
32bd0 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
32be0 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72 6f   generated subro
32bf0 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72  utine.  pItem->r
32c00 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20 2a  egReturn.      *
32c10 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20  * is a register 
32c20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c  allocated to hol
32c30 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  d the subroutine
32c40 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 0a   return address.
32c50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
32c60 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20  nt topAddr;.    
32c70 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d    int onceAddr =
32c80 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65   0;.      int re
32c90 74 41 64 64 72 3b 0a 20 20 20 20 20 20 73 74 72  tAddr;.      str
32ca0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
32cb0 20 2a 70 50 72 69 6f 72 3b 0a 0a 20 20 20 20 20   *pPrior;..     
32cc0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
32cd0 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29  addrFillSub==0 )
32ce0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
32cf0 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
32d00 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
32d10 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74   topAddr = sqlit
32d20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
32d30 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70  OP_Integer, 0, p
32d40 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
32d50 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61  ;.      pItem->a
32d60 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70  ddrFillSub = top
32d70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 69 66  Addr+1;.      if
32d80 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f  ( pItem->fg.isCo
32d90 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20  rrelated==0 ){. 
32da0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
32db0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
32dc0 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64 20   correlated and 
32dd0 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  if we are not in
32de0 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20 20  side of.        
32df0 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74 68  ** a trigger, th
32e00 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  en we only need 
32e10 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76  to compute the v
32e20 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62 71  alue of the subq
32e30 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  uery.        ** 
32e40 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  once. */.       
32e50 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69   onceAddr = sqli
32e60 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
32e70 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62 65 43   OP_Once); VdbeC
32e80 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
32e90 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
32ea0 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
32eb0 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d   \"%s\"", pItem-
32ec0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
32ed0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32ee0 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d       VdbeNoopCom
32ef0 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69  ment((v, "materi
32f00 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70  alize \"%s\"", p
32f10 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
32f20 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e));.      }.   
32f30 20 20 20 70 50 72 69 6f 72 20 3d 20 69 73 53 65     pPrior = isSe
32f40 6c 66 4a 6f 69 6e 56 69 65 77 28 70 54 61 62 4c  lfJoinView(pTabL
32f50 69 73 74 2c 20 70 49 74 65 6d 29 3b 0a 20 20 20  ist, pItem);.   
32f60 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29 7b     if( pPrior ){
32f70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32f80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
32f90 5f 4f 70 65 6e 44 75 70 2c 20 70 49 74 65 6d 2d  _OpenDup, pItem-
32fa0 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 69 6f 72  >iCursor, pPrior
32fb0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
32fc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
32fd0 6f 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29  or->pSelect!=0 )
32fe0 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e  ;.        pSub->
32ff0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
33000 69 6f 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 6e 53  ior->pSelect->nS
33010 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
33020 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
33030 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
33040 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
33050 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d  EphemTab, pItem-
33060 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
33070 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50     ExplainQueryP
33080 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20  lan((pParse, 1, 
33090 22 4d 41 54 45 52 49 41 4c 49 5a 45 20 30 78 25  "MATERIALIZE 0x%
330a0 70 22 2c 20 70 53 75 62 29 29 3b 0a 20 20 20 20  p", pSub));.    
330b0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
330c0 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20  t(pParse, pSub, 
330d0 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  &dest);.      }.
330e0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
330f0 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
33100 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
33110 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65  ;.      if( once
33120 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56 64  Addr ) sqlite3Vd
33130 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e  beJumpHere(v, on
33140 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72  ceAddr);.      r
33150 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  etAddr = sqlite3
33160 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
33170 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e  _Return, pItem->
33180 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
33190 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
331a0 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65  , "end %s", pIte
331b0 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
331c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
331d0 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74  dbeChangeP1(v, t
331e0 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64 72 29  opAddr, retAddr)
331f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
33200 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
33210 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
33220 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
33230 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
33240 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
33250 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
33260 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  -= sqlite3Select
33270 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20  ExprHeight(p);. 
33280 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68     pParse->zAuth
33290 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64  Context = zSaved
332a0 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65 6e  AuthContext;.#en
332b0 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 56 61  dif.  }..  /* Va
332c0 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73 20 6f  rious elements o
332d0 66 20 74 68 65 20 53 45 4c 45 43 54 20 63 6f 70  f the SELECT cop
332e0 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c 20 76  ied into local v
332f0 61 72 69 61 62 6c 65 73 20 66 6f 72 0a 20 20 2a  ariables for.  *
33300 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 2a 2f  * convenience */
33310 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
33320 45 4c 69 73 74 3b 0a 20 20 70 57 68 65 72 65 20  EList;.  pWhere 
33330 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70  = p->pWhere;.  p
33340 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
33350 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67  oupBy;.  pHaving
33360 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20   = p->pHaving;. 
33370 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
33380 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  t = (p->selFlags
33390 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
333a0 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54  =0;..#if SELECTT
333b0 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 69  RACE_ENABLED.  i
333c0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
333d0 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
333e0 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
333f0 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c  (0x400,pParse,p,
33400 28 22 41 66 74 65 72 20 61 6c 6c 20 46 52 4f 4d  ("After all FROM
33410 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79 73 69 73  -clause analysis
33420 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
33430 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
33440 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
33450 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
33460 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45  QLITE_COUNTOFVIE
33470 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  W_OPTIMIZATION. 
33480 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
33490 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
334a0 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
334b0 65 72 7c 53 51 4c 49 54 45 5f 43 6f 75 6e 74 4f  er|SQLITE_CountO
334c0 66 56 69 65 77 29 0a 20 20 20 26 26 20 63 6f 75  fView).   && cou
334d0 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a 61  ntOfViewOptimiza
334e0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 29 0a  tion(pParse, p).
334f0 20 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d    ){.    if( db-
33500 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
33510 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
33520 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  .    pEList = p-
33530 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 70 54 61  >pEList;.    pTa
33540 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
33550 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
33560 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 69  * If the query i
33570 73 20 44 49 53 54 49 4e 43 54 20 77 69 74 68 20  s DISTINCT with 
33580 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74 20  an ORDER BY but 
33590 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
335a0 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69  ate, and .  ** i
335b0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73  f the select-lis
335c0 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  t is the same as
335d0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69   the ORDER BY li
335e0 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75  st, then this qu
335f0 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  ery.  ** can be 
33600 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 47  rewritten as a G
33610 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65  ROUP BY. In othe
33620 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20  r words, this:. 
33630 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
33640 45 43 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a  ECT DISTINCT xyz
33650 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20   FROM ... ORDER 
33660 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a  BY xyz.  **.  **
33670 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   is transformed 
33680 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
33690 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f    SELECT xyz FRO
336a0 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78  M ... GROUP BY x
336b0 79 7a 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a  yz ORDER BY xyz.
336c0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65    **.  ** The se
336d0 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65  cond form is pre
336e0 66 65 72 72 65 64 20 61 73 20 61 20 73 69 6e 67  ferred as a sing
336f0 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d  le index (or tem
33700 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20  p-table) may be 
33710 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62  .  ** used for b
33720 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  oth the ORDER BY
33730 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72   and DISTINCT pr
33740 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69  ocessing. As ori
33750 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72  ginally .  ** wr
33760 69 74 74 65 6e 20 74 68 65 20 71 75 65 72 79 20  itten the query 
33770 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d  must use a temp-
33780 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61  table for at lea
33790 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52  st one of the OR
337a0 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64  DER .  ** BY and
337b0 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61   DISTINCT, and a
337c0 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72  n index or separ
337d0 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66  ate temp-table f
337e0 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20  or the other..  
337f0 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  */.  if( (p->sel
33800 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
33810 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
33820 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
33830 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45   .   && sqlite3E
33840 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 73  xprListCompare(s
33850 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 70  Sort.pOrderBy, p
33860 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20  EList, -1)==0.  
33870 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  ){.    p->selFla
33880 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e  gs &= ~SF_Distin
33890 63 74 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79  ct;.    pGroupBy
338a0 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d   = p->pGroupBy =
338b0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
338c0 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20  Dup(db, pEList, 
338d0 30 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63  0);.    /* Notic
338e0 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75  e that even thou
338f0 67 68 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20  ght SF_Distinct 
33900 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64  has been cleared
33910 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67   from p->selFlag
33920 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44  s,.    ** the sD
33930 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69  istinct.isTnct i
33940 73 20 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65  s still set.  He
33950 6e 63 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72  nce, isTnct repr
33960 65 73 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a  esents the.    *
33970 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69  * original setti
33980 6e 67 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73  ng of the SF_Dis
33990 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20  tinct flag, not 
339a0 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74  the current sett
339b0 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ing */.    asser
339c0 74 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  t( sDistinct.isT
339d0 6e 63 74 20 29 3b 0a 0a 23 69 66 20 53 45 4c 45  nct );..#if SELE
339e0 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
339f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
33a00 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 34  electTrace & 0x4
33a10 30 30 20 29 7b 0a 20 20 20 20 20 20 53 45 4c 45  00 ){.      SELE
33a20 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70 50  CTTRACE(0x400,pP
33a30 61 72 73 65 2c 70 2c 28 22 54 72 61 6e 73 66 6f  arse,p,("Transfo
33a40 72 6d 20 44 49 53 54 49 4e 43 54 20 69 6e 74 6f  rm DISTINCT into
33a50 20 47 52 4f 55 50 20 42 59 3a 5c 6e 22 29 29 3b   GROUP BY:\n"));
33a60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
33a70 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
33a80 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  p, 0);.    }.#en
33a90 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  dif.  }..  /* If
33aa0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
33ab0 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
33ac0 65 6e 20 63 72 65 61 74 65 20 61 6e 20 65 70 68  en create an eph
33ad0 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 0a  emeral index to.
33ae0 20 20 2a 2a 20 64 6f 20 74 68 65 20 73 6f 72 74    ** do the sort
33af0 69 6e 67 2e 20 20 42 75 74 20 74 68 69 73 20 73  ing.  But this s
33b00 6f 72 74 69 6e 67 20 65 70 68 65 6d 65 72 61 6c  orting ephemeral
33b10 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64   index might end
33b20 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e 67 20 75   up.  ** being u
33b30 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74  nused if the dat
33b40 61 20 63 61 6e 20 62 65 20 65 78 74 72 61 63 74  a can be extract
33b50 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64  ed in pre-sorted
33b60 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20 49 66 20   order..  ** If 
33b70 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
33b80 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f 4f 70  , then the OP_Op
33b90 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
33ba0 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  ruction will be.
33bb0 20 20 2a 2a 20 63 68 61 6e 67 65 64 20 74 6f 20    ** changed to 
33bc0 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 20  an OP_Noop once 
33bd0 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68  we figure out th
33be0 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  at the sorting i
33bf0 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20 6e 6f 74  ndex is.  ** not
33c00 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 73 53   needed.  The sS
33c10 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
33c20 78 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  x variable is us
33c30 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  ed to facilitate
33c40 0a 20 20 2a 2a 20 74 68 61 74 20 63 68 61 6e 67  .  ** that chang
33c50 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 53  e..  */.  if( sS
33c60 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ort.pOrderBy ){.
33c70 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
33c80 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49  yInfo;.    pKeyI
33c90 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
33ca0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
33cb0 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
33cc0 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
33cd0 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  , 0, pEList->nEx
33ce0 70 72 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 69  pr);.    sSort.i
33cf0 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  ECursor = pParse
33d00 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 53  ->nTab++;.    sS
33d10 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
33d20 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x =.      sqlite
33d30 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
33d40 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
33d50 0a 20 20 20 20 20 20 20 20 20 20 73 53 6f 72 74  .          sSort
33d60 2e 69 45 43 75 72 73 6f 72 2c 20 73 53 6f 72 74  .iECursor, sSort
33d70 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  .pOrderBy->nExpr
33d80 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  +1+pEList->nExpr
33d90 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 28  , 0,.          (
33da0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
33db0 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20 20 20  P4_KEYINFO.     
33dc0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
33dd0 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
33de0 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  ndex = -1;.  }..
33df0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70    /* If the outp
33e00 75 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66  ut is destined f
33e10 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  or a temporary t
33e20 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20  able, open that 
33e30 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
33e40 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
33e50 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
33e60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
33e70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
33e80 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74  Ephemeral, pDest
33e90 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73  ->iSDParm, pELis
33ea0 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a  t->nExpr);.  }..
33eb0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d    /* Set the lim
33ec0 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e  iter..  */.  iEn
33ed0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  d = sqlite3VdbeM
33ee0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 69  akeLabel(v);.  i
33ef0 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
33f00 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 29  & SF_FixedLimit)
33f10 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 53  ==0 ){.    p->nS
33f20 65 6c 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20  electRow = 320; 
33f30 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f   /* 4 billion ro
33f40 77 73 20 2a 2f 0a 20 20 7d 0a 20 20 63 6f 6d 70  ws */.  }.  comp
33f50 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
33f60 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e  s(pParse, p, iEn
33f70 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  d);.  if( p->iLi
33f80 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f 72 74 2e  mit==0 && sSort.
33f90 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30  addrSortIndex>=0
33fa0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
33fb0 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28  dbeChangeOpcode(
33fc0 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72  v, sSort.addrSor
33fd0 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f 72 74 65  tIndex, OP_Sorte
33fe0 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73 53 6f 72  rOpen);.    sSor
33ff0 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d 20 53  t.sortFlags |= S
34000 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74 65  ORTFLAG_UseSorte
34010 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  r;.  }..  /* Ope
34020 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69  n an ephemeral i
34030 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
34040 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65 74  the distinct set
34050 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
34060 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
34070 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 44  stinct ){.    sD
34080 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 20  istinct.tabTnct 
34090 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
340a0 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  ;.    sDistinct.
340b0 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c 69 74  addrTnct = sqlit
340c0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
340d0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
340e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
340f0 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69 6e           sDistin
34100 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30  ct.tabTnct, 0, 0
34110 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
34120 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
34130 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46 72  sqlite3KeyInfoFr
34140 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
34150 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30  e, p->pEList,0,0
34160 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
34170 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59            P4_KEY
34180 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74  INFO);.    sqlit
34190 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
341a0 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  , BTREE_UNORDERE
341b0 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  D);.    sDistinc
341c0 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48  t.eTnctType = WH
341d0 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f  ERE_DISTINCT_UNO
341e0 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b  RDERED;.  }else{
341f0 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65  .    sDistinct.e
34200 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45  TnctType = WHERE
34210 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a  _DISTINCT_NOOP;.
34220 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67    }..  if( !isAg
34230 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30  g && pGroupBy==0
34240 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67   ){.    /* No ag
34250 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
34260 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42  s and no GROUP B
34270 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  Y clause */.    
34280 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d  u16 wctrlFlags =
34290 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e   (sDistinct.isTn
342a0 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f  ct ? WHERE_WANT_
342b0 44 49 53 54 49 4e 43 54 20 3a 20 30 29 0a 20 20  DISTINCT : 0).  
342c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
342d0 20 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20   | (p->selFlags 
342e0 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69 74 29  & SF_FixedLimit)
342f0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
34300 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
34310 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69  .    Window *pWi
34320 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 20 20 20 20  n = p->pWin;    
34330 20 20 2f 2a 20 4d 61 73 74 65 72 20 77 69 6e 64    /* Master wind
34340 6f 77 20 6f 62 6a 65 63 74 20 28 6f 72 20 4e 55  ow object (or NU
34350 4c 4c 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  LL) */.    if( p
34360 57 69 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Win ){.      sql
34370 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 49 6e  ite3WindowCodeIn
34380 69 74 28 70 50 61 72 73 65 2c 20 70 57 69 6e 29  it(pParse, pWin)
34390 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
343a0 20 20 20 61 73 73 65 72 74 28 20 57 48 45 52 45     assert( WHERE
343b0 5f 55 53 45 5f 4c 49 4d 49 54 3d 3d 53 46 5f 46  _USE_LIMIT==SF_F
343c0 69 78 65 64 4c 69 6d 69 74 20 29 3b 0a 0a 0a 20  ixedLimit );... 
343d0 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20     /* Begin the 
343e0 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a  database scan. *
343f0 2f 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  /.    SELECTTRAC
34400 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 57  E(1,pParse,p,("W
34410 68 65 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a  hereBegin\n"));.
34420 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
34430 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
34440 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
34450 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70   pWhere, sSort.p
34460 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
34470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34480 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73          p->pELis
34490 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 70  t, wctrlFlags, p
344a0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
344b0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
344c0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
344d0 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  nd;.    if( sqli
344e0 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
344f0 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c  wCount(pWInfo) <
34500 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29   p->nSelectRow )
34510 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  {.      p->nSele
34520 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 57  ctRow = sqlite3W
34530 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75  hereOutputRowCou
34540 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nt(pWInfo);.    
34550 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73 74 69  }.    if( sDisti
34560 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 73 71  nct.isTnct && sq
34570 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
34580 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a  inct(pWInfo) ){.
34590 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e        sDistinct.
345a0 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71 6c 69  eTnctType = sqli
345b0 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e  te3WhereIsDistin
345c0 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  ct(pWInfo);.    
345d0 7d 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e  }.    if( sSort.
345e0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
345f0 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d    sSort.nOBSat =
34600 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f   sqlite3WhereIsO
34610 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a  rdered(pWInfo);.
34620 20 20 20 20 20 20 73 53 6f 72 74 2e 62 4f 72 64        sSort.bOrd
34630 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20  eredInnerLoop = 
34640 73 71 6c 69 74 65 33 57 68 65 72 65 4f 72 64 65  sqlite3WhereOrde
34650 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 28 70 57 49  redInnerLoop(pWI
34660 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
34670 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53  sSort.nOBSat==sS
34680 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ort.pOrderBy->nE
34690 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
346a0 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
346b0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
346c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74  ..    /* If sort
346d0 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
346e0 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
346f0 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68  prior OP_OpenEph
34700 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69  emeral .    ** i
34710 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64  nstruction ended
34720 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65   up not being ne
34730 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67  eded, then chang
34740 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
34750 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  emeral.    ** in
34760 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20  to an OP_Noop.. 
34770 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 53     */.    if( sS
34780 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
34790 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70 4f  x>=0 && sSort.pO
347a0 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
347b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
347c0 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53  angeToNoop(v, sS
347d0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
347e0 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  x);.    }..    a
347f0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
34800 3d 3d 70 45 4c 69 73 74 20 29 3b 0a 23 69 66 6e  ==pEList );.#ifn
34810 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
34820 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 69  WINDOWFUNC.    i
34830 66 28 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 20  f( pWin ){.     
34840 20 69 6e 74 20 61 64 64 72 47 6f 73 75 62 20 3d   int addrGosub =
34850 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
34860 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
34870 69 6e 74 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69  int iCont = sqli
34880 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
34890 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  (v);.      int i
348a0 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
348b0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
348c0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 47 6f  .      int regGo
348d0 73 75 62 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  sub = ++pParse->
348e0 6e 4d 65 6d 3b 0a 0a 20 20 20 20 20 20 73 71 6c  nMem;..      sql
348f0 69 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 53 74  ite3WindowCodeSt
34900 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 57  ep(pParse, p, pW
34910 49 6e 66 6f 2c 20 72 65 67 47 6f 73 75 62 2c 20  Info, regGosub, 
34920 61 64 64 72 47 6f 73 75 62 29 3b 0a 0a 20 20 20  addrGosub);..   
34930 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
34940 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
34950 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   0, iBreak);.   
34960 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
34970 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
34980 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 20 20  drGosub);.      
34990 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
349a0 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26  pParse, p, -1, &
349b0 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63  sSort, &sDistinc
349c0 74 2c 20 70 44 65 73 74 2c 20 69 43 6f 6e 74 2c  t, pDest, iCont,
349d0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
349e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
349f0 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
34a00 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34a10 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
34a20 5f 52 65 74 75 72 6e 2c 20 72 65 67 47 6f 73 75  _Return, regGosu
34a30 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
34a40 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
34a50 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  l(v, iBreak);.  
34a60 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
34a70 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  * SQLITE_OMIT_WI
34a80 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20 20  NDOWFUNC */.    
34a90 7b 0a 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74  {.      /* Use t
34aa0 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65  he standard inne
34ab0 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 20  r loop. */.     
34ac0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
34ad0 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20  (pParse, p, -1, 
34ae0 26 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e  &sSort, &sDistin
34af0 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20  ct, pDest,.     
34b00 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
34b10 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70  eContinueLabel(p
34b20 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20  WInfo),.        
34b30 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72    sqlite3WhereBr
34b40 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  eakLabel(pWInfo)
34b50 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64  );..      /* End
34b60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
34b70 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a  an loop..      *
34b80 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  /.      sqlite3W
34b90 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
34ba0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
34bb0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
34bc0 20 77 68 65 6e 20 74 68 65 72 65 20 65 78 69 73   when there exis
34bd0 74 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  t aggregate func
34be0 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50  tions or a GROUP
34bf0 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a   BY clause.    *
34c00 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20  * or both */.   
34c10 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
34c20 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  ;    /* Name con
34c30 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73  text for process
34c40 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e  ing aggregate in
34c50 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  formation */.   
34c60 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20   int iAMem;     
34c70 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
34c80 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74  m address for st
34c90 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52  oring current GR
34ca0 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e  OUP BY */.    in
34cb0 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iBMem;        
34cc0 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
34cd0 64 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69  ddress for previ
34ce0 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a  ous GROUP BY */.
34cf0 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67      int iUseFlag
34d00 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ;       /* Mem a
34d10 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66  ddress holding f
34d20 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74  lag indicating t
34d30 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20  hat at least.   
34d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d50 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20       ** one row 
34d60 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20  of the input to 
34d70 74 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68  the aggregator h
34d80 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20  as been.        
34d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34da0 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ** processed */.
34db0 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c      int iAbortFl
34dc0 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61  ag;     /* Mem a
34dd0 64 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75  ddress which cau
34de0 73 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20  ses query abort 
34df0 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20  if positive */. 
34e00 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f     int groupBySo
34e10 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63  rt;    /* Rows c
34e20 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20  ome from source 
34e30 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65  in GROUP BY orde
34e40 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64  r */.    int add
34e50 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  rEnd;        /* 
34e60 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e  End of processin
34e70 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  g for this SELEC
34e80 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  T */.    int sor
34e90 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20  tPTab = 0;   /* 
34ea0 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64  Pseudotable used
34eb0 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69   to decode sorti
34ec0 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  ng results */.  
34ed0 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20    int sortOut = 
34ee0 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20  0;    /* Output 
34ef0 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68  register from th
34f00 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20  e sorter */.    
34f10 69 6e 74 20 6f 72 64 65 72 42 79 47 72 70 20 3d  int orderByGrp =
34f20 20 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 74   0; /* True if t
34f30 68 65 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20  he GROUP BY and 
34f40 4f 52 44 45 52 20 42 59 20 61 72 65 20 74 68 65  ORDER BY are the
34f50 20 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a   same */..    /*
34f60 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20   Remove any and 
34f70 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77  all aliases betw
34f80 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73  een the result s
34f90 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  et and the.    *
34fa0 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  * GROUP BY claus
34fb0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
34fc0 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
34fd0 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20      int k;      
34fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ff0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
35000 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  r */.      struc
35010 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
35020 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20  *pItem;  /* For 
35030 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70  looping over exp
35040 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73  ression in a lis
35050 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  t */..      for(
35060 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  k=p->pEList->nEx
35070 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c  pr, pItem=p->pEL
35080 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  ist->a; k>0; k--
35090 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
350a0 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
350b0 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
350c0 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70   }.      for(k=p
350d0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20  GroupBy->nExpr, 
350e0 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e  pItem=pGroupBy->
350f0 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74  a; k>0; k--, pIt
35100 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
35110 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73  Item->u.x.iAlias
35120 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
35130 20 20 20 20 61 73 73 65 72 74 28 20 36 36 3d 3d      assert( 66==
35140 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
35150 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0) );.      if( 
35160 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 36 36  p->nSelectRow>66
35170 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
35180 20 3d 20 36 36 3b 0a 20 20 20 20 7d 65 6c 73 65   = 66;.    }else
35190 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
351a0 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
351b0 28 31 29 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  (1) );.      p->
351c0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a  nSelectRow = 0;.
351d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
351e0 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61   there is both a
351f0 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e   GROUP BY and an
35200 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
35210 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20   and they are.  
35220 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20    ** identical, 
35230 74 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20 70  then it may be p
35240 6f 73 73 69 62 6c 65 20 74 6f 20 64 69 73 61 62  ossible to disab
35250 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  le the ORDER BY 
35260 63 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f  clause .    ** o
35270 6e 20 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68  n the grounds th
35280 61 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  at the GROUP BY 
35290 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65  will cause eleme
352a0 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20  nts to come out 
352b0 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 63  .    ** in the c
352c0 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20 49 74  orrect order. It
352d0 20 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20   also may not - 
352e0 74 68 65 20 47 52 4f 55 50 20 42 59 20 6d 69 67  the GROUP BY mig
352f0 68 74 20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20  ht use a.    ** 
35300 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 74  database index t
35310 68 61 74 20 63 61 75 73 65 73 20 72 6f 77 73 20  hat causes rows 
35320 74 6f 20 62 65 20 67 72 6f 75 70 65 64 20 74 6f  to be grouped to
35330 67 65 74 68 65 72 20 61 73 20 72 65 71 75 69 72  gether as requir
35340 65 64 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f  ed.    ** but no
35350 74 20 61 63 74 75 61 6c 6c 79 20 73 6f 72 74 65  t actually sorte
35360 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 72  d. Either way, r
35370 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
35380 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f  hat the.    ** O
35390 52 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55  RDER BY and GROU
353a0 50 20 42 59 20 63 6c 61 75 73 65 73 20 61 72 65  P BY clauses are
353b0 20 74 68 65 20 73 61 6d 65 20 62 79 20 73 65 74   the same by set
353c0 74 69 6e 67 20 74 68 65 20 6f 72 64 65 72 42 79  ting the orderBy
353d0 47 72 70 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  Grp.    ** varia
353e0 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ble.  */.    if(
353f0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
35400 43 6f 6d 70 61 72 65 28 70 47 72 6f 75 70 42 79  Compare(pGroupBy
35410 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
35420 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , -1)==0 ){.    
35430 20 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31    orderByGrp = 1
35440 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a  ;.    }. .    /*
35450 20 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20   Create a label 
35460 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20  to jump to when 
35470 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74  we want to abort
35480 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
35490 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69    addrEnd = sqli
354a0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
354b0 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  (v);..    /* Con
354c0 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e  vert TK_COLUMN n
354d0 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47  odes into TK_AGG
354e0 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65  _COLUMN and make
354f0 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20   entries in.    
35500 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20  ** sAggInfo for 
35510 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  all TK_AGG_FUNCT
35520 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70  ION nodes in exp
35530 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a  ressions of the.
35540 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74      ** SELECT st
35550 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a  atement..    */.
35560 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c      memset(&sNC,
35570 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
35580 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65  ;.    sNC.pParse
35590 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73   = pParse;.    s
355a0 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
355b0 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e  abList;.    sNC.
355c0 75 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26  uNC.pAggInfo = &
355d0 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 56 56  sAggInfo;.    VV
355e0 41 5f 4f 4e 4c 59 28 20 73 4e 43 2e 6e 63 46 6c  A_ONLY( sNC.ncFl
355f0 61 67 73 20 3d 20 4e 43 5f 55 41 67 67 49 6e 66  ags = NC_UAggInf
35600 6f 3b 20 29 0a 20 20 20 20 73 41 67 67 49 6e 66  o; ).    sAggInf
35610 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61 72 73 65  o.mnReg = pParse
35620 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41  ->nMem+1;.    sA
35630 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43  ggInfo.nSortingC
35640 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79  olumn = pGroupBy
35650 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   ? pGroupBy->nEx
35660 70 72 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67  pr : 0;.    sAgg
35670 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20  Info.pGroupBy = 
35680 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71  pGroupBy;.    sq
35690 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
356a0 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45  AggList(&sNC, pE
356b0 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  List);.    sqlit
356c0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
356d0 4c 69 73 74 28 26 73 4e 43 2c 20 73 53 6f 72 74  List(&sNC, sSort
356e0 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  .pOrderBy);.    
356f0 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20  if( pHaving ){. 
35700 20 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42       if( pGroupB
35710 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  y ){.        ass
35720 65 72 74 28 20 70 57 68 65 72 65 3d 3d 70 2d 3e  ert( pWhere==p->
35730 70 57 68 65 72 65 20 29 3b 0a 20 20 20 20 20 20  pWhere );.      
35740 20 20 61 73 73 65 72 74 28 20 70 48 61 76 69 6e    assert( pHavin
35750 67 3d 3d 70 2d 3e 70 48 61 76 69 6e 67 20 29 3b  g==p->pHaving );
35760 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
35770 20 70 47 72 6f 75 70 42 79 3d 3d 70 2d 3e 70 47   pGroupBy==p->pG
35780 72 6f 75 70 42 79 20 29 3b 0a 20 20 20 20 20 20  roupBy );.      
35790 20 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28    havingToWhere(
357a0 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
357b0 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e      pWhere = p->
357c0 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 7d 0a  pWhere;.      }.
357d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
357e0 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
357f0 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67  es(&sNC, pHaving
35800 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  );.    }.    sAg
35810 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74  gInfo.nAccumulat
35820 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43  or = sAggInfo.nC
35830 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 70  olumn;.    if( p
35840 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 26 26  ->pGroupBy==0 &&
35850 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 26   p->pHaving==0 &
35860 26 20 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  & sAggInfo.nFunc
35870 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 69 6e  ==1 ){.      min
35880 4d 61 78 46 6c 61 67 20 3d 20 6d 69 6e 4d 61 78  MaxFlag = minMax
35890 51 75 65 72 79 28 64 62 2c 20 73 41 67 67 49 6e  Query(db, sAggIn
358a0 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70  fo.aFunc[0].pExp
358b0 72 2c 20 26 70 4d 69 6e 4d 61 78 4f 72 64 65 72  r, &pMinMaxOrder
358c0 42 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  By);.    }else{.
358d0 20 20 20 20 20 20 6d 69 6e 4d 61 78 46 6c 61 67        minMaxFlag
358e0 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
358f0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20  _NORMAL;.    }. 
35900 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
35910 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b  ggInfo.nFunc; i+
35920 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
35930 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
35940 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  ty(sAggInfo.aFun
35950 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78  c[i].pExpr, EP_x
35960 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
35970 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c     sNC.ncFlags |
35980 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a  = NC_InAggFunc;.
35990 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
359a0 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28  rAnalyzeAggList(
359b0 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61  &sNC, sAggInfo.a
359c0 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78  Func[i].pExpr->x
359d0 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73  .pList);.      s
359e0 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e  NC.ncFlags &= ~N
359f0 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20  C_InAggFunc;.   
35a00 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   }.    sAggInfo.
35a10 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  mxReg = pParse->
35a20 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62  nMem;.    if( db
35a30 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
35a40 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
35a50 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
35a60 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66  E_ENABLED.    if
35a70 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
35a80 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a  race & 0x400 ){.
35a90 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
35aa0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
35ab0 30 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x400,pParse,p,(
35ac0 22 41 66 74 65 72 20 61 67 67 72 65 67 61 74 65  "After aggregate
35ad0 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b   analysis:\n"));
35ae0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72  .      sqlite3Tr
35af0 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
35b00 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72  p, 0);.      for
35b10 28 69 69 3d 30 3b 20 69 69 3c 73 41 67 67 49 6e  (ii=0; ii<sAggIn
35b20 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b  fo.nColumn; ii++
35b30 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
35b40 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 61  e3DebugPrintf("a
35b50 67 67 2d 63 6f 6c 75 6d 6e 5b 25 64 5d 20 69 4d  gg-column[%d] iM
35b60 65 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  em=%d\n",.      
35b70 20 20 20 20 20 20 69 69 2c 20 73 41 67 67 49 6e        ii, sAggIn
35b80 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 69 4d 65 6d  fo.aCol[ii].iMem
35b90 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
35ba0 65 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30  e3TreeViewExpr(0
35bb0 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b  , sAggInfo.aCol[
35bc0 69 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20  ii].pExpr, 0);. 
35bd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
35be0 28 69 69 3d 30 3b 20 69 69 3c 73 41 67 67 49 6e  (ii=0; ii<sAggIn
35bf0 66 6f 2e 6e 46 75 6e 63 3b 20 69 69 2b 2b 29 7b  fo.nFunc; ii++){
35c00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35c10 44 65 62 75 67 50 72 69 6e 74 66 28 22 61 67 67  DebugPrintf("agg
35c20 2d 66 75 6e 63 5b 25 64 5d 3a 20 69 4d 65 6d 3d  -func[%d]: iMem=
35c30 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
35c40 20 20 20 69 69 2c 20 73 41 67 67 49 6e 66 6f 2e     ii, sAggInfo.
35c50 61 46 75 6e 63 5b 69 69 5d 2e 69 4d 65 6d 29 3b  aFunc[ii].iMem);
35c60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35c70 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c 20  TreeViewExpr(0, 
35c80 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
35c90 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  i].pExpr, 0);.  
35ca0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
35cb0 69 66 0a 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63  if...    /* Proc
35cc0 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
35cd0 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50  gates with GROUP
35ce0 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66   BY is very diff
35cf0 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a  erent and.    **
35d00 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c   much more compl
35d10 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74  ex than aggregat
35d20 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f  es without a GRO
35d30 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  UP BY..    */.  
35d40 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
35d50 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  {.      KeyInfo 
35d60 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b  *pKeyInfo;  /* K
35d70 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  eying informatio
35d80 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20  n for the group 
35d90 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  by clause */.   
35da0 20 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20     int addr1;   
35db0 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42         /* A-vs-B
35dc0 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d   comparision jum
35dd0 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
35de0 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f  ddrOutputRow;  /
35df0 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f  * Start of subro
35e00 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
35e10 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20  ts a result row 
35e20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
35e30 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20  OutputRow;   /* 
35e40 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  Return address r
35e50 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70  egister for outp
35e60 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ut subroutine */
35e70 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
35e80 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65  etAbort;   /* Se
35e90 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67  t the abort flag
35ea0 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
35eb0 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
35ec0 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20  OfLoop;  /* Top 
35ed0 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  of the input loo
35ee0 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
35ef0 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f  ddrSortingIdx; /
35f00 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  * The OP_OpenEph
35f10 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73  emeral for the s
35f20 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  orting index */.
35f30 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52 65        int addrRe
35f40 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62  set;      /* Sub
35f50 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65  routine for rese
35f60 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75  tting the accumu
35f70 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69  lator */.      i
35f80 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20  nt regReset;    
35f90 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
35fa0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
35fb0 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69  r reset subrouti
35fc0 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ne */..      /* 
35fd0 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52  If there is a GR
35fe0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65  OUP BY clause we
35ff0 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f   might need a so
36000 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20  rting index to. 
36010 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e       ** implemen
36020 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20  t it.  Allocate 
36030 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64  that sorting ind
36040 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74  ex now.  If it t
36050 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a  urns out.      *
36060 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
36070 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61   need it after a
36080 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65  ll, the OP_Sorte
36090 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f  rOpen instructio
360a0 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  n.      ** will 
360b0 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
360c0 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20  o a Noop.  .    
360d0 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49    */.      sAggI
360e0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d  nfo.sortingIdx =
360f0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
36100 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
36110 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
36120 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
36130 72 73 65 2c 70 47 72 6f 75 70 42 79 2c 30 2c 73  rse,pGroupBy,0,s
36140 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29  AggInfo.nColumn)
36150 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74  ;.      addrSort
36160 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33  ingIdx = sqlite3
36170 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
36180 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20  _SorterOpen, .  
36190 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
361a0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67  .sortingIdx, sAg
361b0 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
361c0 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  lumn, .         
361d0 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49   0, (char*)pKeyI
361e0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
361f0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74  ;..      /* Init
36200 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f  ialize memory lo
36210 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20  cations used by 
36220 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61  GROUP BY aggrega
36230 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20  te processing.  
36240 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73      */.      iUs
36250 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  eFlag = ++pParse
36260 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41  ->nMem;.      iA
36270 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61  bortFlag = ++pPa
36280 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
36290 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20   regOutputRow = 
362a0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
362b0 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
362c0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
362d0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
362e0 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20       regReset = 
362f0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
36300 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20        addrReset 
36310 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
36320 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
36330 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iAMem = pParse-
36340 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
36350 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
36360 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
36370 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20  ;.      iBMem = 
36380 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
36390 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
363a0 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
363b0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
363c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
363d0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
363e0 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  0, iAbortFlag);.
363f0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
36400 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f  t((v, "clear abo
36410 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
36420 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
36430 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
36440 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b  0, iAMem, iAMem+
36450 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d  pGroupBy->nExpr-
36460 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65  1);..      /* Be
36470 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20  gin a loop that 
36480 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c  will extract all
36490 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20   source rows in 
364a0 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a  GROUP BY order..
364b0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69        ** This mi
364c0 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20  ght involve two 
364d0 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77  separate loops w
364e0 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69  ith an OP_Sort i
364f0 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20  n between, or.  
36500 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
36510 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70  be a single loop
36520 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e   that uses an in
36530 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69  dex to extract i
36540 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20  nformation.     
36550 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74   ** in the right
36560 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20   order to begin 
36570 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  with..      */. 
36580 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36590 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
365a0 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64  ub, regReset, ad
365b0 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
365c0 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
365d0 61 72 73 65 2c 70 2c 28 22 57 68 65 72 65 42 65  arse,p,("WhereBe
365e0 67 69 6e 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  gin\n"));.      
365f0 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
36600 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
36610 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
36620 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30  ere, pGroupBy, 0
36630 2c 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52  ,.          WHER
36640 45 5f 47 52 4f 55 50 42 59 20 7c 20 28 6f 72 64  E_GROUPBY | (ord
36650 65 72 42 79 47 72 70 20 3f 20 57 48 45 52 45 5f  erByGrp ? WHERE_
36660 53 4f 52 54 42 59 47 52 4f 55 50 20 3a 20 30 29  SORTBYGROUP : 0)
36670 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
36680 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
36690 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
366a0 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  nd;.      if( sq
366b0 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
366c0 72 65 64 28 70 57 49 6e 66 6f 29 3d 3d 70 47 72  red(pWInfo)==pGr
366d0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  oupBy->nExpr ){.
366e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
366f0 70 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65  ptimizer is able
36700 20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73   to deliver rows
36710 20 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64   in group by ord
36720 65 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a  er so.        **
36730 20 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20   we do not have 
36740 74 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50  to sort.  The OP
36750 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74  _OpenEphemeral t
36760 61 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  able will be.   
36770 20 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65       ** cancelle
36780 64 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20  d later because 
36790 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
367a0 20 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66   use the pKeyInf
367b0 6f 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  o.        */.   
367c0 20 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74       groupBySort
367d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
367e0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f  e{.        /* Ro
367f0 77 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75  ws are coming ou
36800 74 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65  t in undetermine
36810 64 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76  d order.  We hav
36820 65 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20  e to push.      
36830 20 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e    ** each row in
36840 74 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64  to a sorting ind
36850 65 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ex, terminate th
36860 65 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20  e first loop,.  
36870 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f        ** then lo
36880 6f 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74  op over the sort
36890 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64  ing index in ord
368a0 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75  er to get the ou
368b0 74 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  tput.        ** 
368c0 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a  in sorted order.
368d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
368e0 20 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a     int regBase;.
368f0 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52          int regR
36900 65 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69  ecord;.        i
36910 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt nCol;.       
36920 20 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a   int nGroupBy;..
36930 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 54          explainT
36940 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  empTable(pParse,
36950 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 73   .            (s
36960 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
36970 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26  && (p->selFlags&
36980 53 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30 29  SF_Distinct)==0)
36990 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
369a0 20 20 20 20 20 20 20 22 44 49 53 54 49 4e 43 54         "DISTINCT
369b0 22 20 3a 20 22 47 52 4f 55 50 20 42 59 22 29 3b  " : "GROUP BY");
369c0 0a 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  ..        groupB
369d0 79 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  ySort = 1;.     
369e0 20 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47     nGroupBy = pG
369f0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
36a00 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47         nCol = nG
36a10 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
36a20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20  j = nGroupBy;.  
36a30 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
36a40 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d  <sAggInfo.nColum
36a50 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
36a60 20 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e     if( sAggInfo.
36a70 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43  aCol[i].iSorterC
36a80 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
36a90 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a          nCol++;.
36aa0 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
36ab0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
36ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
36ad0 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33  egBase = sqlite3
36ae0 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
36af0 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  rse, nCol);.    
36b00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
36b10 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
36b20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
36b30 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
36b40 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
36b50 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 2c  pBy, regBase, 0,
36b60 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d   0);.        j =
36b70 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 20   nGroupBy;.     
36b80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
36b90 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
36ba0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
36bb0 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
36bc0 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67  ol *pCol = &sAgg
36bd0 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20  Info.aCol[i];.  
36be0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
36bf0 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e  ->iSorterColumn>
36c00 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
36c10 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72    int r1 = j + r
36c20 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
36c30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
36c40 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 54 6f 52 65  odeGetColumnToRe
36c50 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
36c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c70 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
36c80 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c  pTab, pCol->iCol
36c90 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c  umn, pCol->iTabl
36ca0 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  e, r1);.        
36cb0 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
36cc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
36cd0 20 20 20 20 20 20 20 72 65 67 52 65 63 6f 72 64         regRecord
36ce0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
36cf0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
36d00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
36d10 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
36d20 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73  keRecord, regBas
36d30 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f  e, nCol, regReco
36d40 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
36d50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
36d60 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  , OP_SorterInser
36d70 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
36d80 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72  ingIdx, regRecor
36d90 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
36da0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
36db0 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
36dc0 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
36dd0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
36de0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
36df0 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  gBase, nCol);.  
36e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
36e10 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
36e20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
36e30 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 20 3d  sortingIdxPTab =
36e40 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50 61 72   sortPTab = pPar
36e50 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
36e60 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20 73 71      sortOut = sq
36e70 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
36e80 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
36e90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36ea0 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
36eb0 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20 73  udo, sortPTab, s
36ec0 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20  ortOut, nCol);. 
36ed0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
36ee0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
36ef0 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67 67 49  orterSort, sAggI
36f00 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
36f10 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
36f20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
36f30 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74  , "GROUP BY sort
36f40 22 29 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ")); VdbeCoverag
36f50 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 41  e(v);.        sA
36f60 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e  ggInfo.useSortin
36f70 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20  gIdx = 1;.      
36f80 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
36f90 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
36fa0 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ..      }..     
36fb0 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
36fc0 20 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 74 61   or temporary ta
36fd0 62 6c 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ble used by the 
36fe0 47 52 4f 55 50 20 42 59 20 73 6f 72 74 0a 20 20  GROUP BY sort.  
36ff0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 6e 61 74 75      ** will natu
37000 72 61 6c 6c 79 20 64 65 6c 69 76 65 72 20 72 6f  rally deliver ro
37010 77 73 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ws in the order 
37020 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
37030 4f 52 44 45 52 20 42 59 0a 20 20 20 20 20 20 2a  ORDER BY.      *
37040 2a 20 63 6c 61 75 73 65 2c 20 63 61 6e 63 65 6c  * clause, cancel
37050 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
37060 61 62 6c 65 20 6f 70 65 6e 20 63 6f 64 65 64 20  able open coded 
37070 65 61 72 6c 69 65 72 2e 0a 20 20 20 20 20 20 2a  earlier..      *
37080 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  *.      ** This 
37090 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
370a0 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74  on - the correct
370b0 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72   answer should r
370c0 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73  esult regardless
370d0 2e 0a 20 20 20 20 20 20 2a 2a 20 55 73 65 20 74  ..      ** Use t
370e0 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42  he SQLITE_GroupB
370f0 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69 74 68  yOrder flag with
37100 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
37110 5f 4f 50 54 49 4d 49 5a 45 52 20 74 6f 20 0a 20  _OPTIMIZER to . 
37120 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 20       ** disable 
37130 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
37140 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  n for testing pu
37150 72 70 6f 73 65 73 2e 20 20 2a 2f 0a 20 20 20 20  rposes.  */.    
37160 20 20 69 66 28 20 6f 72 64 65 72 42 79 47 72 70    if( orderByGrp
37170 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
37180 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
37190 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29  TE_GroupByOrder)
371a0 20 0a 20 20 20 20 20 20 20 26 26 20 28 67 72 6f   .       && (gro
371b0 75 70 42 79 53 6f 72 74 20 7c 7c 20 73 71 6c 69  upBySort || sqli
371c0 74 65 33 57 68 65 72 65 49 73 53 6f 72 74 65 64  te3WhereIsSorted
371d0 28 70 57 49 6e 66 6f 29 29 0a 20 20 20 20 20 20  (pWInfo)).      
371e0 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f 72 74  ){.        sSort
371f0 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  .pOrderBy = 0;. 
37200 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
37210 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
37220 2c 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74  , sSort.addrSort
37230 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d 0a  Index);.      }.
37240 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61  .      /* Evalua
37250 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  te the current G
37260 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e  ROUP BY terms an
37270 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62  d store in b0, b
37280 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, b2....      *
37290 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20  * (b0 is memory 
372a0 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30  location iBMem+0
372b0 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c  , b1 is iBMem+1,
372c0 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20   and so forth). 
372d0 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d       ** Then com
372e0 70 61 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  pare the current
372f0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
37300 61 67 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55  against the GROU
37310 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20  P BY terms.     
37320 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65   ** from the pre
37330 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e  vious row curren
37340 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30  tly stored in a0
37350 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20  , a1, a2....    
37360 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54    */.      addrT
37370 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  opOfLoop = sqlit
37380 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
37390 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
373a0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
373b0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
373c0 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
373d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
373e0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
373f0 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20   OP_SorterData, 
37400 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
37410 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Idx,.           
37420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
37430 6f 72 74 4f 75 74 2c 20 73 6f 72 74 50 54 61 62  ortOut, sortPTab
37440 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
37450 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f   for(j=0; j<pGro
37460 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  upBy->nExpr; j++
37470 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  ){.        if( g
37480 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
37490 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
374a0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
374b0 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62  Column, sortPTab
374c0 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20  , j, iBMem+j);. 
374d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
374e0 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
374f0 2e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b  .directMode = 1;
37500 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
37510 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
37520 65 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a  e, pGroupBy->a[j
37530 5d 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a  ].pExpr, iBMem+j
37540 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
37550 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
37560 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
37570 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65  OP_Compare, iAMe
37580 6d 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iBMem, pGroup
37590 42 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  By->nExpr,.     
375a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
375b0 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69       (char*)sqli
375c0 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
375d0 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49  eyInfo), P4_KEYI
375e0 4e 46 4f 29 3b 0a 20 20 20 20 20 20 61 64 64 72  NFO);.      addr
375f0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
37600 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
37610 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37620 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
37630 70 2c 20 61 64 64 72 31 2b 31 2c 20 30 2c 20 61  p, addr1+1, 0, a
37640 64 64 72 31 2b 31 29 3b 20 56 64 62 65 43 6f 76  ddr1+1); VdbeCov
37650 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20  erage(v);..     
37660 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
37670 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e  e that runs when
37680 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42  ever the GROUP B
37690 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20  Y changes..     
376a0 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74   ** Changes in t
376b0 68 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20  he GROUP BY are 
376c0 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20  detected by the 
376d0 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20  previous code.  
376e0 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49      ** block.  I
376f0 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20  f there were no 
37700 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c  changes, this bl
37710 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a  ock is skipped..
37720 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
37730 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69  * This code copi
37740 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70  es current group
37750 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c   by terms in b0,
37760 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20  b1,b2,....      
37770 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31  ** over to a0,a1
37780 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61  ,a2.  It then ca
37790 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73  lls the output s
377a0 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  ubroutine.      
377b0 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68  ** and resets th
377c0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
377d0 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
377e0 73 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e  s in preparation
377f0 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
37800 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20  e next GROUP BY 
37810 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a  batch..      */.
37820 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
37830 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
37840 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20  , iBMem, iAMem, 
37850 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29  pGroupBy->nExpr)
37860 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
37870 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
37880 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74  Gosub, regOutput
37890 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52  Row, addrOutputR
378a0 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
378b0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
378c0 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20  ut one row"));. 
378d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
378e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
378f0 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20  os, iAbortFlag, 
37900 61 64 64 72 45 6e 64 29 3b 20 56 64 62 65 43 6f  addrEnd); VdbeCo
37910 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
37920 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
37930 20 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c   "check abort fl
37940 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
37950 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
37960 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52  , OP_Gosub, regR
37970 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29  eset, addrReset)
37980 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
37990 65 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20 61  ent((v, "reset a
379a0 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
379b0 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
379c0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
379d0 63 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64  cumulators based
379e0 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   on the content 
379f0 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
37a00 63 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20  current row.    
37a10 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
37a20 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
37a30 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 20 20  , addr1);.      
37a40 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
37a50 72 28 70 50 61 72 73 65 2c 20 69 55 73 65 46 6c  r(pParse, iUseFl
37a60 61 67 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  ag, &sAggInfo);.
37a70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37a80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
37a90 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c  teger, 1, iUseFl
37aa0 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
37ab0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69  omment((v, "indi
37ac0 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63  cate data in acc
37ad0 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
37ae0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
37af0 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a  e loop.      */.
37b00 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
37b10 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
37b20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37b30 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
37b40 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ext, sAggInfo.so
37b50 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f  rtingIdx, addrTo
37b60 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  pOfLoop);.      
37b70 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
37b80 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
37b90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
37ba0 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
37bb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37bc0 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
37bd0 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49  (v, addrSortingI
37be0 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  dx);.      }..  
37bf0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68      /* Output th
37c00 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72  e final row of r
37c10 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20  esult.      */. 
37c20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
37c30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
37c40 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  ub, regOutputRow
37c50 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
37c60 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
37c70 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20  ent((v, "output 
37c80 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20  final row"));.. 
37c90 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65       /* Jump ove
37ca0 72 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  r the subroutine
37cb0 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  s.      */.     
37cc0 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
37cd0 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20  (v, addrEnd);.. 
37ce0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
37cf0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
37d00 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e  at outputs a sin
37d10 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
37d20 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
37d30 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75  et.  This subrou
37d40 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73  tine first looks
37d50 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67   at the iUseFlag
37d60 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20  .  If iUseFlag. 
37d70 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20       ** is less 
37d80 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
37d90 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f   zero, the subro
37da0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
37db0 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74  .  If.      ** t
37dc0 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61  he processing ca
37dd0 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72  lls for the quer
37de0 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73  y to abort, this
37df0 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
37e00 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20    ** increments 
37e10 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d  the iAbortFlag m
37e20 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62  emory location b
37e30 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
37e40 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
37e50 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20  r to signal the 
37e60 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e  caller to abort.
37e70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
37e80 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73  addrSetAbort = s
37e90 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
37ea0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
37eb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
37ec0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
37ed0 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   1, iAbortFlag);
37ee0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
37ef0 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72  nt((v, "set abor
37f00 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
37f10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37f20 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
37f30 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
37f40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
37f50 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
37f60 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
37f70 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
37f80 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
37f90 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
37fa0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
37fb0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
37fc0 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c  IfPos, iUseFlag,
37fd0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32   addrOutputRow+2
37fe0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
37ff0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
38000 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
38010 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20  "Groupby result 
38020 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20  generator entry 
38030 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20  point"));.      
38040 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
38050 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
38060 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
38070 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
38080 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
38090 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
380a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
380b0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
380c0 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70  Having, addrOutp
380d0 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f  utRow+1, SQLITE_
380e0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
380f0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
38100 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 2d 31  op(pParse, p, -1
38110 2c 20 26 73 53 6f 72 74 2c 0a 20 20 20 20 20 20  , &sSort,.      
38120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38130 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73  &sDistinct, pDes
38140 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
38150 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75 74           addrOut
38160 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53 65  putRow+1, addrSe
38170 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20 73  tAbort);.      s
38180 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
38190 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
381a0 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
381b0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
381c0 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62 79  (v, "end groupby
381d0 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74 6f   result generato
381e0 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  r"));..      /* 
381f0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
38200 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
38210 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70 2d  reset the group-
38220 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20  by accumulator. 
38230 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
38240 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
38250 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65 73  Label(v, addrRes
38260 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65 74  et);.      reset
38270 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
38280 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
38290 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
382a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
382b0 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c  teger, 0, iUseFl
382c0 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
382d0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69  omment((v, "indi
382e0 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  cate accumulator
382f0 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20   empty"));.     
38300 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
38310 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
38320 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20   regReset);.    
38330 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66   .    } /* endif
38340 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69   pGroupBy.  Begi
38350 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
38360 69 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55  ies without GROU
38370 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73  P BY: */.    els
38380 65 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e {.#ifndef SQLI
38390 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
383a0 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  NT.      Table *
383b0 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
383c0 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65  (pTab = isSimple
383d0 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e  Count(p, &sAggIn
383e0 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  fo))!=0 ){.     
383f0 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c     /* If isSimpl
38400 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e