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

Artifact 8a7f842a049a3407079e0b0748de916dcd91c00377394b2e8b1aefc5972a0b2f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 73 2f 25 64 2f 25 70 3a 20 22 2c 28 53 29  "%s/%d/%p: ",(S)
02c0: 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28 50 29 2d 3e  ->zSelName,(P)->
02d0: 61 64 64 72 45 78 70 6c 61 69 6e 2c 28 53 29 29  addrExplain,(S))
02e0: 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ,\.    sqlite3De
02f0: 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65 6c 73  bugPrintf X.#els
0300: 65 0a 23 20 64 65 66 69 6e 65 20 53 45 4c 45 43  e.# define SELEC
0310: 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c 58 29 0a  TTRACE(K,P,S,X).
0320: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
0330: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0340: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65  e following obje
0350: 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  ct is used to re
0360: 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  cord information
0370: 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f   about.** how to
0380: 20 70 72 6f 63 65 73 73 20 74 68 65 20 44 49 53   process the DIS
0390: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 2c 20 74  TINCT keyword, t
03a0: 6f 20 73 69 6d 70 6c 69 66 79 20 70 61 73 73 69  o simplify passi
03b0: 6e 67 20 74 68 61 74 20 69 6e 66 6f 72 6d 61 74  ng that informat
03c0: 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  ion.** into the 
03d0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
03e0: 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79  ) routine..*/.ty
03f0: 70 65 64 65 66 20 73 74 72 75 63 74 20 44 69 73  pedef struct Dis
0400: 74 69 6e 63 74 43 74 78 20 44 69 73 74 69 6e 63  tinctCtx Distinc
0410: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 44 69 73  tCtx;.struct Dis
0420: 74 69 6e 63 74 43 74 78 20 7b 0a 20 20 75 38 20  tinctCtx {.  u8 
0430: 69 73 54 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20  isTnct;      /* 
0440: 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
0450: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
0460: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20  present */.  u8 
0470: 65 54 6e 63 74 54 79 70 65 3b 20 20 20 2f 2a 20  eTnctType;   /* 
0480: 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
0490: 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72  _DISTINCT_* oper
04a0: 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74  ators */.  int t
04b0: 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70  abTnct;    /* Ep
04c0: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73  hemeral table us
04d0: 65 64 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20  ed for DISTINCT 
04e0: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20  processing */.  
04f0: 69 6e 74 20 61 64 64 72 54 6e 63 74 3b 20 20 20  int addrTnct;   
0500: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
0510: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f  _OpenEphemeral o
0520: 70 63 6f 64 65 20 66 6f 72 20 74 61 62 54 6e 63  pcode for tabTnc
0530: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
0540: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0550: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65  e following obje
0560: 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  ct is used to re
0570: 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  cord information
0580: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 4f 52   about.** the OR
0590: 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50  DER BY (or GROUP
05a0: 20 42 59 29 20 63 6c 61 75 73 65 20 6f 66 20 71   BY) clause of q
05b0: 75 65 72 79 20 69 73 20 62 65 69 6e 67 20 63 6f  uery is being co
05c0: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ded..**.** The a
05d0: 44 65 66 65 72 5b 5d 20 61 72 72 61 79 20 69 73  Defer[] array is
05e0: 20 75 73 65 64 20 62 79 20 74 68 65 20 73 6f 72   used by the sor
05f0: 74 65 72 2d 72 65 66 65 72 65 6e 63 65 73 20 6f  ter-references o
0600: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 46 6f 72  ptimization. For
0610: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  .** example, ass
0620: 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 6e  uming there is n
0630: 6f 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e  o index that can
0640: 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
0650: 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 66 6f   ORDER BY,.** fo
0660: 72 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  r the query:.**.
0670: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c  **     SELECT a,
0680: 20 62 69 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31   bigblob FROM t1
0690: 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49   ORDER BY a LIMI
06a0: 54 20 31 30 3b 0a 2a 2a 0a 2a 2a 20 69 74 20 6d  T 10;.**.** it m
06b0: 61 79 20 62 65 20 6d 6f 72 65 20 65 66 66 69 63  ay be more effic
06c0: 69 65 6e 74 20 74 6f 20 61 64 64 20 6a 75 73 74  ient to add just
06d0: 20 74 68 65 20 22 61 22 20 76 61 6c 75 65 73 20   the "a" values 
06e0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 20 61  to the sorter, a
06f0: 6e 64 0a 2a 2a 20 72 65 74 72 69 65 76 65 20 74  nd.** retrieve t
0700: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 62  he associated "b
0710: 69 67 62 6c 6f 62 22 20 76 61 6c 75 65 73 20 64  igblob" values d
0720: 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 61 62  irectly from tab
0730: 6c 65 20 74 31 20 61 73 20 74 68 65 0a 2a 2a 20  le t1 as the.** 
0740: 31 30 20 73 6d 61 6c 6c 65 73 74 20 22 61 22 20  10 smallest "a" 
0750: 76 61 6c 75 65 73 20 61 72 65 20 65 78 74 72 61  values are extra
0760: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 6f  cted from the so
0770: 72 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  rter..**.** When
0780: 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65   the sorter-refe
0790: 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69  rence optimizati
07a0: 6f 6e 20 69 73 20 75 73 65 64 2c 20 74 68 65 72  on is used, ther
07b0: 65 20 69 73 20 6f 6e 65 20 65 6e 74 72 79 20 69  e is one entry i
07c0: 6e 20 74 68 65 0a 2a 2a 20 61 44 65 66 65 72 5b  n the.** aDefer[
07d0: 5d 20 61 72 72 61 79 20 66 6f 72 20 65 61 63 68  ] array for each
07e0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
07f0: 74 68 61 74 20 6d 61 79 20 62 65 20 72 65 61 64  that may be read
0800: 20 61 73 20 76 61 6c 75 65 73 20 61 72 65 0a 2a   as values are.*
0810: 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  * extracted from
0820: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
0830: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0840: 6f 72 74 43 74 78 20 53 6f 72 74 43 74 78 3b 0a  ortCtx SortCtx;.
0850: 73 74 72 75 63 74 20 53 6f 72 74 43 74 78 20 7b  struct SortCtx {
0860: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
0870: 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
0880: 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f  ORDER BY (or GRO
0890: 55 50 20 42 59 20 63 6c 61 75 73 65 29 20 2a 2f  UP BY clause) */
08a0: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20  .  int nOBSat;  
08b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
08c0: 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74  er of ORDER BY t
08d0: 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 62  erms satisfied b
08e0: 79 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  y indices */.  i
08f0: 6e 74 20 69 45 43 75 72 73 6f 72 3b 20 20 20 20  nt iECursor;    
0900: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
0910: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73 6f  umber for the so
0920: 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  rter */.  int re
0930: 67 52 65 74 75 72 6e 3b 20 20 20 20 20 20 20 20  gReturn;        
0940: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
0950: 69 6e 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74  ing block-output
0960: 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
0970: 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b  */.  int labelBk
0980: 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 74  Out;       /* St
0990: 61 72 74 20 6c 61 62 65 6c 20 66 6f 72 20 74 68  art label for th
09a0: 65 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73  e block-output s
09b0: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
09c0: 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  nt addrSortIndex
09d0: 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  ;    /* Address 
09e0: 6f 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72  of the OP_Sorter
09f0: 4f 70 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45  Open or OP_OpenE
0a00: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 69 6e  phemeral */.  in
0a10: 74 20 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20  t labelDone;    
0a20: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
0a30: 20 77 68 65 6e 20 64 6f 6e 65 2c 20 65 78 3a 20   when done, ex: 
0a40: 4c 49 4d 49 54 20 72 65 61 63 68 65 64 20 2a 2f  LIMIT reached */
0a50: 0a 20 20 75 38 20 73 6f 72 74 46 6c 61 67 73 3b  .  u8 sortFlags;
0a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f           /* Zero
0a70: 20 6f 72 20 6d 6f 72 65 20 53 4f 52 54 46 4c 41   or more SORTFLA
0a80: 47 5f 2a 20 62 69 74 73 20 2a 2f 0a 20 20 75 38  G_* bits */.  u8
0a90: 20 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f   bOrderedInnerLo
0aa0: 6f 70 3b 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  op; /* ORDER BY 
0ab0: 63 6f 72 72 65 63 74 6c 79 20 73 6f 72 74 73 20  correctly sorts 
0ac0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a  the inner loop *
0ad0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
0ae0: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
0af0: 46 45 52 45 4e 43 45 53 0a 20 20 75 38 20 6e 44  FERENCES.  u8 nD
0b00: 65 66 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  efer;           
0b10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
0b20: 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61  lid entries in a
0b30: 44 65 66 65 72 5b 5d 20 2a 2f 0a 20 20 73 74 72  Defer[] */.  str
0b40: 75 63 74 20 44 65 66 65 72 72 65 64 43 73 72 20  uct DeferredCsr 
0b50: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
0b60: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  b;        /* Tab
0b70: 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f  le definition */
0b80: 0a 20 20 20 20 69 6e 74 20 69 43 73 72 3b 20 20  .    int iCsr;  
0b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
0ba0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61  or number for ta
0bb0: 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ble */.    int n
0bc0: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Key;           /
0bd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 4b 20 63  * Number of PK c
0be0: 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 61 62 6c 65  olumns for table
0bf0: 20 70 54 61 62 20 28 3e 3d 31 29 20 2a 2f 0a 20   pTab (>=1) */. 
0c00: 20 7d 20 61 44 65 66 65 72 5b 34 5d 3b 0a 23 65   } aDefer[4];.#e
0c10: 6e 64 69 66 0a 20 20 73 74 72 75 63 74 20 52 6f  ndif.  struct Ro
0c20: 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 44 65 66 65  wLoadInfo *pDefe
0c30: 72 72 65 64 52 6f 77 4c 6f 61 64 3b 20 20 2f 2a  rredRowLoad;  /*
0c40: 20 44 65 66 65 72 72 65 64 20 72 6f 77 20 6c 6f   Deferred row lo
0c50: 61 64 69 6e 67 20 69 6e 66 6f 20 6f 72 20 4e 55  ading info or NU
0c60: 4c 4c 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65  LL */.};.#define
0c70: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
0c80: 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a 20 55  ter  0x01   /* U
0c90: 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  se SorterOpen in
0ca0: 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45 70 68  stead of OpenEph
0cb0: 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  emeral */../*.**
0cc0: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
0cd0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
0ce0: 65 63 74 20 73 74 72 75 63 74 75 72 65 2e 20 20  ect structure.  
0cf0: 44 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  Deallocate the s
0d00: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65  tructure.** itse
0d10: 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46 72 65 65  lf only if bFree
0d20: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
0d30: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0d40: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0d50: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
0d60: 20 62 46 72 65 65 29 7b 0a 20 20 77 68 69 6c 65   bFree){.  while
0d70: 28 20 70 20 29 7b 0a 20 20 20 20 53 65 6c 65 63  ( p ){.    Selec
0d80: 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
0d90: 50 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74  Prior;.    sqlit
0da0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
0db0: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  (db, p->pEList);
0dc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
0dd0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
0de0: 3e 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69  >pSrc);.    sqli
0df0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
0e00: 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  , p->pWhere);.  
0e10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0e20: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
0e30: 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71  GroupBy);.    sq
0e40: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0e50: 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  db, p->pHaving);
0e60: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0e70: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0e80: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
0e90: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
0ea0: 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
0eb0: 29 3b 0a 20 20 20 20 69 66 28 20 4f 4b 5f 49 46  );.    if( OK_IF
0ec0: 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70 2d 3e  _ALWAYS_TRUE(p->
0ed0: 70 57 69 74 68 29 20 29 20 73 71 6c 69 74 65 33  pWith) ) sqlite3
0ee0: 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70  WithDelete(db, p
0ef0: 2d 3e 70 57 69 74 68 29 3b 0a 20 20 20 20 69 66  ->pWith);.    if
0f00: 28 20 62 46 72 65 65 20 29 20 73 71 6c 69 74 65  ( bFree ) sqlite
0f10: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
0f20: 3b 0a 20 20 20 20 70 20 3d 20 70 50 72 69 6f 72  ;.    p = pPrior
0f30: 3b 0a 20 20 20 20 62 46 72 65 65 20 3d 20 31 3b  ;.    bFree = 1;
0f40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
0f50: 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63  itialize a Selec
0f60: 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e  tDest structure.
0f70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0f80: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53  SelectDestInit(S
0f90: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
0fa0: 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74  , int eDest, int
0fb0: 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74   iParm){.  pDest
0fc0: 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44  ->eDest = (u8)eD
0fd0: 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53  est;.  pDest->iS
0fe0: 44 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20  DParm = iParm;. 
0ff0: 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74   pDest->zAffSdst
1000: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69   = 0;.  pDest->i
1010: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
1020: 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a  t->nSdst = 0;.}.
1030: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1040: 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74   a new Select st
1050: 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75  ructure and retu
1060: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1070: 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72  that.** structur
1080: 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71  e..*/.Select *sq
1090: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a  lite3SelectNew(.
10a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
10c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
10d0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
10e0: 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63  ,     /* which c
10f0: 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64  olumns to includ
1100: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
1110: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1120: 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  rc,        /* th
1130: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d  e FROM clause --
1140: 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f   which tables to
1150: 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20   scan */.  Expr 
1160: 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
1170: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
1180: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
1190: 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20  st *pGroupBy,   
11a0: 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  /* the GROUP BY 
11b0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
11c0: 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20   *pHaving,      
11d0: 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20    /* the HAVING 
11e0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
11f0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
1200: 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42    /* the ORDER B
1210: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 33  Y clause */.  u3
1220: 32 20 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20  2 selFlags,     
1230: 20 20 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61      /* Flag para
1240: 6d 65 74 65 72 73 2c 20 73 75 63 68 20 61 73 20  meters, such as 
1250: 53 46 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20  SF_Distinct */. 
1260: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 20 20   Expr *pLimit   
1270: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20         /* LIMIT 
1280: 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61  value.  NULL mea
1290: 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 29  ns not used */.)
12a0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
12b0: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
12c0: 69 6e 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  in;.  pNew = sql
12d0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
12e0: 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  N(pParse->db, si
12f0: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
1300: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1310: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1320: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1330: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
1340: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d   = &standin;.  }
1350: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
1360: 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d   ){.    pEList =
1370: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1380: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
1390: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13c0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 54 4b 5f 41  (pParse->db,TK_A
13d0: 53 54 45 52 49 53 4b 2c 30 29 29 3b 0a 20 20 7d  STERISK,0));.  }
13e0: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
13f0: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77  = pEList;.  pNew
1400: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
1410: 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61  ;.  pNew->selFla
1420: 67 73 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20  gs = selFlags;. 
1430: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
1440: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  0;.  pNew->iOffs
1450: 65 74 20 3d 20 30 3b 0a 23 69 66 20 53 45 4c 45  et = 0;.#if SELE
1460: 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
1470: 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65    pNew->zSelName
1480: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
1490: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
14a0: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
14b0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
14c0: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
14d0: 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d  ew->nSelectRow =
14e0: 20 30 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d   0;.  if( pSrc==
14f0: 30 20 29 20 70 53 72 63 20 3d 20 73 71 6c 69 74  0 ) pSrc = sqlit
1500: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
1510: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
1520: 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65  f(*pSrc));.  pNe
1530: 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  w->pSrc = pSrc;.
1540: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
1550: 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d   pWhere;.  pNew-
1560: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
1570: 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  upBy;.  pNew->pH
1580: 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b  aving = pHaving;
1590: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
15a0: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
15b0: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30  pNew->pPrior = 0
15c0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
15d0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  = 0;.  pNew->pLi
15e0: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
15f0: 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b  pNew->pWith = 0;
1600: 0a 20 20 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20  .  pNew->pWin = 
1610: 30 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  0;.  if( pParse-
1620: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1630: 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53  d ) {.    clearS
1640: 65 6c 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62  elect(pParse->db
1650: 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73  , pNew, pNew!=&s
1660: 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65  tandin);.    pNe
1670: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
1680: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
1690: 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50 61  ->pSrc!=0 || pPa
16a0: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20  rse->nErr>0 );. 
16b0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65   }.  assert( pNe
16c0: 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20  w!=&standin );. 
16d0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
16e0: 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
16f0: 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53  _ENABLED./*.** S
1700: 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  et the name of a
1710: 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 0a 2a   Select object.*
1720: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
1730: 6c 65 63 74 53 65 74 4e 61 6d 65 28 53 65 6c 65  lectSetName(Sele
1740: 63 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ct *p, const cha
1750: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
1760: 20 70 20 26 26 20 7a 4e 61 6d 65 20 29 7b 0a 20   p && zName ){. 
1770: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1780: 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 53  ntf(sizeof(p->zS
1790: 65 6c 4e 61 6d 65 29 2c 20 70 2d 3e 7a 53 65 6c  elName), p->zSel
17a0: 4e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 4e 61 6d  Name, "%s", zNam
17b0: 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  e);.  }.}.#endif
17c0: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  .../*.** Delete 
17d0: 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74  the given Select
17e0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
17f0: 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72  ll of its substr
1800: 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64  uctures..*/.void
1810: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1820: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
1830: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
1840: 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53  if( OK_IF_ALWAYS
1850: 5f 54 52 55 45 28 70 29 20 29 20 63 6c 65 61 72  _TRUE(p) ) clear
1860: 53 65 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29  Select(db, p, 1)
1870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1880: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1890: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45  he right-most SE
18a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
18b0: 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f  n a compound..*/
18c0: 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a  .static Select *
18d0: 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65  findRightmost(Se
18e0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c  lect *p){.  whil
18f0: 65 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20  e( p->pNext ) p 
1900: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65  = p->pNext;.  re
1910: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1920: 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64   Given 1 to 3 id
1930: 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 64  entifiers preced
1940: 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79  ing the JOIN key
1950: 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20  word, determine 
1960: 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a  the.** type of j
1970: 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  oin.  Return an 
1980: 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  integer constant
1990: 20 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20   that expresses 
19a0: 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20  that type.** in 
19b0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c  terms of the fol
19c0: 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65  lowing bit value
19d0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f  s:.**.**     JT_
19e0: 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f  INNER.**     JT_
19f0: 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f  CROSS.**     JT_
1a00: 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f  OUTER.**     JT_
1a10: 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a  NATURAL.**     J
1a20: 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54  T_LEFT.**     JT
1a30: 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66  _RIGHT.**.** A f
1a40: 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69  ull outer join i
1a50: 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f  s the combinatio
1a60: 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64  n of JT_LEFT and
1a70: 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a   JT_RIGHT..**.**
1a80: 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f   If an illegal o
1a90: 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f  r unsupported jo
1aa0: 69 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c  in type is seen,
1ab0: 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75   then still retu
1ac0: 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70  rn.** a join typ
1ad0: 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72  e, but put an er
1ae0: 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73  ror in the pPars
1af0: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
1b00: 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54  int sqlite3JoinT
1b10: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
1b20: 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f  e, Token *pA, To
1b30: 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a  ken *pB, Token *
1b40: 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74  pC){.  int joint
1b50: 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e  ype = 0;.  Token
1b60: 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f   *apAll[3];.  To
1b70: 6b 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20  ken *p;.        
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35       /*   012345
1ba0: 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31  6789 123456789 1
1bb0: 32 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a  23456789 123 */.
1bc0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1bd0: 68 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d  har zKeyText[] =
1be0: 20 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65   "naturaleftoute
1bf0: 72 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72  rightfullinnercr
1c00: 6f 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63  oss";.  static c
1c10: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
1c20: 20 20 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f    u8 i;        /
1c30: 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b  * Beginning of k
1c40: 65 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a  eyword text in z
1c50: 4b 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20  KeyText[] */.   
1c60: 20 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a   u8 nChar;    /*
1c70: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b   Length of the k
1c80: 65 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63  eyword in charac
1c90: 74 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63  ters */.    u8 c
1ca0: 6f 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e  ode;     /* Join
1cb0: 20 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20   type mask */.  
1cc0: 7d 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b  } aKeyword[] = {
1cd0: 0a 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20  .    /* natural 
1ce0: 2a 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e  */ { 0,  7, JT_N
1cf0: 41 54 55 52 41 4c 20 20 20 20 20 20 20 20 20 20  ATURAL          
1d00: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1d10: 6c 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20  left    */ { 6, 
1d20: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f   4, JT_LEFT|JT_O
1d30: 55 54 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c  UTER          },
1d40: 0a 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20  .    /* outer   
1d50: 2a 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f  */ { 10, 5, JT_O
1d60: 55 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20  UTER            
1d70: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1d80: 72 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c  right   */ { 14,
1d90: 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f   5, JT_RIGHT|JT_
1da0: 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c  OUTER         },
1db0: 0a 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20  .    /* full    
1dc0: 2a 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c  */ { 19, 4, JT_L
1dd0: 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f  EFT|JT_RIGHT|JT_
1de0: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20  OUTER },.    /* 
1df0: 69 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c  inner   */ { 23,
1e00: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20   5, JT_INNER    
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1e20: 0a 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20  .    /* cross   
1e30: 2a 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49  */ { 28, 5, JT_I
1e40: 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20  NNER|JT_CROSS   
1e50: 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20        },.  };.  
1e60: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c  int i, j;.  apAl
1e70: 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41  l[0] = pA;.  apA
1e80: 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70  ll[1] = pB;.  ap
1e90: 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66  All[2] = pC;.  f
1ea0: 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61  or(i=0; i<3 && a
1eb0: 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  pAll[i]; i++){. 
1ec0: 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b     p = apAll[i];
1ed0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
1ee0: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1ef0: 72 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  rd); j++){.     
1f00: 20 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77   if( p->n==aKeyw
1f10: 6f 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20  ord[j].nChar .  
1f20: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
1f30: 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
1f40: 2a 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78  *)p->z, &zKeyTex
1f50: 74 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d  t[aKeyword[j].i]
1f60: 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20  , p->n)==0 ){.  
1f70: 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c        jointype |
1f80: 3d 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f  = aKeyword[j].co
1f90: 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  de;.        brea
1fa0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1fb0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a  .    testcase( j
1fc0: 3d 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a  ==0 || j==1 || j
1fd0: 3d 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a  ==2 || j==3 || j
1fe0: 3d 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a  ==4 || j==5 || j
1ff0: 3d 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a  ==6 );.    if( j
2000: 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79  >=ArraySize(aKey
2010: 77 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a  word) ){.      j
2020: 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52  ointype |= JT_ER
2030: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
2040: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2050: 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  (.     (jointype
2060: 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   & (JT_INNER|JT_
2070: 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e  OUTER))==(JT_INN
2080: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a  ER|JT_OUTER) ||.
2090: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
20a0: 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20   JT_ERROR)!=0.  
20b0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
20c0: 72 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20  r *zSp = " ";.  
20d0: 20 20 61 73 73 65 72 74 28 20 70 42 21 3d 30 20    assert( pB!=0 
20e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30  );.    if( pC==0
20f0: 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20   ){ zSp++; }.   
2100: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2110: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
2120: 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64  n or unsupported
2130: 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20   join type: ".  
2140: 20 20 20 20 20 22 25 54 20 25 54 25 73 25 54 22       "%T %T%s%T"
2150: 2c 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70  , pA, pB, zSp, p
2160: 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65  C);.    jointype
2170: 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d   = JT_INNER;.  }
2180: 65 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79  else if( (jointy
2190: 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
21a0: 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0 .         && (
21b0: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c  jointype & (JT_L
21c0: 45 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d  EFT|JT_RIGHT))!=
21d0: 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73  JT_LEFT ){.    s
21e0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
21f0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52  Parse, .      "R
2200: 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55  IGHT and FULL OU
2210: 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f  TER JOINs are no
2220: 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70  t currently supp
2230: 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69  orted");.    joi
2240: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
2250: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a  ;.  }.  return j
2260: 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ointype;.}../*.*
2270: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
2280: 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69  ex of a column i
2290: 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75  n a table.  Retu
22a0: 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c  rn -1 if the col
22b0: 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  umn.** is not co
22c0: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74  ntained in the t
22d0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
22e0: 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  int columnIndex(
22f0: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e  Table *pTab, con
2300: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a  st char *zCol){.
2310: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
2320: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
2330: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2340: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
2350: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  Tab->aCol[i].zNa
2360: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72  me, zCol)==0 ) r
2370: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
2380: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
2390: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 69  ** Search the fi
23a0: 72 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20  rst N tables in 
23b0: 70 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20  pSrc, from left 
23c0: 74 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e  to right, lookin
23d0: 67 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65  g for a.** table
23e0: 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75   that has a colu
23f0: 6d 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20  mn named zCol.  
2400: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e  .**.** When foun
2410: 64 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e  d, set *piTab an
2420: 64 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20  d *piCol to the 
2430: 74 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20  table index and 
2440: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20  column index.** 
2450: 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  of the matching 
2460: 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72  column and retur
2470: 6e 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  n TRUE..**.** If
2480: 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75   not found, retu
2490: 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61  rn FALSE..*/.sta
24a0: 74 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64  tic int tableAnd
24b0: 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53  ColumnIndex(.  S
24c0: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
24d0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
24e0: 74 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68  tables to search
24f0: 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20   */.  int N,    
2500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2510: 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
2520: 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73  n pSrc->a[] to s
2530: 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74  earch */.  const
2540: 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20   char *zCol,    
2550: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
2560: 6f 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f  olumn we are loo
2570: 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  king for */.  in
2580: 74 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20  t *piTab,       
2590: 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65     /* Write inde
25a0: 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68  x of pSrc->a[] h
25b0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  ere */.  int *pi
25c0: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Col           /*
25d0: 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20   Write index of 
25e0: 70 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e  pSrc->a[*piTab].
25f0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72  pTab->aCol[] her
2600: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2620: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
2630: 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72  er tables in pSr
2640: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  c */.  int iCol;
2650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2660: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d  ndex of column m
2670: 61 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a  atching zCol */.
2680: 0a 20 20 61 73 73 65 72 74 28 20 28 70 69 54 61  .  assert( (piTa
2690: 62 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30  b==0)==(piCol==0
26a0: 29 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72  ) );  /* Both or
26b0: 20 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c   neither are NUL
26c0: 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  L */.  for(i=0; 
26d0: 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<N; i++){.    i
26e0: 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65  Col = columnInde
26f0: 78 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61  x(pSrc->a[i].pTa
2700: 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66  b, zCol);.    if
2710: 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
2720: 20 20 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a     if( piTab ){.
2730: 20 20 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d          *piTab =
2740: 20 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43   i;.        *piC
2750: 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  ol = iCol;.     
2760: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
2770: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
2780: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2790: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
27a0: 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 74  is used to add t
27b0: 65 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20  erms implied by 
27c0: 4a 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74  JOIN syntax to t
27d0: 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
27e0: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  se expression of
27f0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2800: 65 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72  ent. The new ter
2810: 6d 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41  m, which.** is A
2820: 4e 44 65 64 20 77 69 74 68 20 74 68 65 20 65 78  NDed with the ex
2830: 69 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61  isting WHERE cla
2840: 75 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66  use, is of the f
2850: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74  orm:.**.**    (t
2860: 61 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e  ab1.col1 = tab2.
2870: 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72  col2).**.** wher
2880: 65 20 74 61 62 31 20 69 73 20 74 68 65 20 69 53  e tab1 is the iS
2890: 72 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53  rc'th table in S
28a0: 72 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20  rcList pSrc and 
28b0: 74 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20  tab2 is the .** 
28c0: 28 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c  (iSrc+1)'th. Col
28d0: 75 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75  umn col1 is colu
28e0: 6d 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74  mn iColLeft of t
28f0: 61 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73  ab1, and col2 is
2900: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52  .** column iColR
2910: 69 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f  ight of tab2..*/
2920: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64  .static void add
2930: 57 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72  WhereTerm(.  Par
2940: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2960: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
2970: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
2980: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rc,             
2990: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
29a0: 74 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63  tables in FROM c
29b0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
29c0: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
29d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
29e0: 64 65 78 20 6f 66 20 66 69 72 73 74 20 74 61 62  dex of first tab
29f0: 6c 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53  le to join in pS
2a00: 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  rc */.  int iCol
2a10: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
2a20: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2a30: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69   of column in fi
2a40: 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  rst table */.  i
2a50: 6e 74 20 69 52 69 67 68 74 2c 20 20 20 20 20 20  nt iRight,      
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a70: 2a 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e  * Index of secon
2a80: 64 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20  d table in pSrc 
2a90: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67  */.  int iColRig
2aa0: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
2ab0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2ac0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e   column in secon
2ad0: 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  d table */.  int
2ae0: 20 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20   isOuterJoin,   
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b00: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2b10: 61 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f  an OUTER join */
2b20: 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72  .  Expr **ppWher
2b30: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2b40: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68     /* IN/OUT: Th
2b50: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2b60: 6f 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20  o add to */.){. 
2b70: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2b80: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
2b90: 72 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a  r *pE1;.  Expr *
2ba0: 70 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71  pE2;.  Expr *pEq
2bb0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65  ;..  assert( iLe
2bc0: 66 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61  ft<iRight );.  a
2bd0: 73 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72  ssert( pSrc->nSr
2be0: 63 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73  c>iRight );.  as
2bf0: 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c  sert( pSrc->a[iL
2c00: 65 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61  eft].pTab );.  a
2c10: 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69  ssert( pSrc->a[i
2c20: 52 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a  Right].pTab );..
2c30: 20 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43    pE1 = sqlite3C
2c40: 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28  reateColumnExpr(
2c50: 64 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  db, pSrc, iLeft,
2c60: 20 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45   iColLeft);.  pE
2c70: 32 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  2 = sqlite3Creat
2c80: 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20  eColumnExpr(db, 
2c90: 70 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43  pSrc, iRight, iC
2ca0: 6f 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71  olRight);..  pEq
2cb0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2cc0: 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70  pParse, TK_EQ, p
2cd0: 45 31 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20  E1, pE2);.  if( 
2ce0: 70 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f  pEq && isOuterJo
2cf0: 69 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65  in ){.    ExprSe
2d00: 74 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45  tProperty(pEq, E
2d10: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20  P_FromJoin);.   
2d20: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2d30: 73 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45  sProperty(pEq, E
2d40: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
2d50: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45  educed) );.    E
2d60: 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
2d70: 79 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75  y(pEq, EP_NoRedu
2d80: 63 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52  ce);.    pEq->iR
2d90: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
2da0: 28 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65  (i16)pE2->iTable
2db0: 3b 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65  ;.  }.  *ppWhere
2dc0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
2dd0: 64 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20  d(db, *ppWhere, 
2de0: 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pEq);.}../*.** S
2df0: 65 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  et the EP_FromJo
2e00: 69 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61  in property on a
2e10: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
2e20: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
2e30: 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65  ..** And set the
2e40: 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e   Expr.iRightJoin
2e50: 54 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20  Table to iTable 
2e60: 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69  for every term i
2e70: 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  n the.** express
2e80: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  ion..**.** The E
2e90: 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65  P_FromJoin prope
2ea0: 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74  rty is used on t
2eb0: 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65  erms of an expre
2ec0: 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a  ssion to tell.**
2ed0: 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20   the LEFT OUTER 
2ee0: 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20  JOIN processing 
2ef0: 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20  logic that this 
2f00: 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20  term is part of 
2f10: 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74  the.** join rest
2f20: 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65  riction specifie
2f30: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
2f40: 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20  SING clause and 
2f50: 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66  not a part.** of
2f60: 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61   the more genera
2f70: 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  l WHERE clause. 
2f80: 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65   These terms are
2f90: 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74   moved over to t
2fa0: 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
2fb0: 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70  se during join p
2fc0: 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65  rocessing but we
2fd0: 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
2fe0: 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f  r that they.** o
2ff0: 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65  riginated in the
3000: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
3010: 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  use..**.** The E
3020: 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
3030: 62 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48  ble tells the WH
3040: 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
3050: 73 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a  ssing that the.*
3060: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  * expression dep
3070: 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52  ends on table iR
3080: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76  ightJoinTable ev
3090: 65 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65  en if that table
30a0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69   is not.** expli
30b0: 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20  citly mentioned 
30c0: 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  in the expressio
30d0: 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61  n.  That informa
30e0: 74 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a  tion is needed.*
30f0: 2a 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65  * for cases like
3100: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
3110: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3120: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
3130: 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74   t1.a=t2.b AND t
3140: 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  1.x=5.**.** The 
3150: 77 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65  where clause nee
3160: 64 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20  ds to defer the 
3170: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20  handling of the 
3180: 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75  t1.x=5.** term u
3190: 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74  ntil after the t
31a0: 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f  2 loop of the jo
31b0: 69 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79  in.  In that way
31c0: 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72  , a.** NULL t2 r
31d0: 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  ow will be inser
31e0: 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e  ted whenever t1.
31f0: 78 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20  x!=5.  If we do 
3200: 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65  not.** defer the
3210: 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e   handling of t1.
3220: 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  x=5, it will be 
3230: 70 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69  processed immedi
3240: 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74  ately.** after t
3250: 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72  he t1 loop and r
3260: 6f 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35  ows with t1.x!=5
3270: 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65   will never appe
3280: 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74  ar in.** the out
3290: 70 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e  put, which is in
32a0: 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74  correct..*/.stat
32b0: 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45  ic void setJoinE
32c0: 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  xpr(Expr *p, int
32d0: 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c   iTable){.  whil
32e0: 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72  e( p ){.    Expr
32f0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45  SetProperty(p, E
3300: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20  P_FromJoin);.   
3310: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
3320: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
3330: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
3340: 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70  uced) );.    Exp
3350: 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
3360: 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  p, EP_NoReduce);
3370: 0a 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f  .    p->iRightJo
3380: 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69  inTable = (i16)i
3390: 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 70  Table;.    if( p
33a0: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
33b0: 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20  N && p->x.pList 
33c0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
33d0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
33e0: 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  <p->x.pList->nEx
33f0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
3400: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d    setJoinExpr(p-
3410: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
3420: 45 78 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20  Expr, iTable);. 
3430: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
3440: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e   setJoinExpr(p->
3450: 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a  pLeft, iTable);.
3460: 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68      p = p->pRigh
3470: 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 20 55 6e  t;.  } .}../* Un
3480: 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 73  do the work of s
3490: 65 74 4a 6f 69 6e 45 78 70 72 28 29 2e 20 20 49  etJoinExpr().  I
34a0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
34b0: 20 74 72 65 65 20 70 2c 20 63 6f 6e 76 65 72 74   tree p, convert
34c0: 20 65 76 65 72 79 0a 2a 2a 20 74 65 72 6d 20 74   every.** term t
34d0: 68 61 74 20 69 73 20 6d 61 72 6b 65 64 20 77 69  hat is marked wi
34e0: 74 68 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 61  th EP_FromJoin a
34f0: 6e 64 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  nd iRightJoinTab
3500: 6c 65 3d 3d 69 54 61 62 6c 65 20 69 6e 74 6f 0a  le==iTable into.
3510: 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74  ** an ordinary t
3520: 65 72 6d 20 74 68 61 74 20 6f 6d 69 74 73 20 74  erm that omits t
3530: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 6d  he EP_FromJoin m
3540: 61 72 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ark..**.** This 
3550: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 4c  happens when a L
3560: 45 46 54 20 4a 4f 49 4e 20 69 73 20 73 69 6d 70  EFT JOIN is simp
3570: 6c 69 66 69 65 64 20 69 6e 74 6f 20 61 6e 20 6f  lified into an o
3580: 72 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 0a 2a 2f  rdinary JOIN..*/
3590: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 73  .static void uns
35a0: 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20  etJoinExpr(Expr 
35b0: 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b  *p, int iTable){
35c0: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
35d0: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
35e0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
35f0: 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 28  mJoin).     && (
3600: 69 54 61 62 6c 65 3c 30 20 7c 7c 20 70 2d 3e 69  iTable<0 || p->i
3610: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d  RightJoinTable==
3620: 69 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20  iTable) ){.     
3630: 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72   ExprClearProper
3640: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
3650: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  n);.    }.    if
3660: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  ( p->op==TK_FUNC
3670: 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69  TION && p->x.pLi
3680: 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
3690: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
36a0: 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  ; i<p->x.pList->
36b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
36c0: 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78       unsetJoinEx
36d0: 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  pr(p->x.pList->a
36e0: 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
36f0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
3700: 7d 0a 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45  }.    unsetJoinE
3710: 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54  xpr(p->pLeft, iT
3720: 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70  able);.    p = p
3730: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d  ->pRight;.  } .}
3740: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3750: 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74  tine processes t
3760: 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74  he join informat
3770: 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54  ion for a SELECT
3780: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f   statement..** O
3790: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
37a0: 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65  ses are converte
37b0: 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72  d into extra ter
37c0: 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
37d0: 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52  clause..** NATUR
37e0: 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72  AL joins also cr
37f0: 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45  eate extra WHERE
3800: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a   clause terms..*
3810: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f  *.** The terms o
3820: 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  f a FROM clause 
3830: 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  are contained in
3840: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63   the Select.pSrc
3850: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54   structure..** T
3860: 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62  he left most tab
3870: 6c 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20  le is the first 
3880: 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e  entry in Select.
3890: 70 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74  pSrc.  The right
38a0: 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69  -most.** table i
38b0: 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  s the last entry
38c0: 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72  .  The join oper
38d0: 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20  ator is held in 
38e0: 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20  the entry to.** 
38f0: 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20  the left.  Thus 
3900: 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73  entry 0 contains
3910: 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   the join operat
3920: 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20  or for the join 
3930: 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69  between.** entri
3940: 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79  es 0 and 1.  Any
3950: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
3960: 75 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  uses associated 
3970: 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72  with the join ar
3980: 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68  e.** also attach
3990: 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65  ed to the left e
39a0: 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ntry..**.** This
39b0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
39c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
39d0: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
39e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
39f0: 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
3a00: 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  in(Parse *pParse
3a10: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
3a20: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a40: 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e  /* All tables in
3a50: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
3a60: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a80: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
3a90: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75  unters */.  stru
3aa0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
3ab0: 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c  *pLeft;     /* L
3ac0: 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  eft table being 
3ad0: 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  joined */.  stru
3ae0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
3af0: 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52  *pRight;    /* R
3b00: 69 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67  ight table being
3b10: 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53   joined */..  pS
3b20: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
3b30: 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61  pLeft = &pSrc->a
3b40: 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20  [0];.  pRight = 
3b50: 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72  &pLeft[1];.  for
3b60: 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
3b70: 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68  rc-1; i++, pRigh
3b80: 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20  t++, pLeft++){. 
3b90: 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74     Table *pRight
3ba0: 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54  Tab = pRight->pT
3bb0: 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75  ab;.    int isOu
3bc0: 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45  ter;..    if( NE
3bd0: 56 45 52 28 70 4c 65 66 74 2d 3e 70 54 61 62 3d  VER(pLeft->pTab=
3be0: 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d  =0 || pRightTab=
3bf0: 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =0) ) continue;.
3c00: 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70      isOuter = (p
3c10: 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79  Right->fg.jointy
3c20: 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
3c30: 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  0;..    /* When 
3c40: 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
3c50: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ord is present, 
3c60: 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65  add WHERE clause
3c70: 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a   terms for.    *
3c80: 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74  * every column t
3c90: 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c  hat the two tabl
3ca0: 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f  es have in commo
3cb0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
3cc0: 28 20 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69  ( pRight->fg.joi
3cd0: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
3ce0: 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  AL ){.      if( 
3cf0: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70  pRight->pOn || p
3d00: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
3d10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3d20: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3d30: 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e   "a NATURAL join
3d40: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a   may not have ".
3d50: 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f             "an O
3d60: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
3d70: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  e", 0);.        
3d80: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
3d90: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
3da0: 20 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43   j<pRightTab->nC
3db0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
3dc0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
3dd0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75   /* Name of colu
3de0: 6d 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74 20  mn in the right 
3df0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
3e00: 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20   int iLeft;     
3e10: 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74  /* Matching left
3e20: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
3e30: 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20    int iLeftCol; 
3e40: 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c   /* Matching col
3e50: 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20  umn in the left 
3e60: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20  table */..      
3e70: 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74    zName = pRight
3e80: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
3e90: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
3ea0: 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
3eb0: 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a  dex(pSrc, i+1, z
3ec0: 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69  Name, &iLeft, &i
3ed0: 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20  LeftCol) ){.    
3ee0: 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65        addWhereTe
3ef0: 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c  rm(pParse, pSrc,
3f00: 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c   iLeft, iLeftCol
3f10: 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20  , i+1, j,.      
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f30: 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57   isOuter, &p->pW
3f40: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  here);.        }
3f50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
3f60: 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20      /* Disallow 
3f70: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
3f80: 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65  G clauses in the
3f90: 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a   same join.    *
3fa0: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3fb0: 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d  ->pOn && pRight-
3fc0: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
3fd0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3fe0: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
3ff0: 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e   have both ON an
4000: 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20  d USING ".      
4010: 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68    "clauses in th
4020: 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20  e same join");. 
4030: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
4040: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
4050: 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74   the ON clause t
4060: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
4070: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63   WHERE clause, c
4080: 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20  onnected by.    
4090: 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ** an AND operat
40a0: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
40b0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29  f( pRight->pOn )
40c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75  {.      if( isOu
40d0: 74 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70  ter ) setJoinExp
40e0: 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70  r(pRight->pOn, p
40f0: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b  Right->iCursor);
4100: 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65  .      p->pWhere
4110: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
4120: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  d(pParse->db, p-
4130: 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d  >pWhere, pRight-
4140: 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69  >pOn);.      pRi
4150: 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20  ght->pOn = 0;.  
4160: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
4170: 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  te extra terms o
4180: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
4190: 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  se for each colu
41a0: 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20  mn named.    ** 
41b0: 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  in the USING cla
41c0: 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49  use.  Example: I
41d0: 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  f the two tables
41e0: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72   to be joined ar
41f0: 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20  e .    ** A and 
4200: 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20  B and the USING 
4210: 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20  clause names X, 
4220: 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61  Y, and Z, then a
4230: 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74  dd this.    ** t
4240: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
4250: 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41  se:    A.X=B.X A
4260: 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41  ND A.Y=B.Y AND A
4270: 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65  .Z=B.Z.    ** Re
4280: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66  port an error if
4290: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74   any column ment
42a0: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49  ioned in the USI
42b0: 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20  NG clause is.   
42c0: 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   ** not containe
42d0: 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  d in both tables
42e0: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20   to be joined.. 
42f0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
4300: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
4310: 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c        IdList *pL
4320: 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55  ist = pRight->pU
4330: 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  sing;.      for(
4340: 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49  j=0; j<pList->nI
4350: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
4360: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
4370: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
4380: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49   term in the USI
4390: 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  NG clause */.   
43a0: 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20       int iLeft; 
43b0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f        /* Table o
43c0: 6e 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20  n the left with 
43d0: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
43e0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
43f0: 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20  int iLeftCol;   
4400: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
4410: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f  r of matching co
4420: 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74  lumn on the left
4430: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
4440: 69 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20  iRightCol;   /* 
4450: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
4460: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
4470: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
4480: 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ..        zName 
4490: 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e  = pList->a[j].zN
44a0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69  ame;.        iRi
44b0: 67 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49  ghtCol = columnI
44c0: 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20  ndex(pRightTab, 
44d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
44e0: 69 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a  if( iRightCol<0.
44f0: 20 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62           || !tab
4500: 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
4510: 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d  (pSrc, i+1, zNam
4520: 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66  e, &iLeft, &iLef
4530: 74 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b  tCol).        ){
4540: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4550: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4560: 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20  e, "cannot join 
4570: 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20  using column %s 
4580: 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20  - column ".     
4590: 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73         "not pres
45a0: 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c  ent in both tabl
45b0: 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  es", zName);.   
45c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
45d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
45e0: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
45f0: 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c  pParse, pSrc, iL
4600: 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69  eft, iLeftCol, i
4610: 2b 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20  +1, iRightCol,. 
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d      isOuter, &p-
4640: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
4650: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
4660: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4670: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
4680: 74 68 69 73 20 6f 62 6a 65 63 74 20 68 6f 6c 64  this object hold
4690: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28 62  s information (b
46a0: 65 79 6f 6e 64 20 70 50 61 72 73 65 20 61 6e 64  eyond pParse and
46b0: 20 70 53 65 6c 65 63 74 29 0a 2a 2a 20 6e 65 65   pSelect).** nee
46c0: 64 65 64 20 74 6f 20 6c 6f 61 64 20 74 68 65 20  ded to load the 
46d0: 6e 65 78 74 20 72 65 73 75 6c 74 20 72 6f 77 20  next result row 
46e0: 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 61 64  that is to be ad
46f0: 64 65 64 20 74 6f 20 74 68 65 20 73 6f 72 74 65  ded to the sorte
4700: 72 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  r..*/.typedef st
4710: 72 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e 66 6f  ruct RowLoadInfo
4720: 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 0a 73 74   RowLoadInfo;.st
4730: 72 75 63 74 20 52 6f 77 4c 6f 61 64 49 6e 66 6f  ruct RowLoadInfo
4740: 20 7b 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75   {.  int regResu
4750: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lt;             
4760: 20 20 2f 2a 20 53 74 6f 72 65 20 72 65 73 75 6c    /* Store resul
4770: 74 73 20 69 6e 20 61 72 72 61 79 20 6f 66 20 72  ts in array of r
4780: 65 67 69 73 74 65 72 73 20 68 65 72 65 20 2a 2f  egisters here */
4790: 0a 20 20 75 38 20 65 63 65 6c 46 6c 61 67 73 3b  .  u8 ecelFlags;
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47b0: 2f 2a 20 46 6c 61 67 20 61 72 67 75 6d 65 6e 74  /* Flag argument
47c0: 20 74 6f 20 45 78 70 72 43 6f 64 65 45 78 70 72   to ExprCodeExpr
47d0: 4c 69 73 74 28 29 20 2a 2f 0a 23 69 66 64 65 66  List() */.#ifdef
47e0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
47f0: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
4800: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78  .  ExprList *pEx
4810: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
4820: 2f 2a 20 45 78 74 72 61 20 63 6f 6c 75 6d 6e 73  /* Extra columns
4830: 20 6e 65 65 64 65 64 20 62 79 20 73 6f 72 74 65   needed by sorte
4840: 72 20 72 65 66 73 20 2a 2f 0a 20 20 69 6e 74 20  r refs */.  int 
4850: 72 65 67 45 78 74 72 61 52 65 73 75 6c 74 3b 20  regExtraResult; 
4860: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
4870: 65 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 65 78  e to load the ex
4880: 74 72 61 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23  tra columns */.#
4890: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
48a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
48b0: 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6c 6f  s the work of lo
48c0: 61 64 69 6e 67 20 71 75 65 72 79 20 64 61 74 61  ading query data
48d0: 20 69 6e 74 6f 20 61 6e 20 61 72 72 61 79 20 6f   into an array o
48e0: 66 0a 2a 2a 20 72 65 67 69 73 74 65 72 73 20 73  f.** registers s
48f0: 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  o that it can be
4900: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 6f   added to the so
4910: 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rter..*/.static 
4920: 76 6f 69 64 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f  void innerLoopLo
4930: 61 64 52 6f 77 28 0a 20 20 50 61 72 73 65 20 2a  adRow(.  Parse *
4940: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
4950: 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
4960: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
4970: 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
4980: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 20  *pSelect,       
4990: 20 20 20 20 2f 2a 20 54 68 65 20 71 75 65 72 79      /* The query
49a0: 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
49b0: 20 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 2a 70    RowLoadInfo *p
49c0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
49d0: 49 6e 66 6f 20 6e 65 65 64 65 64 20 74 6f 20 63  Info needed to c
49e0: 6f 6d 70 6c 65 74 65 20 74 68 65 20 72 6f 77 20  omplete the row 
49f0: 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  load */.){.  sql
4a00: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
4a10: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
4a20: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 70 49  lect->pEList, pI
4a30: 6e 66 6f 2d 3e 72 65 67 52 65 73 75 6c 74 2c 0a  nfo->regResult,.
4a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a50: 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 49 6e            0, pIn
4a60: 66 6f 2d 3e 65 63 65 6c 46 6c 61 67 73 29 3b 0a  fo->ecelFlags);.
4a70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
4a80: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
4a90: 52 45 4e 43 45 53 0a 20 20 69 66 28 20 70 49 6e  RENCES.  if( pIn
4aa0: 66 6f 2d 3e 70 45 78 74 72 61 20 29 7b 0a 20 20  fo->pExtra ){.  
4ab0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
4ac0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
4ad0: 2c 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72 61 2c  , pInfo->pExtra,
4ae0: 20 70 49 6e 66 6f 2d 3e 72 65 67 45 78 74 72 61   pInfo->regExtra
4af0: 52 65 73 75 6c 74 2c 20 30 2c 20 30 29 3b 0a 20  Result, 0, 0);. 
4b00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
4b10: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
4b20: 3e 64 62 2c 20 70 49 6e 66 6f 2d 3e 70 45 78 74  >db, pInfo->pExt
4b30: 72 61 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ra);.  }.#endif.
4b40: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 74 68  }../*.** Code th
4b50: 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
4b60: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
4b70: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 65   generates the e
4b80: 6e 74 72 79 20 74 6f 20 62 65 0a 2a 2a 20 61 64  ntry to be.** ad
4b90: 64 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6f 72  ded into the sor
4ba0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ter..**.** Retur
4bb0: 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  n the register i
4bc0: 6e 20 77 68 69 63 68 20 74 68 65 20 72 65 73 75  n which the resu
4bd0: 6c 74 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a 2f  lt is stored..*/
4be0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 61 6b 65  .static int make
4bf0: 53 6f 72 74 65 72 52 65 63 6f 72 64 28 0a 20 20  SorterRecord(.  
4c00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
4c10: 20 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c   SortCtx *pSort,
4c20: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
4c30: 63 74 2c 0a 20 20 69 6e 74 20 72 65 67 42 61 73  ct,.  int regBas
4c40: 65 2c 0a 20 20 69 6e 74 20 6e 42 61 73 65 0a 29  e,.  int nBase.)
4c50: 7b 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 20 3d  {.  int nOBSat =
4c60: 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a   pSort->nOBSat;.
4c70: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
4c80: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
4c90: 20 72 65 67 4f 75 74 20 3d 20 2b 2b 70 50 61 72   regOut = ++pPar
4ca0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 69 66 28 20  se->nMem;.  if( 
4cb0: 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65 64  pSort->pDeferred
4cc0: 52 6f 77 4c 6f 61 64 20 29 7b 0a 20 20 20 20 69  RowLoad ){.    i
4cd0: 6e 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28  nnerLoopLoadRow(
4ce0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
4cf0: 20 70 53 6f 72 74 2d 3e 70 44 65 66 65 72 72 65   pSort->pDeferre
4d00: 64 52 6f 77 4c 6f 61 64 29 3b 0a 20 20 7d 0a 20  dRowLoad);.  }. 
4d10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4d20: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
4d30: 6f 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42  ord, regBase+nOB
4d40: 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61  Sat, nBase-nOBSa
4d50: 74 2c 20 72 65 67 4f 75 74 29 3b 0a 20 20 72 65  t, regOut);.  re
4d60: 74 75 72 6e 20 72 65 67 4f 75 74 3b 0a 7d 0a 0a  turn regOut;.}..
4d70: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
4d80: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ode that will pu
4d90: 73 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e  sh the record in
4da0: 20 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61   registers regDa
4db0: 74 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65  ta.** through re
4dc0: 67 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e  gData+nData-1 on
4dd0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a  to the sorter..*
4de0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75  /.static void pu
4df0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
4e00: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4e10: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
4e20: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f   context */.  So
4e30: 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20  rtCtx *pSort,   
4e40: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
4e50: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52  ion about the OR
4e60: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
4e70: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
4e80: 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ct,       /* The
4e90: 20 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74   whole SELECT st
4ea0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
4eb0: 20 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20   regData,       
4ec0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67      /* First reg
4ed0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61  ister holding da
4ee0: 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  ta to be sorted 
4ef0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67  */.  int regOrig
4f00: 44 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46  Data,       /* F
4f10: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f  irst register ho
4f20: 6c 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72  lding data befor
4f30: 65 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69  e packing */.  i
4f40: 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20  nt nData,       
4f50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4f60: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  of elements in t
4f70: 68 65 20 72 65 67 44 61 74 61 20 64 61 74 61 20  he regData data 
4f80: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  array */.  int n
4f90: 50 72 65 66 69 78 52 65 67 20 20 20 20 20 20 20  PrefixReg       
4fa0: 20 20 2f 2a 20 4e 6f 2e 20 6f 66 20 72 65 67 20    /* No. of reg 
4fb0: 70 72 69 6f 72 20 74 6f 20 72 65 67 44 61 74 61  prior to regData
4fc0: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
4fd0: 73 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  se */.){.  Vdbe 
4fe0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
4ff0: 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
5000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
5010: 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tmt under constr
5020: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
5030: 62 53 65 71 20 3d 20 28 28 70 53 6f 72 74 2d 3e  bSeq = ((pSort->
5040: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
5050: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 29 3d  FLAG_UseSorter)=
5060: 3d 30 29 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72  =0);.  int nExpr
5070: 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72   = pSort->pOrder
5080: 42 79 2d 3e 6e 45 78 70 72 3b 20 20 20 20 20 20  By->nExpr;      
5090: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20 6f          /* No. o
50a0: 66 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  f ORDER BY terms
50b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 61 73 65 20   */.  int nBase 
50c0: 3d 20 6e 45 78 70 72 20 2b 20 62 53 65 71 20 2b  = nExpr + bSeq +
50d0: 20 6e 44 61 74 61 3b 20 20 20 20 20 20 20 20 20   nData;         
50e0: 20 20 20 20 20 20 20 2f 2a 20 46 69 65 6c 64 73         /* Fields
50f0: 20 69 6e 20 73 6f 72 74 65 72 20 72 65 63 6f 72   in sorter recor
5100: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  d */.  int regBa
5110: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5130: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 73 20          /* Regs 
5140: 66 6f 72 20 73 6f 72 74 65 72 20 72 65 63 6f 72  for sorter recor
5150: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  d */.  int regRe
5160: 63 6f 72 64 20 3d 20 30 3b 20 20 20 20 20 20 20  cord = 0;       
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5180: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 65 6d          /* Assem
5190: 62 6c 65 64 20 73 6f 72 74 65 72 20 72 65 63 6f  bled sorter reco
51a0: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 42 53  rd */.  int nOBS
51b0: 61 74 20 3d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53  at = pSort->nOBS
51c0: 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
51d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 52 44 45           /* ORDE
51e0: 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 73 6b  R BY terms to sk
51f0: 69 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  ip */.  int op; 
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
5220: 63 6f 64 65 20 74 6f 20 61 64 64 20 73 6f 72 74  code to add sort
5230: 65 72 20 72 65 63 6f 72 64 20 74 6f 20 73 6f 72  er record to sor
5240: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ter */.  int iLi
5250: 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
5260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
5270: 49 4d 49 54 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  IMIT counter */.
5280: 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 30 3b    int iSkip = 0;
5290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52a0: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74       /* End of t
52b0: 68 65 20 73 6f 72 74 65 72 20 69 6e 73 65 72 74  he sorter insert
52c0: 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 61 73 73 65   loop */..  asse
52d0: 72 74 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62  rt( bSeq==0 || b
52e0: 53 65 71 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  Seq==1 );..  /* 
52f0: 54 68 72 65 65 20 63 61 73 65 73 3a 0a 20 20 2a  Three cases:.  *
5300: 2a 20 20 20 28 31 29 20 54 68 65 20 64 61 74 61  *   (1) The data
5310: 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 68 61   to be sorted ha
5320: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
5330: 61 63 6b 65 64 20 69 6e 74 6f 20 61 20 52 65 63  acked into a Rec
5340: 6f 72 64 0a 20 20 2a 2a 20 20 20 20 20 20 20 62  ord.  **       b
5350: 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4d 61 6b  y a prior OP_Mak
5360: 65 52 65 63 6f 72 64 2e 20 20 49 6e 20 74 68 69  eRecord.  In thi
5370: 73 20 63 61 73 65 20 6e 44 61 74 61 3d 3d 31 20  s case nData==1 
5380: 61 6e 64 20 72 65 67 44 61 74 61 0a 20 20 2a 2a  and regData.  **
5390: 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63         will be c
53a0: 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 72 65 6c 61  ompletely unrela
53b0: 74 65 64 20 74 6f 20 72 65 67 4f 72 69 67 44 61  ted to regOrigDa
53c0: 74 61 2e 0a 20 20 2a 2a 20 20 20 28 32 29 20 41  ta..  **   (2) A
53d0: 6c 6c 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e  ll output column
53e0: 73 20 61 72 65 20 69 6e 63 6c 75 64 65 64 20 69  s are included i
53f0: 6e 20 74 68 65 20 73 6f 72 74 20 72 65 63 6f 72  n the sort recor
5400: 64 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a  d.  In that.  **
5410: 20 20 20 20 20 20 20 63 61 73 65 20 72 65 67 44         case regD
5420: 61 74 61 3d 3d 72 65 67 4f 72 69 67 44 61 74 61  ata==regOrigData
5430: 2e 0a 20 20 2a 2a 20 20 20 28 33 29 20 53 6f 6d  ..  **   (3) Som
5440: 65 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73  e output columns
5450: 20 61 72 65 20 6f 6d 69 74 74 65 64 20 66 72 6f   are omitted fro
5460: 6d 20 74 68 65 20 73 6f 72 74 20 72 65 63 6f 72  m the sort recor
5470: 64 20 64 75 65 20 74 6f 0a 20 20 2a 2a 20 20 20  d due to.  **   
5480: 20 20 20 20 74 68 65 20 53 51 4c 49 54 45 5f 45      the SQLITE_E
5490: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
54a0: 45 52 45 4e 43 45 20 6f 70 74 69 6d 69 7a 61 74  ERENCE optimizat
54b0: 69 6f 6e 2c 20 6f 72 20 64 75 65 20 74 6f 20 74  ion, or due to t
54c0: 68 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 53 51  he.  **       SQ
54d0: 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45  LITE_ECEL_OMITRE
54e0: 46 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  F optimization, 
54f0: 6f 72 20 64 75 65 20 74 6f 20 74 68 65 20 0a 20  or due to the . 
5500: 20 2a 2a 20 20 20 20 20 20 20 53 6f 72 74 43 74   **       SortCt
5510: 78 2e 70 44 65 66 65 72 72 65 64 52 6f 77 4c 6f  x.pDeferredRowLo
5520: 61 64 20 6f 70 74 69 6d 69 61 74 69 6f 6e 2e 20  ad optimiation. 
5530: 20 49 6e 20 61 6e 79 20 6f 66 20 74 68 65 73 65   In any of these
5540: 20 63 61 73 65 73 0a 20 20 2a 2a 20 20 20 20 20   cases.  **     
5550: 20 20 72 65 67 4f 72 69 67 44 61 74 61 20 69 73    regOrigData is
5560: 20 30 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68   0 to prevent th
5570: 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  is routine from 
5580: 74 72 79 69 6e 67 20 74 6f 20 63 6f 70 79 0a 20  trying to copy. 
5590: 20 2a 2a 20 20 20 20 20 20 20 76 61 6c 75 65 73   **       values
55a0: 20 74 68 61 74 20 6d 69 67 68 74 20 6e 6f 74 20   that might not 
55b0: 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2f 0a  yet exist..  */.
55c0: 20 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d    assert( nData=
55d0: 3d 31 20 7c 7c 20 72 65 67 44 61 74 61 3d 3d 72  =1 || regData==r
55e0: 65 67 4f 72 69 67 44 61 74 61 20 7c 7c 20 72 65  egOrigData || re
55f0: 67 4f 72 69 67 44 61 74 61 3d 3d 30 20 29 3b 0a  gOrigData==0 );.
5600: 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78 52 65  .  if( nPrefixRe
5610: 67 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  g ){.    assert(
5620: 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 6e 45 78   nPrefixReg==nEx
5630: 70 72 2b 62 53 65 71 20 29 3b 0a 20 20 20 20 72  pr+bSeq );.    r
5640: 65 67 42 61 73 65 20 3d 20 72 65 67 44 61 74 61  egBase = regData
5650: 20 2d 20 6e 50 72 65 66 69 78 52 65 67 3b 0a 20   - nPrefixReg;. 
5660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 42   }else{.    regB
5670: 61 73 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ase = pParse->nM
5680: 65 6d 20 2b 20 31 3b 0a 20 20 20 20 70 50 61 72  em + 1;.    pPar
5690: 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 42 61 73  se->nMem += nBas
56a0: 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
56b0: 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65   pSelect->iOffse
56c0: 74 3d 3d 30 20 7c 7c 20 70 53 65 6c 65 63 74 2d  t==0 || pSelect-
56d0: 3e 69 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20  >iLimit!=0 );.  
56e0: 69 4c 69 6d 69 74 20 3d 20 70 53 65 6c 65 63 74  iLimit = pSelect
56f0: 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 53 65 6c  ->iOffset ? pSel
5700: 65 63 74 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a  ect->iOffset+1 :
5710: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
5720: 3b 0a 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  ;.  pSort->label
5730: 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 56 64  Done = sqlite3Vd
5740: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
5750: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
5760: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
5770: 2c 20 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42  , pSort->pOrderB
5780: 79 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 4f  y, regBase, regO
5790: 72 69 67 44 61 74 61 2c 0a 20 20 20 20 20 20 20  rigData,.       
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57b0: 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44     SQLITE_ECEL_D
57c0: 55 50 20 7c 20 28 72 65 67 4f 72 69 67 44 61 74  UP | (regOrigDat
57d0: 61 3f 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52  a? SQLITE_ECEL_R
57e0: 45 46 20 3a 20 30 29 29 3b 0a 20 20 69 66 28 20  EF : 0));.  if( 
57f0: 62 53 65 71 20 29 7b 0a 20 20 20 20 73 71 6c 69  bSeq ){.    sqli
5800: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5810: 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 53   OP_Sequence, pS
5820: 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  ort->iECursor, r
5830: 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a 20  egBase+nExpr);. 
5840: 20 7d 0a 20 20 69 66 28 20 6e 50 72 65 66 69 78   }.  if( nPrefix
5850: 52 65 67 3d 3d 30 20 26 26 20 6e 44 61 74 61 3e  Reg==0 && nData>
5860: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
5870: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
5880: 72 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65  rse, regData, re
5890: 67 42 61 73 65 2b 6e 45 78 70 72 2b 62 53 65 71  gBase+nExpr+bSeq
58a0: 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20  , nData);.  }.  
58b0: 69 66 28 20 6e 4f 42 53 61 74 3e 30 20 29 7b 0a  if( nOBSat>0 ){.
58c0: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 4b      int regPrevK
58d0: 65 79 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72  ey;   /* The fir
58e0: 73 74 20 6e 4f 42 53 61 74 20 63 6f 6c 75 6d 6e  st nOBSat column
58f0: 73 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  s of the previou
5900: 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 69 6e 74  s row */.    int
5910: 20 61 64 64 72 46 69 72 73 74 3b 20 20 20 20 2f   addrFirst;    /
5920: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
5930: 20 4f 50 5f 49 66 4e 6f 74 20 6f 70 63 6f 64 65   OP_IfNot opcode
5940: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
5950: 4a 6d 70 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  Jmp;      /* Add
5960: 72 65 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 4a  ress of the OP_J
5970: 75 6d 70 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  ump opcode */.  
5980: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
5990: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 68      /* Opcode th
59a0: 61 74 20 6f 70 65 6e 73 20 74 68 65 20 73 6f 72  at opens the sor
59b0: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
59c0: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Key;         /* 
59d0: 4e 75 6d 62 65 72 20 6f 66 20 73 6f 72 74 69 6e  Number of sortin
59e0: 67 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 2c 20 69  g key columns, i
59f0: 6e 63 6c 75 64 69 6e 67 20 4f 50 5f 53 65 71 75  ncluding OP_Sequ
5a00: 65 6e 63 65 20 2a 2f 0a 20 20 20 20 4b 65 79 49  ence */.    KeyI
5a10: 6e 66 6f 20 2a 70 4b 49 3b 20 20 20 20 20 2f 2a  nfo *pKI;     /*
5a20: 20 4f 72 69 67 69 6e 61 6c 20 4b 65 79 49 6e 66   Original KeyInf
5a30: 6f 20 6f 6e 20 74 68 65 20 73 6f 72 74 65 72 20  o on the sorter 
5a40: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 65  table */..    re
5a50: 67 52 65 63 6f 72 64 20 3d 20 6d 61 6b 65 53 6f  gRecord = makeSo
5a60: 72 74 65 72 52 65 63 6f 72 64 28 70 50 61 72 73  rterRecord(pPars
5a70: 65 2c 20 70 53 6f 72 74 2c 20 70 53 65 6c 65 63  e, pSort, pSelec
5a80: 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 42 61 73  t, regBase, nBas
5a90: 65 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 4b  e);.    regPrevK
5aa0: 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ey = pParse->nMe
5ab0: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
5ac0: 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e  >nMem += pSort->
5ad0: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79  nOBSat;.    nKey
5ae0: 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74   = nExpr - pSort
5af0: 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b  ->nOBSat + bSeq;
5b00: 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b  .    if( bSeq ){
5b10: 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74  .      addrFirst
5b20: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
5b30: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
5b40: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
5b50: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ; .    }else{.  
5b60: 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20      addrFirst = 
5b70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5b80: 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  1(v, OP_Sequence
5b90: 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43  Test, pSort->iEC
5ba0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
5bb0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
5bc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5bd0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
5be0: 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b  ompare, regPrevK
5bf0: 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f  ey, regBase, pSo
5c00: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
5c10: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
5c20: 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74  beGetOp(v, pSort
5c30: 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  ->addrSortIndex)
5c40: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
5c50: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
5c60: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ed ) return;.   
5c70: 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20   pOp->p2 = nKey 
5c80: 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49  + nData;.    pKI
5c90: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
5ca0: 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  nfo;.    memset(
5cb0: 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  pKI->aSortOrder,
5cc0: 20 30 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65   0, pKI->nKeyFie
5cd0: 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50  ld); /* Makes OP
5ce0: 5f 4a 75 6d 70 20 74 65 73 74 61 62 6c 65 20 2a  _Jump testable *
5cf0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
5d00: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
5d10: 20 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f   (char*)pKI, P4_
5d20: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65  KEYINFO);.    te
5d30: 73 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41 6c  stcase( pKI->nAl
5d40: 6c 46 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e 4b  lField > pKI->nK
5d50: 65 79 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20 20  eyField+2 );.   
5d60: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
5d70: 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  o = sqlite3KeyIn
5d80: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
5d90: 50 61 72 73 65 2c 70 53 6f 72 74 2d 3e 70 4f 72  Parse,pSort->pOr
5da0: 64 65 72 42 79 2c 6e 4f 42 53 61 74 2c 0a 20 20  derBy,nOBSat,.  
5db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dd0: 20 20 20 20 20 20 20 20 20 70 4b 49 2d 3e 6e 41           pKI->nA
5de0: 6c 6c 46 69 65 6c 64 2d 70 4b 49 2d 3e 6e 4b 65  llField-pKI->nKe
5df0: 79 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20 20 61  yField-1);.    a
5e00: 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33  ddrJmp = sqlite3
5e10: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
5e20: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
5e30: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
5e40: 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b 31 2c  Jump, addrJmp+1,
5e50: 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29 3b 20   0, addrJmp+1); 
5e60: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5e70: 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61 62 65  .    pSort->labe
5e80: 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  lBkOut = sqlite3
5e90: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
5ea0: 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72 65 67  ;.    pSort->reg
5eb0: 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
5ec0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c  e->nMem;.    sql
5ed0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5ee0: 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53 6f 72  , OP_Gosub, pSor
5ef0: 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 53  t->regReturn, pS
5f00: 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 29  ort->labelBkOut)
5f10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
5f20: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
5f30: 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f 72 74  setSorter, pSort
5f40: 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20 20 20  ->iECursor);.   
5f50: 20 69 66 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20   if( iLimit ){. 
5f60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5f70: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e  AddOp2(v, OP_IfN
5f80: 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 70 53 6f 72  ot, iLimit, pSor
5f90: 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b 0a 20  t->labelDone);. 
5fa0: 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
5fb0: 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(v);.    }.    
5fc0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5fd0: 65 72 65 28 76 2c 20 61 64 64 72 46 69 72 73 74  ere(v, addrFirst
5fe0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
5ff0: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
6000: 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65 67 50  e, regBase, regP
6010: 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d 3e 6e  revKey, pSort->n
6020: 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  OBSat);.    sqli
6030: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
6040: 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20 20 7d  v, addrJmp);.  }
6050: 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29 7b  .  if( iLimit ){
6060: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
6070: 70 6f 69 6e 74 20 74 68 65 20 76 61 6c 75 65 73  point the values
6080: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 6f 72   for the new sor
6090: 74 65 72 20 65 6e 74 72 79 20 61 72 65 20 73 74  ter entry are st
60a0: 6f 72 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 61  ored.    ** in a
60b0: 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69 73  n array of regis
60c0: 74 65 72 73 2e 20 54 68 65 79 20 6e 65 65 64 20  ters. They need 
60d0: 74 6f 20 62 65 20 63 6f 6d 70 6f 73 65 64 20 69  to be composed i
60e0: 6e 74 6f 20 61 20 72 65 63 6f 72 64 0a 20 20 20  nto a record.   
60f0: 20 2a 2a 20 61 6e 64 20 69 6e 73 65 72 74 65 64   ** and inserted
6100: 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72   into the sorter
6110: 20 69 66 20 65 69 74 68 65 72 20 28 61 29 20 74   if either (a) t
6120: 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
6130: 6c 79 0a 20 20 20 20 2a 2a 20 6c 65 73 73 20 74  ly.    ** less t
6140: 68 61 6e 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54  han LIMIT+OFFSET
6150: 20 69 74 65 6d 73 20 6f 72 20 28 62 29 20 74 68   items or (b) th
6160: 65 20 6e 65 77 20 72 65 63 6f 72 64 20 69 73 20  e new record is 
6170: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 20 20  smaller than .  
6180: 20 20 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74    ** the largest
6190: 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e 74 6c   record currentl
61a0: 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2e  y in the sorter.
61b0: 20 49 66 20 28 62 29 20 69 73 20 74 72 75 65 20   If (b) is true 
61c0: 61 6e 64 20 74 68 65 72 65 0a 20 20 20 20 2a 2a  and there.    **
61d0: 20 61 72 65 20 61 6c 72 65 61 64 79 20 4c 49 4d   are already LIM
61e0: 49 54 2b 4f 46 46 53 45 54 20 69 74 65 6d 73 20  IT+OFFSET items 
61f0: 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2c 20 64  in the sorter, d
6200: 65 6c 65 74 65 20 74 68 65 20 6c 61 72 67 65 73  elete the larges
6210: 74 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 62  t.    ** entry b
6220: 65 66 6f 72 65 20 69 6e 73 65 72 74 69 6e 67 20  efore inserting 
6230: 74 68 65 20 6e 65 77 20 6f 6e 65 2e 20 54 68 69  the new one. Thi
6240: 73 20 77 61 79 20 74 68 65 72 65 20 61 72 65 20  s way there are 
6250: 6e 65 76 65 72 20 6d 6f 72 65 20 0a 20 20 20 20  never more .    
6260: 2a 2a 20 74 68 61 6e 20 4c 49 4d 49 54 2b 4f 46  ** than LIMIT+OF
6270: 46 53 45 54 20 69 74 65 6d 73 20 69 6e 20 74 68  FSET items in th
6280: 65 20 73 6f 72 74 65 72 2e 0a 20 20 20 20 2a 2a  e sorter..    **
6290: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6e  .    ** If the n
62a0: 65 77 20 72 65 63 6f 72 64 20 64 6f 65 73 20 6e  ew record does n
62b0: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e  ot need to be in
62c0: 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 20  serted into the 
62d0: 73 6f 72 74 65 72 2c 0a 20 20 20 20 2a 2a 20 6a  sorter,.    ** j
62e0: 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ump to the next 
62f0: 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
6300: 20 6c 6f 6f 70 2e 20 4f 72 2c 20 69 66 20 74 68   loop. Or, if th
6310: 65 0a 20 20 20 20 2a 2a 20 70 53 6f 72 74 2d 3e  e.    ** pSort->
6320: 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f  bOrderedInnerLoo
6330: 70 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  p flag is set to
6340: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
6350: 68 65 20 69 6e 6e 65 72 0a 20 20 20 20 2a 2a 20  he inner.    ** 
6360: 6c 6f 6f 70 20 64 65 6c 69 76 65 72 73 20 69 74  loop delivers it
6370: 65 6d 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72  ems in sorted or
6380: 64 65 72 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65  der, jump to the
6390: 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 0a   next iteration.
63a0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6f 75      ** of the ou
63b0: 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  ter loop..    */
63c0: 0a 20 20 20 20 69 6e 74 20 69 43 73 72 20 3d 20  .    int iCsr = 
63d0: 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f 72 3b  pSort->iECursor;
63e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
63f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 4e  AddOp2(v, OP_IfN
6400: 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20  otZero, iLimit, 
6410: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
6420: 6e 74 41 64 64 72 28 76 29 2b 34 29 3b 0a 20 20  ntAddr(v)+4);.  
6430: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
6440: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6450: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4c  beAddOp2(v, OP_L
6460: 61 73 74 2c 20 69 43 73 72 2c 20 30 29 3b 0a 20  ast, iCsr, 0);. 
6470: 20 20 20 69 53 6b 69 70 20 3d 20 73 71 6c 69 74     iSkip = sqlit
6480: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
6490: 76 2c 20 4f 50 5f 49 64 78 4c 45 2c 0a 20 20 20  v, OP_IdxLE,.   
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
64c0: 73 72 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e  sr, 0, regBase+n
64d0: 4f 42 53 61 74 2c 20 6e 45 78 70 72 2d 6e 4f 42  OBSat, nExpr-nOB
64e0: 53 61 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Sat);.    VdbeCo
64f0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
6500: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
6510: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69  (v, OP_Delete, i
6520: 43 73 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Csr);.  }.  if( 
6530: 72 65 67 52 65 63 6f 72 64 3d 3d 30 20 29 7b 0a  regRecord==0 ){.
6540: 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20      regRecord = 
6550: 6d 61 6b 65 53 6f 72 74 65 72 52 65 63 6f 72 64  makeSorterRecord
6560: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20  (pParse, pSort, 
6570: 70 53 65 6c 65 63 74 2c 20 72 65 67 42 61 73 65  pSelect, regBase
6580: 2c 20 6e 42 61 73 65 29 3b 0a 20 20 7d 0a 20 20  , nBase);.  }.  
6590: 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74 46  if( pSort->sortF
65a0: 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f  lags & SORTFLAG_
65b0: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
65c0: 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49   op = OP_SorterI
65d0: 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nsert;.  }else{.
65e0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49      op = OP_IdxI
65f0: 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  nsert;.  }.  sql
6600: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
6610: 74 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74 2d 3e  t(v, op, pSort->
6620: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63  iECursor, regRec
6630: 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ord,.           
6640: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 42              regB
6650: 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73  ase+nOBSat, nBas
6660: 65 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 69 66 28  e-nOBSat);.  if(
6670: 20 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 61 73   iSkip ){.    as
6680: 73 65 72 74 28 20 70 53 6f 72 74 2d 3e 62 4f 72  sert( pSort->bOr
6690: 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3d 3d  deredInnerLoop==
66a0: 30 20 7c 7c 20 70 53 6f 72 74 2d 3e 62 4f 72 64  0 || pSort->bOrd
66b0: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3d 3d 31  eredInnerLoop==1
66c0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
66d0: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 69  dbeChangeP2(v, i
66e0: 53 6b 69 70 2c 0a 20 20 20 20 20 20 20 20 20 73  Skip,.         s
66f0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
6700: 74 41 64 64 72 28 76 29 20 2b 20 70 53 6f 72 74  tAddr(v) + pSort
6710: 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ->bOrderedInnerL
6720: 6f 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  oop);.  }.}../*.
6730: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f 20 69  ** Add code to i
6740: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f 46 46  mplement the OFF
6750: 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  SET.*/.static vo
6760: 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28 0a 20  id codeOffset(. 
6770: 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20   Vdbe *v,       
6780: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
6790: 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 4d  ode into this VM
67a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 73 65   */.  int iOffse
67b0: 74 2c 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  t,      /* Regis
67c0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ter holding the 
67d0: 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72 20 2a  offset counter *
67e0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75  /.  int iContinu
67f0: 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  e     /* Jump he
6800: 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65 20 63  re to skip the c
6810: 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f  urrent record */
6820: 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66 66 73 65  .){.  if( iOffse
6830: 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t>0 ){.    sqlit
6840: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6850: 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65  OP_IfPos, iOffse
6860: 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 31 29  t, iContinue, 1)
6870: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
6880: 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  );.    VdbeComme
6890: 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 22 29  nt((v, "OFFSET")
68a0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
68b0: 41 64 64 20 63 6f 64 65 20 74 68 61 74 20 77 69  Add code that wi
68c0: 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ll check to make
68d0: 20 73 75 72 65 20 74 68 65 20 4e 20 72 65 67 69   sure the N regi
68e0: 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  sters starting a
68f0: 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61  t iMem.** form a
6900: 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e   distinct entry.
6910: 20 20 69 54 61 62 20 69 73 20 61 20 73 6f 72 74    iTab is a sort
6920: 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 68  ing index that h
6930: 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a  olds previously.
6940: 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74  ** seen combinat
6950: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61  ions of the N va
6960: 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74  lues.  A new ent
6970: 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54  ry is made in iT
6980: 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72  ab.** if the cur
6990: 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72  rent N values ar
69a0: 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a  e new..**.** A j
69b0: 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70 65 61  ump to addrRepea
69c0: 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68  t is made and th
69d0: 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65  e N+1 values are
69e0: 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
69f0: 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65  .** stack if the
6a00: 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20   top N elements 
6a10: 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74  are not distinct
6a20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6a30: 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20   codeDistinct(. 
6a40: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6a50: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
6a60: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
6a70: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
6a80: 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20 20 20  int iTab,       
6a90: 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20     /* A sorting 
6aa0: 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20 74 65  index used to te
6ab0: 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e  st for distinctn
6ac0: 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ess */.  int add
6ad0: 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a  rRepeat,    /* J
6ae0: 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e  ump to here if n
6af0: 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20  ot distinct */. 
6b00: 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20   int N,         
6b10: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6b20: 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69   elements */.  i
6b30: 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20  nt iMem         
6b40: 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65    /* First eleme
6b50: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  nt */.){.  Vdbe 
6b60: 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20  *v;.  int r1;.. 
6b70: 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64   v = pParse->pVd
6b80: 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74  be;.  r1 = sqlit
6b90: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
6ba0: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
6bb0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
6bc0: 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20  OP_Found, iTab, 
6bd0: 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d  addrRepeat, iMem
6be0: 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , N); VdbeCovera
6bf0: 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
6c00: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6c10: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65  _MakeRecord, iMe
6c20: 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c  m, N, r1);.  sql
6c30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
6c40: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
6c50: 74 2c 20 69 54 61 62 2c 20 72 31 2c 20 69 4d 65  t, iTab, r1, iMe
6c60: 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  m, N);.  sqlite3
6c70: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6c80: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
6c90: 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
6ca0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
6cb0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 23  Parse, r1);.}..#
6cc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6cd0: 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52  BLE_SORTER_REFER
6ce0: 45 4e 43 45 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ENCES./*.** This
6cf0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
6d00: 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 69  led as part of i
6d10: 6e 6e 65 72 2d 6c 6f 6f 70 20 67 65 6e 65 72 61  nner-loop genera
6d20: 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43  tion for a SELEC
6d30: 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77  T.** statement w
6d40: 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
6d50: 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 70 74 69  that is not opti
6d60: 6d 69 7a 65 64 20 62 79 20 61 6e 20 69 6e 64 65  mized by an inde
6d70: 78 2e 20 49 74 20 0a 2a 2a 20 64 65 74 65 72 6d  x. It .** determ
6d80: 69 6e 65 73 20 74 68 65 20 65 78 70 72 65 73 73  ines the express
6d90: 69 6f 6e 73 2c 20 69 66 20 61 6e 79 2c 20 74 68  ions, if any, th
6da0: 61 74 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65  at the sorter-re
6db0: 66 65 72 65 6e 63 65 20 0a 2a 2a 20 6f 70 74 69  ference .** opti
6dc0: 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20  mization should 
6dd0: 62 65 20 75 73 65 64 20 66 6f 72 2e 20 54 68 65  be used for. The
6de0: 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65 6e 63   sorter-referenc
6df0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
6e00: 2a 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  * is used for SE
6e10: 4c 45 43 54 20 71 75 65 72 69 65 73 20 6c 69 6b  LECT queries lik
6e20: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  e:.**.**   SELEC
6e30: 54 20 61 2c 20 62 69 67 62 6c 6f 62 20 46 52 4f  T a, bigblob FRO
6e40: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 20  M t1 ORDER BY a 
6e50: 4c 49 4d 49 54 20 31 30 0a 2a 2a 0a 2a 2a 20 49  LIMIT 10.**.** I
6e60: 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
6e70: 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20 65  on is used for e
6e80: 78 70 72 65 73 73 69 6f 6e 20 22 62 69 67 62 6c  xpression "bigbl
6e90: 6f 62 22 2c 20 74 68 65 6e 20 69 6e 73 74 65 61  ob", then instea
6ea0: 64 20 6f 66 0a 2a 2a 20 73 74 6f 72 69 6e 67 20  d of.** storing 
6eb0: 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
6ec0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20   that column in 
6ed0: 74 68 65 20 73 6f 72 74 65 72 20 72 65 63 6f 72  the sorter recor
6ee0: 64 73 2c 20 74 68 65 20 50 4b 20 6f 66 0a 2a 2a  ds, the PK of.**
6ef0: 20 74 68 65 20 72 6f 77 20 66 72 6f 6d 20 74 61   the row from ta
6f00: 62 6c 65 20 74 31 20 69 73 20 73 74 6f 72 65 64  ble t1 is stored
6f10: 20 69 6e 73 74 65 61 64 2e 20 54 68 65 6e 2c 20   instead. Then, 
6f20: 61 73 20 72 65 63 6f 72 64 73 20 61 72 65 20 65  as records are e
6f30: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 0a 2a 2a  xtracted from.**
6f40: 20 74 68 65 20 73 6f 72 74 65 72 20 74 6f 20 72   the sorter to r
6f50: 65 74 75 72 6e 20 74 6f 20 74 68 65 20 75 73 65  eturn to the use
6f60: 72 2c 20 74 68 65 20 72 65 71 75 69 72 65 64 20  r, the required 
6f70: 76 61 6c 75 65 20 6f 66 20 62 69 67 62 6c 6f 62  value of bigblob
6f80: 20 69 73 0a 2a 2a 20 72 65 74 72 69 65 76 65 64   is.** retrieved
6f90: 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
6fa0: 61 62 6c 65 20 74 31 2e 20 49 66 20 74 68 65 20  able t1. If the 
6fb0: 76 61 6c 75 65 73 20 61 72 65 20 76 65 72 79 20  values are very 
6fc0: 6c 61 72 67 65 2c 20 74 68 69 73 20 0a 2a 2a 20  large, this .** 
6fd0: 63 61 6e 20 62 65 20 6d 6f 72 65 20 65 66 66 69  can be more effi
6fe0: 63 69 65 6e 74 20 74 68 61 6e 20 73 74 6f 72 69  cient than stori
6ff0: 6e 67 20 74 68 65 6d 20 64 69 72 65 63 74 6c 79  ng them directly
7000: 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20 72   in the sorter r
7010: 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ecords..**.** Th
7020: 65 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 2e  e ExprList_item.
7030: 62 53 6f 72 74 65 72 52 65 66 20 66 6c 61 67 20  bSorterRef flag 
7040: 69 73 20 73 65 74 20 66 6f 72 20 65 61 63 68 20  is set for each 
7050: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 70 45  expression in pE
7060: 4c 69 73 74 20 0a 2a 2a 20 66 6f 72 20 77 68 69  List .** for whi
7070: 63 68 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65  ch the sorter-re
7080: 66 65 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ference optimiza
7090: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 65  tion should be e
70a0: 6e 61 62 6c 65 64 2e 20 0a 2a 2a 20 41 64 64 69  nabled. .** Addi
70b0: 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 70 53  tionally, the pS
70c0: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 5d 20 61 72  ort->aDefer[] ar
70d0: 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ray is populated
70e0: 20 77 69 74 68 20 65 6e 74 72 69 65 73 0a 2a 2a   with entries.**
70f0: 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73   for all cursors
7100: 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 76 61   required to eva
7110: 6c 75 61 74 65 20 61 6c 6c 20 73 65 6c 65 63 74  luate all select
7120: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  ed expressions. 
7130: 46 69 6e 61 6c 6c 79 2e 0a 2a 2a 20 6f 75 74 70  Finally..** outp
7140: 75 74 20 76 61 72 69 61 62 6c 65 20 28 2a 70 70  ut variable (*pp
7150: 45 78 74 72 61 29 20 69 73 20 73 65 74 20 74 6f  Extra) is set to
7160: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
7170: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a  ist containing.*
7180: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f  * expressions fo
7190: 72 20 61 6c 6c 20 65 78 74 72 61 20 50 4b 20 76  r all extra PK v
71a0: 61 6c 75 65 73 20 74 68 61 74 20 73 68 6f 75 6c  alues that shoul
71b0: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
71c0: 68 65 0a 2a 2a 20 73 6f 72 74 65 72 20 72 65 63  he.** sorter rec
71d0: 6f 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ords..*/.static 
71e0: 76 6f 69 64 20 73 65 6c 65 63 74 45 78 70 72 44  void selectExprD
71f0: 65 66 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70  efer(.  Parse *p
7200: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
7210: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65          /* Leave
7220: 20 61 6e 79 20 65 72 72 6f 72 20 68 65 72 65 20   any error here 
7230: 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53  */.  SortCtx *pS
7240: 6f 72 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ort,            
7250: 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72 20 63       /* Sorter c
7260: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
7270: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
7280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
7290: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 73 74 69  xpressions desti
72a0: 6e 65 64 20 66 6f 72 20 73 6f 72 74 65 72 20 2a  ned for sorter *
72b0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  /.  ExprList **p
72c0: 70 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  pExtra          
72d0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
72e0: 6e 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  ns to append to 
72f0: 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20 2a 2f  sorter record */
7300: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
7310: 6e 74 20 6e 44 65 66 65 72 20 3d 20 30 3b 0a 20  nt nDefer = 0;. 
7320: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78 74 72   ExprList *pExtr
7330: 61 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  a = 0;.  for(i=0
7340: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
7350: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  r; i++){.    str
7360: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
7370: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 45 4c 69  m *pItem = &pELi
7380: 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 69 66  st->a[i];.    if
7390: 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
73a0: 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 7b 0a 20  derByCol==0 ){. 
73b0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
73c0: 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
73d0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
73e0: 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62  ab = pExpr->pTab
73f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
7400: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
7410: 20 26 26 20 70 54 61 62 20 26 26 20 21 49 73 56   && pTab && !IsV
7420: 69 72 74 75 61 6c 28 70 54 61 62 29 0a 20 20 20  irtual(pTab).   
7430: 20 20 20 20 26 26 20 28 70 54 61 62 2d 3e 61 43      && (pTab->aC
7440: 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ol[pExpr->iColum
7450: 6e 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f  n].colFlags & CO
7460: 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52 45 46 29  LFLAG_SORTERREF)
7470: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
7480: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20    int j;.       
7490: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 44 65 66   for(j=0; j<nDef
74a0: 65 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  er; j++){.      
74b0: 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 61      if( pSort->a
74c0: 44 65 66 65 72 5b 6a 5d 2e 69 43 73 72 3d 3d 70  Defer[j].iCsr==p
74d0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 20 62  Expr->iTable ) b
74e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
74f0: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e          if( j==n
7500: 44 65 66 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Defer ){.       
7510: 20 20 20 69 66 28 20 6e 44 65 66 65 72 3d 3d 41     if( nDefer==A
7520: 72 72 61 79 53 69 7a 65 28 70 53 6f 72 74 2d 3e  rraySize(pSort->
7530: 61 44 65 66 65 72 29 20 29 7b 0a 20 20 20 20 20  aDefer) ){.     
7540: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
7550: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
7560: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
7570: 74 20 6e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  t nKey = 1;.    
7580: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
7590: 20 20 20 20 20 20 20 20 20 20 20 49 6e 64 65 78             Index
75a0: 20 2a 70 50 6b 20 3d 20 30 3b 0a 20 20 20 20 20   *pPk = 0;.     
75b0: 20 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52         if( !HasR
75c0: 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 6b 20              pPk 
75e0: 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
75f0: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
7600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4b                nK
7610: 65 79 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  ey = pPk->nKeyCo
7620: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l;.            }
7630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
7640: 28 6b 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b  (k=0; k<nKey; k+
7650: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
7660: 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73    Expr *pNew = s
7670: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
7680: 73 65 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30  se, TK_COLUMN, 0
7690: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
76a0: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76c0: 70 4e 65 77 2d 3e 69 54 61 62 6c 65 20 3d 20 70  pNew->iTable = p
76d0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Expr->iTable;.  
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
76f0: 65 77 2d 3e 70 54 61 62 20 3d 20 70 45 78 70 72  ew->pTab = pExpr
7700: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
7710: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 43          pNew->iC
7720: 6f 6c 75 6d 6e 20 3d 20 70 50 6b 20 3f 20 70 50  olumn = pPk ? pP
7730: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 3a  k->aiColumn[k] :
7740: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
7750: 20 20 20 20 20 70 45 78 74 72 61 20 3d 20 73 71       pExtra = sq
7760: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
7770: 65 6e 64 28 70 50 61 72 73 65 2c 20 70 45 78 74  end(pParse, pExt
7780: 72 61 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  ra, pNew);.     
7790: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
77a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
77b0: 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44 65 66       pSort->aDef
77c0: 65 72 5b 6e 44 65 66 65 72 5d 2e 70 54 61 62 20  er[nDefer].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 70 53 6f 72 74             pSort
77f0: 2d 3e 61 44 65 66 65 72 5b 6e 44 65 66 65 72 5d  ->aDefer[nDefer]
7800: 2e 69 43 73 72 20 3d 20 70 45 78 70 72 2d 3e 69  .iCsr = pExpr->i
7810: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
7820: 20 20 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72     pSort->aDefer
7830: 5b 6e 44 65 66 65 72 5d 2e 6e 4b 65 79 20 3d 20  [nDefer].nKey = 
7840: 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nKey;.          
7850: 20 20 6e 44 65 66 65 72 2b 2b 3b 0a 20 20 20 20    nDefer++;.    
7860: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7870: 7d 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  }.        pItem-
7880: 3e 62 53 6f 72 74 65 72 52 65 66 20 3d 20 31 3b  >bSorterRef = 1;
7890: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
78a0: 20 7d 0a 20 20 70 53 6f 72 74 2d 3e 6e 44 65 66   }.  pSort->nDef
78b0: 65 72 20 3d 20 28 75 38 29 6e 44 65 66 65 72 3b  er = (u8)nDefer;
78c0: 0a 20 20 2a 70 70 45 78 74 72 61 20 3d 20 70 45  .  *ppExtra = pE
78d0: 78 74 72 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  xtra;.}.#endif..
78e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
78f0: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
7900: 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 69 6e   code for the in
7910: 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e 6e 65  side of the inne
7920: 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61 20 53  r loop.** of a S
7930: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ELECT..**.** If 
7940: 73 72 63 54 61 62 20 69 73 20 6e 65 67 61 74 69  srcTab is negati
7950: 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70 2d 3e  ve, then the p->
7960: 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f  pEList expressio
7970: 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61  ns.** are evalua
7980: 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
7990: 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72  get the data for
79a0: 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73   this row.  If s
79b0: 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f  rcTab is.** zero
79c0: 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64   or more, then d
79d0: 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72  ata is pulled fr
79e0: 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 2d  om srcTab and p-
79f0: 3e 70 45 4c 69 73 74 20 69 73 20 75 73 65 64 20  >pEList is used 
7a00: 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20  only .** to get 
7a10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
7a20: 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 63 6f  lumns and the co
7a30: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
7a40: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
7a50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7a60: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
7a70: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
7a80: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
7a90: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
7aa0: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
7ab0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7ac0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
7ad0: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
7ae0: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
7af0: 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20   int srcTab,    
7b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c           /* Pull
7b10: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20   data from this 
7b20: 74 61 62 6c 65 20 69 66 20 6e 6f 6e 2d 6e 65 67  table if non-neg
7b30: 61 74 69 76 65 20 2a 2f 0a 20 20 53 6f 72 74 43  ative */.  SortC
7b40: 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20  tx *pSort,      
7b50: 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c     /* If not NUL
7b60: 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  L, info on how t
7b70: 6f 20 70 72 6f 63 65 73 73 20 4f 52 44 45 52 20  o process ORDER 
7b80: 42 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74  BY */.  Distinct
7b90: 43 74 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20  Ctx *pDistinct, 
7ba0: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
7bb0: 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70  info on how to p
7bc0: 72 6f 63 65 73 73 20 44 49 53 54 49 4e 43 54 20  rocess DISTINCT 
7bd0: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
7be0: 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20  *pDest,      /* 
7bf0: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
7c00: 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  f the results */
7c10: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
7c20: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ,          /* Ju
7c30: 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
7c40: 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f  nue with next ro
7c50: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  w */.  int iBrea
7c60: 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
7c70: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
7c80: 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
7c90: 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b  inner loop */.){
7ca0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
7cb0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
7cc0: 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69  t i;.  int hasDi
7cd0: 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 20  stinct;         
7ce0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
7cf0: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
7d00: 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  rd is present */
7d10: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
7d20: 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f  Dest->eDest;   /
7d30: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
7d40: 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20   of results */. 
7d50: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
7d60: 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20  st->iSDParm; /* 
7d70: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
7d80: 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f  o disposal metho
7d90: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75  d */.  int nResu
7da0: 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  ltCol;          
7db0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7dc0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a  result columns *
7dd0: 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52  /.  int nPrefixR
7de0: 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
7df0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
7e00: 72 61 20 72 65 67 69 73 74 65 72 73 20 62 65 66  ra registers bef
7e10: 6f 72 65 20 72 65 67 52 65 73 75 6c 74 20 2a 2f  ore regResult */
7e20: 0a 20 20 52 6f 77 4c 6f 61 64 49 6e 66 6f 20 73  .  RowLoadInfo s
7e30: 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 20 20 20 2f  RowLoadInfo;   /
7e40: 2a 20 49 6e 66 6f 20 66 6f 72 20 64 65 66 65 72  * Info for defer
7e50: 72 65 64 20 72 6f 77 20 6c 6f 61 64 69 6e 67 20  red row loading 
7e60: 2a 2f 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79  */..  /* Usually
7e70: 2c 20 72 65 67 52 65 73 75 6c 74 20 69 73 20 74  , regResult is t
7e80: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 69 6e  he first cell in
7e90: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6d 65 6d   an array of mem
7ea0: 6f 72 79 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 63  ory cells.  ** c
7eb0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75  ontaining the cu
7ec0: 72 72 65 6e 74 20 72 65 73 75 6c 74 20 72 6f 77  rrent result row
7ed0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72  . In this case r
7ee0: 65 67 4f 72 69 67 20 69 73 20 73 65 74 20 74 6f  egOrig is set to
7ef0: 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 76   the.  ** same v
7f00: 61 6c 75 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  alue. However, i
7f10: 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72  f the results ar
7f20: 65 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20  e being sent to 
7f30: 74 68 65 20 73 6f 72 74 65 72 2c 20 74 68 65 0a  the sorter, the.
7f40: 20 20 2a 2a 20 76 61 6c 75 65 73 20 66 6f 72 20    ** values for 
7f50: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 73 20  any expressions 
7f60: 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 70 61  that are also pa
7f70: 72 74 20 6f 66 20 74 68 65 20 73 6f 72 74 2d 6b  rt of the sort-k
7f80: 65 79 20 61 72 65 20 6f 6d 69 74 74 65 64 0a 20  ey are omitted. 
7f90: 20 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20 61 72   ** from this ar
7fa0: 72 61 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ray. In this cas
7fb0: 65 20 72 65 67 4f 72 69 67 20 69 73 20 73 65 74  e regOrig is set
7fc0: 20 74 6f 20 7a 65 72 6f 2e 20 20 2a 2f 0a 20 20   to zero.  */.  
7fd0: 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20  int regResult;  
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7ff0: 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  tart of memory h
8000: 6f 6c 64 69 6e 67 20 63 75 72 72 65 6e 74 20 72  olding current r
8010: 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20  esults */.  int 
8020: 72 65 67 4f 72 69 67 3b 20 20 20 20 20 20 20 20  regOrig;        
8030: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
8040: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69   of memory holdi
8050: 6e 67 20 66 75 6c 6c 20 72 65 73 75 6c 74 20 28  ng full result (
8060: 6f 72 20 30 29 20 2a 2f 0a 0a 20 20 61 73 73 65  or 0) */..  asse
8070: 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73 65 72  rt( v );.  asser
8080: 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
8090: 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74  );.  hasDistinct
80a0: 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70   = pDistinct ? p
80b0: 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54  Distinct->eTnctT
80c0: 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54  ype : WHERE_DIST
80d0: 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28  INCT_NOOP;.  if(
80e0: 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72 74 2d   pSort && pSort-
80f0: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 70  >pOrderBy==0 ) p
8100: 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Sort = 0;.  if( 
8110: 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68 61 73  pSort==0 && !has
8120: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
8130: 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69 6e 75  assert( iContinu
8140: 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65  e!=0 );.    code
8150: 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
8160: 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
8170: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c  ;.  }..  /* Pull
8180: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
8190: 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e  olumns..  */.  n
81a0: 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 2d 3e 70  ResultCol = p->p
81b0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20  EList->nExpr;.. 
81c0: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
81d0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  t==0 ){.    if( 
81e0: 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 6e  pSort ){.      n
81f0: 50 72 65 66 69 78 52 65 67 20 3d 20 70 53 6f 72  PrefixReg = pSor
8200: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  t->pOrderBy->nEx
8210: 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 21 28  pr;.      if( !(
8220: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
8230: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
8240: 6f 72 74 65 72 29 20 29 20 6e 50 72 65 66 69 78  orter) ) nPrefix
8250: 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20 70 50 61  Reg++;.      pPa
8260: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 50 72  rse->nMem += nPr
8270: 65 66 69 78 52 65 67 3b 0a 20 20 20 20 7d 0a 20  efixReg;.    }. 
8280: 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20     pDest->iSdst 
8290: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31  = pParse->nMem+1
82a0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d  ;.    pParse->nM
82b0: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
82c0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 44  ;.  }else if( pD
82d0: 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52 65 73 75  est->iSdst+nResu
82e0: 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73 65 2d 3e  ltCol > pParse->
82f0: 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 54  nMem ){.    /* T
8300: 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 20  his is an error 
8310: 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74 20 63  condition that c
8320: 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f 72 20 65  an result, for e
8330: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 53  xample, when a S
8340: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 6f 6e 20  ELECT.    ** on 
8350: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
8360: 69 64 65 20 6f 66 20 61 6e 20 49 4e 53 45 52 54  ide of an INSERT
8370: 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 72   contains more r
8380: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
8390: 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20  an.    ** there 
83a0: 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  are columns in t
83b0: 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20  he table on the 
83c0: 6c 65 66 74 2e 20 20 54 68 65 20 65 72 72 6f 72  left.  The error
83d0: 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68 74 0a   will be caught.
83e0: 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 70 6f 72      ** and repor
83f0: 74 65 64 20 6c 61 74 65 72 2e 20 20 42 75 74 20  ted later.  But 
8400: 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20  we need to make 
8410: 73 75 72 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f  sure enough memo
8420: 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a  ry is allocated.
8430: 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20      ** to avoid 
8440: 6f 74 68 65 72 20 73 70 75 72 69 6f 75 73 20 65  other spurious e
8450: 72 72 6f 72 73 20 69 6e 20 74 68 65 20 6d 65 61  rrors in the mea
8460: 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20 70 50  ntime. */.    pP
8470: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52  arse->nMem += nR
8480: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a 20 20  esultCol;.  }.  
8490: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e  pDest->nSdst = n
84a0: 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 72 65 67  ResultCol;.  reg
84b0: 4f 72 69 67 20 3d 20 72 65 67 52 65 73 75 6c 74  Orig = regResult
84c0: 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b   = pDest->iSdst;
84d0: 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30  .  if( srcTab>=0
84e0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
84f0: 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69   i<nResultCol; i
8500: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
8510: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8520: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61  OP_Column, srcTa
8530: 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b  b, i, regResult+
8540: 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  i);.      VdbeCo
8550: 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20  mment((v, "%s", 
8560: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  p->pEList->a[i].
8570: 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
8580: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
8590: 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a  !=SRT_Exists ){.
85a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
85b0: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
85c0: 52 45 4e 43 45 53 0a 20 20 20 20 45 78 70 72 4c  RENCES.    ExprL
85d0: 69 73 74 20 2a 70 45 78 74 72 61 20 3d 20 30 3b  ist *pExtra = 0;
85e0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49  .#endif.    /* I
85f0: 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  f the destinatio
8600: 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e  n is an EXISTS(.
8610: 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ..) expression, 
8620: 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a  the actual.    *
8630: 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65  * values returne
8640: 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
8650: 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64  are not required
8660: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 38 20  ..    */.    u8 
8670: 65 63 65 6c 46 6c 61 67 73 3b 20 20 20 20 2f 2a  ecelFlags;    /*
8680: 20 22 65 63 65 6c 22 20 69 73 20 61 6e 20 61 62   "ecel" is an ab
8690: 62 72 65 76 69 61 74 69 6f 6e 20 6f 66 20 22 45  breviation of "E
86a0: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 22  xprCodeExprList"
86b0: 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74   */.    ExprList
86c0: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66   *pEList;.    if
86d0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  ( eDest==SRT_Mem
86e0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f   || eDest==SRT_O
86f0: 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d  utput || eDest==
8700: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b  SRT_Coroutine ){
8710: 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73  .      ecelFlags
8720: 20 3d 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44   = SQLITE_ECEL_D
8730: 55 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  UP;.    }else{. 
8740: 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73 20 3d       ecelFlags =
8750: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
8760: 28 20 70 53 6f 72 74 20 26 26 20 68 61 73 44 69  ( pSort && hasDi
8770: 73 74 69 6e 63 74 3d 3d 30 20 26 26 20 65 44 65  stinct==0 && eDe
8780: 73 74 21 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st!=SRT_EphemTab
8790: 20 26 26 20 65 44 65 73 74 21 3d 53 52 54 5f 54   && eDest!=SRT_T
87a0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  able ){.      /*
87b0: 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   For each expres
87c0: 73 69 6f 6e 20 69 6e 20 70 2d 3e 70 45 4c 69 73  sion in p->pELis
87d0: 74 20 74 68 61 74 20 69 73 20 61 20 63 6f 70 79  t that is a copy
87e0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
87f0: 6e 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  n in.      ** th
8800: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
8810: 65 20 28 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72  e (pSort->pOrder
8820: 42 79 29 2c 20 73 65 74 20 74 68 65 20 61 73 73  By), set the ass
8830: 6f 63 69 61 74 65 64 20 0a 20 20 20 20 20 20 2a  ociated .      *
8840: 2a 20 69 4f 72 64 65 72 42 79 43 6f 6c 20 76 61  * iOrderByCol va
8850: 6c 75 65 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  lue to one more 
8860: 74 68 61 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  than the index o
8870: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 0a  f the ORDER BY .
8880: 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
8890: 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73  ion within the s
88a0: 6f 72 74 2d 6b 65 79 20 74 68 61 74 20 70 75 73  ort-key that pus
88b0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20 77 69  hOntoSorter() wi
88c0: 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20  ll generate..   
88d0: 20 20 20 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 77     ** This allow
88e0: 73 20 74 68 65 20 70 2d 3e 70 45 4c 69 73 74 20  s the p->pEList 
88f0: 66 69 65 6c 64 20 74 6f 20 62 65 20 6f 6d 69 74  field to be omit
8900: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72  ted from the sor
8910: 74 65 64 20 72 65 63 6f 72 64 2c 0a 20 20 20 20  ted record,.    
8920: 20 20 2a 2a 20 73 61 76 69 6e 67 20 73 70 61 63    ** saving spac
8930: 65 20 61 6e 64 20 43 50 55 20 63 79 63 6c 65 73  e and CPU cycles
8940: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65 63 65 6c  .  */.      ecel
8950: 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45  Flags |= (SQLITE
8960: 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 7c 53 51  _ECEL_OMITREF|SQ
8970: 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29 3b 0a  LITE_ECEL_REF);.
8980: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 53 6f  .      for(i=pSo
8990: 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69 3c 70 53  rt->nOBSat; i<pS
89a0: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  ort->pOrderBy->n
89b0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
89c0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
89d0: 20 20 20 69 66 28 20 28 6a 20 3d 20 70 53 6f 72     if( (j = pSor
89e0: 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  t->pOrderBy->a[i
89f0: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
8a00: 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l)>0 ){.        
8a10: 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a    p->pEList->a[j
8a20: 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  -1].u.x.iOrderBy
8a30: 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f 72 74 2d  Col = i+1-pSort-
8a40: 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 20 20 20  >nOBSat;.       
8a50: 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65   }.      }.#ifde
8a60: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
8a70: 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45  SORTER_REFERENCE
8a80: 53 0a 20 20 20 20 20 20 73 65 6c 65 63 74 45 78  S.      selectEx
8a90: 70 72 44 65 66 65 72 28 70 50 61 72 73 65 2c 20  prDefer(pParse, 
8aa0: 70 53 6f 72 74 2c 20 70 2d 3e 70 45 4c 69 73 74  pSort, p->pEList
8ab0: 2c 20 26 70 45 78 74 72 61 29 3b 0a 20 20 20 20  , &pExtra);.    
8ac0: 20 20 69 66 28 20 70 45 78 74 72 61 20 26 26 20    if( pExtra && 
8ad0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
8ae0: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20  ocFailed==0 ){. 
8af0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
8b00: 72 65 20 61 72 65 20 61 6e 79 20 65 78 74 72 61  re are any extra
8b10: 20 50 4b 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 61   PK columns to a
8b20: 64 64 20 74 6f 20 74 68 65 20 73 6f 72 74 65 72  dd to the sorter
8b30: 20 72 65 63 6f 72 64 73 2c 0a 20 20 20 20 20 20   records,.      
8b40: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 65 78    ** allocate ex
8b50: 74 72 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  tra memory cells
8b60: 20 61 6e 64 20 61 64 6a 75 73 74 20 74 68 65 20   and adjust the 
8b70: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20  OpenEphemeral . 
8b80: 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 74 72 75         ** instru
8b90: 63 74 69 6f 6e 20 74 6f 20 61 63 63 6f 75 6e 74  ction to account
8ba0: 20 66 6f 72 20 74 68 65 20 6c 61 72 67 65 72 20   for the larger 
8bb0: 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20 69 73  records. This is
8bc0: 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a   only.        **
8bd0: 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65   required if the
8be0: 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f  re are one or mo
8bf0: 72 65 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  re WITHOUT ROWID
8c00: 20 74 61 62 6c 65 73 20 77 69 74 68 0a 20 20 20   tables with.   
8c10: 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6f 73 69 74       ** composit
8c20: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 73 20 69  e primary keys i
8c30: 6e 20 74 68 65 20 53 6f 72 74 43 74 78 2e 61 44  n the SortCtx.aD
8c40: 65 66 65 72 5b 5d 20 61 72 72 61 79 2e 20 20 2a  efer[] array.  *
8c50: 2f 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  /.        VdbeOp
8c60: 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56   *pOp = sqlite3V
8c70: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72  dbeGetOp(v, pSor
8c80: 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78  t->addrSortIndex
8c90: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  );.        pOp->
8ca0: 70 32 20 2b 3d 20 28 70 45 78 74 72 61 2d 3e 6e  p2 += (pExtra->n
8cb0: 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e 6e 44  Expr - pSort->nD
8cc0: 65 66 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70  efer);.        p
8cd0: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 2d  Op->p4.pKeyInfo-
8ce0: 3e 6e 41 6c 6c 46 69 65 6c 64 20 2b 3d 20 28 70  >nAllField += (p
8cf0: 45 78 74 72 61 2d 3e 6e 45 78 70 72 20 2d 20 70  Extra->nExpr - p
8d00: 53 6f 72 74 2d 3e 6e 44 65 66 65 72 29 3b 0a 20  Sort->nDefer);. 
8d10: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
8d20: 4d 65 6d 20 2b 3d 20 70 45 78 74 72 61 2d 3e 6e  Mem += pExtra->n
8d30: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Expr;.      }.#e
8d40: 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 41  ndif..      /* A
8d50: 64 6a 75 73 74 20 6e 52 65 73 75 6c 74 43 6f 6c  djust nResultCol
8d60: 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20   to account for 
8d70: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65  columns that are
8d80: 20 6f 6d 69 74 74 65 64 0a 20 20 20 20 20 20 2a   omitted.      *
8d90: 2a 20 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65  * from the sorte
8da0: 72 20 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a  r by the optimiz
8db0: 61 74 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 62  ations in this b
8dc0: 72 61 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 70  ranch */.      p
8dd0: 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
8de0: 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  t;.      for(i=0
8df0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
8e00: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
8e10: 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69   if( pEList->a[i
8e20: 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
8e30: 6c 3e 30 0a 23 69 66 64 65 66 20 53 51 4c 49 54  l>0.#ifdef SQLIT
8e40: 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f  E_ENABLE_SORTER_
8e50: 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 20  REFERENCES.     
8e60: 20 20 20 20 7c 7c 20 70 45 4c 69 73 74 2d 3e 61      || pEList->a
8e70: 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65 66 0a 23  [i].bSorterRef.#
8e80: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 29 7b  endif.        ){
8e90: 0a 20 20 20 20 20 20 20 20 20 20 6e 52 65 73 75  .          nResu
8ea0: 6c 74 43 6f 6c 2d 2d 3b 0a 20 20 20 20 20 20 20  ltCol--;.       
8eb0: 20 20 20 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a     regOrig = 0;.
8ec0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8ed0: 7d 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  }..      testcas
8ee0: 65 28 20 72 65 67 4f 72 69 67 20 29 3b 0a 20 20  e( regOrig );.  
8ef0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
8f00: 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 29 3b 0a  est==SRT_Set );.
8f10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8f20: 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29  eDest==SRT_Mem )
8f30: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8f40: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
8f50: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
8f60: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
8f70: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
8f80: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
8f90: 73 74 3d 3d 53 52 54 5f 53 65 74 20 7c 7c 20 65  st==SRT_Set || e
8fa0: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20  Dest==SRT_Mem . 
8fb0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 44 65            || eDe
8fc0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
8fd0: 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  e || eDest==SRT_
8fe0: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 7d 0a  Output );.    }.
8ff0: 20 20 20 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f      sRowLoadInfo
9000: 2e 72 65 67 52 65 73 75 6c 74 20 3d 20 72 65 67  .regResult = reg
9010: 52 65 73 75 6c 74 3b 0a 20 20 20 20 73 52 6f 77  Result;.    sRow
9020: 4c 6f 61 64 49 6e 66 6f 2e 65 63 65 6c 46 6c 61  LoadInfo.ecelFla
9030: 67 73 20 3d 20 65 63 65 6c 46 6c 61 67 73 3b 0a  gs = ecelFlags;.
9040: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
9050: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
9060: 52 45 4e 43 45 53 0a 20 20 20 20 73 52 6f 77 4c  RENCES.    sRowL
9070: 6f 61 64 49 6e 66 6f 2e 70 45 78 74 72 61 20 3d  oadInfo.pExtra =
9080: 20 70 45 78 74 72 61 3b 0a 20 20 20 20 73 52 6f   pExtra;.    sRo
9090: 77 4c 6f 61 64 49 6e 66 6f 2e 72 65 67 45 78 74  wLoadInfo.regExt
90a0: 72 61 52 65 73 75 6c 74 20 3d 20 72 65 67 52 65  raResult = regRe
90b0: 73 75 6c 74 20 2b 20 6e 52 65 73 75 6c 74 43 6f  sult + nResultCo
90c0: 6c 3b 0a 20 20 20 20 69 66 28 20 70 45 78 74 72  l;.    if( pExtr
90d0: 61 20 29 20 6e 52 65 73 75 6c 74 43 6f 6c 20 2b  a ) nResultCol +
90e0: 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 3b  = pExtra->nExpr;
90f0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
9100: 70 2d 3e 69 4c 69 6d 69 74 0a 20 20 20 20 20 26  p->iLimit.     &
9110: 26 20 28 65 63 65 6c 46 6c 61 67 73 20 26 20 53  & (ecelFlags & S
9120: 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52  QLITE_ECEL_OMITR
9130: 45 46 29 21 3d 30 20 0a 20 20 20 20 20 26 26 20  EF)!=0 .     && 
9140: 6e 50 72 65 66 69 78 52 65 67 3e 30 0a 20 20 20  nPrefixReg>0.   
9150: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
9160: 28 20 70 53 6f 72 74 21 3d 30 20 29 3b 0a 20 20  ( pSort!=0 );.  
9170: 20 20 20 20 61 73 73 65 72 74 28 20 68 61 73 44      assert( hasD
9180: 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20  istinct==0 );.  
9190: 20 20 20 20 70 53 6f 72 74 2d 3e 70 44 65 66 65      pSort->pDefe
91a0: 72 72 65 64 52 6f 77 4c 6f 61 64 20 3d 20 26 73  rredRowLoad = &s
91b0: 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 0a 20 20 20  RowLoadInfo;.   
91c0: 20 20 20 72 65 67 4f 72 69 67 20 3d 20 30 3b 0a     regOrig = 0;.
91d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
91e0: 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f 61 64 52 6f   innerLoopLoadRo
91f0: 77 28 70 50 61 72 73 65 2c 20 70 2c 20 26 73 52  w(pParse, p, &sR
9200: 6f 77 4c 6f 61 64 49 6e 66 6f 29 3b 0a 20 20 20  owLoadInfo);.   
9210: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
9220: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
9230: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
9240: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
9250: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
9260: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
9270: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
9280: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
9290: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
92a0: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
92b0: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68  lt..  */.  if( h
92c0: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
92d0: 20 20 73 77 69 74 63 68 28 20 70 44 69 73 74 69    switch( pDisti
92e0: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29  nct->eTnctType )
92f0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  {.      case WHE
9300: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
9310: 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56  RED: {.        V
9320: 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20  dbeOp *pOp;     
9330: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e         /* No lon
9340: 67 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65  ger required Ope
9350: 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
9360: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
9370: 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20   iJump;         
9380: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73       /* Jump des
9390: 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  tination */.    
93a0: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b      int regPrev;
93b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
93c0: 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74  revious row cont
93d0: 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ent */..        
93e0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
93f0: 65 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  e for the previo
9400: 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  us row */.      
9410: 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
9420: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
9430: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
9440: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
9450: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  .        /* Chan
9460: 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
9470: 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61  hemeral coded ea
9480: 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e  rlier to an OP_N
9490: 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ull.        ** s
94a0: 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61  ets the MEM_Clea
94b0: 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66  red bit on the f
94c0: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 6f 66  irst register of
94d0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
94e0: 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20  previous value. 
94f0: 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
9500: 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77   the OP_Ne below
9510: 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20   to always.     
9520: 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68     ** fail on th
9530: 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
9540: 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76  n of the loop ev
9550: 65 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  en if the first.
9560: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69          ** row i
9570: 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20  s all NULLs..   
9580: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
9590: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
95a0: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
95b0: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
95c0: 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73  .        pOp = s
95d0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
95e0: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
95f0: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
9600: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
9610: 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  P_Null;.        
9620: 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20  pOp->p1 = 1;.   
9630: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72       pOp->p2 = r
9640: 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20  egPrev;..       
9650: 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33   iJump = sqlite3
9660: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
9670: 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  v) + nResultCol;
9680: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
9690: 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  ; i<nResultCol; 
96a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
96b0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
96c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
96d0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
96e0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
96f0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
9700: 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31  ( i<nResultCol-1
9710: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9720: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9730: 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52  3(v, OP_Ne, regR
9740: 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20  esult+i, iJump, 
9750: 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20  regPrev+i);.    
9760: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
9770: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
9780: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9790: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
97a0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71  eAddOp3(v, OP_Eq
97b0: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69  , regResult+i, i
97c0: 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65  Continue, regPre
97d0: 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  v+i);.          
97e0: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
97f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a  );.           }.
9800: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9810: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
9820: 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72   -1, (const char
9830: 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
9840: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20  LSEQ);.         
9850: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
9860: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
9870: 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20  ULLEQ);.        
9880: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
9890: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  ( sqlite3VdbeCur
98a0: 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75  rentAddr(v)==iJu
98b0: 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  mp || pParse->db
98c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
98d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
98e0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
98f0: 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75 6c  P_Copy, regResul
9900: 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65 73  t, regPrev, nRes
9910: 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20  ultCol-1);.     
9920: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9930: 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  }..      case WH
9940: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49  ERE_DISTINCT_UNI
9950: 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  QUE: {.        s
9960: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
9970: 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69  ToNoop(v, pDisti
9980: 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a  nct->addrTnct);.
9990: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
99a0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64 65       }..      de
99b0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
99c0: 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69 6e   assert( pDistin
99d0: 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d 57  ct->eTnctType==W
99e0: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
99f0: 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20 20  ORDERED );.     
9a00: 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28     codeDistinct(
9a10: 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e 63  pParse, pDistinc
9a20: 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f 6e  t->tabTnct, iCon
9a30: 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43 6f  tinue, nResultCo
9a40: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
9a50: 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c          regResul
9a60: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
9a70: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
9a80: 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 3d 3d  .    if( pSort==
9a90: 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f  0 ){.      codeO
9aa0: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
9ab0: 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b  set, iContinue);
9ac0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77  .    }.  }..  sw
9ad0: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
9ae0: 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f     /* In this mo
9af0: 64 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71  de, write each q
9b00: 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74  uery result to t
9b10: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65  he key of the te
9b20: 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74  mporary.    ** t
9b30: 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20  able iParm..    
9b40: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
9b50: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
9b60: 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20  SELECT.    case 
9b70: 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20  SRT_Union: {.   
9b80: 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
9b90: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
9ba0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
9bb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9bc0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
9bd0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
9be0: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
9bf0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
9c00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
9c10: 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  t(v, OP_IdxInser
9c20: 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 65  t, iParm, r1, re
9c30: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
9c40: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Col);.      sqli
9c50: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
9c60: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
9c70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9c80: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  }..    /* Constr
9c90: 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f  uct a record fro
9ca0: 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75  m the query resu
9cb0: 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20  lt, but instead 
9cc0: 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67  of.    ** saving
9cd0: 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73   that record, us
9ce0: 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f  e it as a key to
9cf0: 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73   delete elements
9d00: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
9d10: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
9d20: 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20   iParm..    */. 
9d30: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65     case SRT_Exce
9d40: 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  pt: {.      sqli
9d50: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
9d60: 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69   OP_IdxDelete, i
9d70: 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c  Parm, regResult,
9d80: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
9d90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9da0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
9db0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
9dc0: 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f  SELECT */..    /
9dd0: 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
9de0: 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67  lt as data using
9df0: 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20   a unique key.. 
9e00: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
9e10: 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  RT_Fifo:.    cas
9e20: 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f 3a 0a  e SRT_DistFifo:.
9e30: 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62      case SRT_Tab
9e40: 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54  le:.    case SRT
9e50: 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20  _EphemTab: {.   
9e60: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
9e70: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
9e80: 70 50 61 72 73 65 2c 20 6e 50 72 65 66 69 78 52  pParse, nPrefixR
9e90: 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 74 65 73  eg+1);.      tes
9ea0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
9eb0: 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  T_Table );.     
9ec0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
9ed0: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
9ee0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9ef0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66  ( eDest==SRT_Fif
9f00: 6f 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  o );.      testc
9f10: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
9f20: 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 20 20  DistFifo );.    
9f30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9f40: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
9f50: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
9f60: 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 2b   nResultCol, r1+
9f70: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 23 69 66  nPrefixReg);.#if
9f80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9f90: 5f 43 54 45 0a 20 20 20 20 20 20 69 66 28 20 65  _CTE.      if( e
9fa0: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69  Dest==SRT_DistFi
9fb0: 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  fo ){.        /*
9fc0: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
9fd0: 69 6f 6e 20 69 73 20 44 69 73 74 46 69 66 6f 2c  ion is DistFifo,
9fe0: 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50   then cursor (iP
9ff0: 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20  arm+1) is open. 
a000: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20         ** on an 
a010: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e  ephemeral index.
a020: 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
a030: 72 6f 77 20 69 73 20 61 6c 72 65 61 64 79 20 70  row is already p
a040: 72 65 73 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  resent.        *
a050: 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  * in the index, 
a060: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20  do not write it 
a070: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 49  to the output. I
a080: 66 20 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a 20  f not, add the. 
a090: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
a0a0: 74 20 72 6f 77 20 74 6f 20 74 68 65 20 69 6e 64  t row to the ind
a0b0: 65 78 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77  ex and proceed w
a0c0: 69 74 68 20 77 72 69 74 69 6e 67 20 69 74 20 74  ith writing it t
a0d0: 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
a0e0: 20 6f 75 74 70 75 74 20 74 61 62 6c 65 20 61 73   output table as
a0f0: 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   well.  */.     
a100: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
a110: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
a120: 41 64 64 72 28 76 29 20 2b 20 34 3b 0a 20 20 20  Addr(v) + 4;.   
a130: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a140: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
a150: 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20  Found, iParm+1, 
a160: 61 64 64 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20  addr, r1, 0);.  
a170: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
a180: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  ge(v);.        s
a190: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
a1a0: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
a1b0: 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31  ert, iParm+1, r1
a1c0: 2c 72 65 67 52 65 73 75 6c 74 2c 6e 52 65 73 75  ,regResult,nResu
a1d0: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  ltCol);.        
a1e0: 61 73 73 65 72 74 28 20 70 53 6f 72 74 3d 3d 30  assert( pSort==0
a1f0: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
a200: 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 53 6f  if.      if( pSo
a210: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  rt ){.        as
a220: 73 65 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d  sert( regResult=
a230: 3d 72 65 67 4f 72 69 67 20 29 3b 0a 20 20 20 20  =regOrig );.    
a240: 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74      pushOntoSort
a250: 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  er(pParse, pSort
a260: 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69 78 52  , p, r1+nPrefixR
a270: 65 67 2c 20 72 65 67 4f 72 69 67 2c 20 31 2c 20  eg, regOrig, 1, 
a280: 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20  nPrefixReg);.   
a290: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a2a0: 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74    int r2 = sqlit
a2b0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
a2c0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
a2d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
a2e0: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
a2f0: 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  iParm, r2);.    
a300: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a310: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
a320: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72  rt, iParm, r1, r
a330: 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2);.        sqli
a340: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
a350: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
a360: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a370: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
a380: 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
a390: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
a3a0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
a3b0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20  nge(pParse, r1, 
a3c0: 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a 20  nPrefixReg+1);. 
a3d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a3e0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
a3f0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
a400: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
a410: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
a420: 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20  for an "expr IN 
a430: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f  (SELECT ...)" co
a440: 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20  nstruct,.    ** 
a450: 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c  then there shoul
a460: 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74  d be a single it
a470: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
a480: 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20    Write this.   
a490: 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68   ** item into th
a4a0: 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68  e set table with
a4b0: 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20   bogus data..   
a4c0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
a4d0: 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  _Set: {.      if
a4e0: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
a4f0: 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67     /* At first g
a500: 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20  lance you would 
a510: 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f  think we could o
a520: 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a  ptimize out the.
a530: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
a540: 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65   BY in this case
a550: 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72   since the order
a560: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
a570: 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
a580: 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  * does not matte
a590: 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69  r.  But there mi
a5a0: 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63  ght be a LIMIT c
a5b0: 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a  lause, in which.
a5c0: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
a5d0: 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d  the order does m
a5e0: 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  atter */.       
a5f0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
a600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
a610: 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72  rse, pSort, p, r
a620: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69  egResult, regOri
a630: 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e  g, nResultCol, n
a640: 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20  PrefixReg);.    
a650: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a660: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
a670: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
a680: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  se);.        ass
a690: 65 72 74 28 20 73 71 6c 69 74 65 33 53 74 72 6c  ert( sqlite3Strl
a6a0: 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66  en30(pDest->zAff
a6b0: 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74 43 6f  Sdst)==nResultCo
a6c0: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  l );.        sql
a6d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
a6e0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
a6f0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
a700: 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20 20 20  ultCol, .       
a710: 20 20 20 20 20 72 31 2c 20 70 44 65 73 74 2d 3e       r1, pDest->
a720: 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73 75 6c  zAffSdst, nResul
a730: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  tCol);.        s
a740: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
a750: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
a760: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
a770: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
a780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a790: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
a7a0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
a7b0: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
a7c0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
a7d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
a7e0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
a7f0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
a800: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
a810: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
a820: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
a830: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
a840: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
a850: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
a860: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
a870: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
a880: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a890: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
a8a0: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
a8b0: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
a8c0: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
a8d0: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
a8e0: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
a8f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
a900: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
a910: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
a920: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
a930: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
a940: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
a950: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
a960: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
a970: 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20 61 72  emory cell or ar
a980: 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a 20 6d  ray of .    ** m
a990: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e 64 20  emory cells and 
a9a0: 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
a9b0: 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
a9c0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
a9d0: 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  Mem: {.      if(
a9e0: 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   pSort ){.      
a9f0: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
aa00: 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e 53 64  tCol<=pDest->nSd
aa10: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75  st );.        pu
aa20: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20  shOntoSorter(.  
aa30: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
aa40: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
aa50: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
aa60: 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50 72 65  nResultCol, nPre
aa70: 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20 20 7d  fixReg);.      }
aa80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
aa90: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
aaa0: 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 29  ==pDest->nSdst )
aab0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
aac0: 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69 50 61  ( regResult==iPa
aad0: 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  rm );.        /*
aae0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
aaf0: 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20  e will jump out 
ab00: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20  of the loop for 
ab10: 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  us */.      }.  
ab20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ab30: 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
ab40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
ab50: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
ab60: 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69  case SRT_Corouti
ab70: 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53 65 6e  ne:       /* Sen
ab80: 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f 2d 72  d data to a co-r
ab90: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 63 61  outine */.    ca
aba0: 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b  se SRT_Output: {
abb0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
abc0: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  n the results */
abd0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
abe0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
abf0: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74  utine );.      t
ac00: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
ac10: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
ac20: 20 20 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b      if( pSort ){
ac30: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
ac40: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
ac50: 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52 65 73  pSort, p, regRes
ac60: 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20 6e 52  ult, regOrig, nR
ac70: 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20 20 20  esultCol,.      
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac90: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
aca0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44      }else if( eD
acb0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
acc0: 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ne ){.        sq
acd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
ace0: 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
acf0: 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
ad00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ad10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ad20: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
ad30: 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c 74 2c  tRow, regResult,
ad40: 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20   nResultCol);.  
ad50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ad60: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
ad70: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67  ange(pParse, reg
ad80: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
ad90: 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ol);.      }.   
ada0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
adb0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
adc0: 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20  OMIT_CTE.    /* 
add0: 57 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  Write the result
ade0: 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72 69 74  s into a priorit
adf0: 79 20 71 75 65 75 65 20 74 68 61 74 20 69 73 20  y queue that is 
ae00: 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e 67 20  order according 
ae10: 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73 74 2d  to.    ** pDest-
ae20: 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20 70 53  >pOrderBy (in pS
ae30: 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53 44 50  O).  pDest->iSDP
ae40: 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29 20 69  arm (in iParm) i
ae50: 73 20 74 68 65 20 63 75 72 73 6f 72 20 66 6f 72  s the cursor for
ae60: 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78   an.    ** index
ae70: 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72   with pSO->nExpr
ae80: 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69  +2 columns.  Bui
ae90: 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67 20 70  ld a key using p
aea0: 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  SO for the first
aeb0: 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78  .    ** pSO->nEx
aec0: 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  pr columns, then
aed0: 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b   make sure all k
aee0: 65 79 73 20 61 72 65 20 75 6e 69 71 75 65 20 62  eys are unique b
aef0: 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20 20 2a  y adding a.    *
af00: 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65  * final OP_Seque
af10: 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  nce column.  The
af20: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20   last column is 
af30: 74 68 65 20 72 65 63 6f 72 64 20 61 73 20 61 20  the record as a 
af40: 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  blob..    */.   
af50: 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 51 75   case SRT_DistQu
af60: 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  eue:.    case SR
af70: 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20  T_Queue: {.     
af80: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20   int nKey;.     
af90: 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33 3b   int r1, r2, r3;
afa0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54  .      int addrT
afb0: 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 45  est = 0;.      E
afc0: 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20  xprList *pSO;.  
afd0: 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73 74 2d      pSO = pDest-
afe0: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
aff0: 20 61 73 73 65 72 74 28 20 70 53 4f 20 29 3b 0a   assert( pSO );.
b000: 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f        nKey = pSO
b010: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
b020: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
b030: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
b040: 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
b050: 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
b060: 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  arse, nKey+2);. 
b070: 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65       r3 = r2+nKe
b080: 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20 65  y+1;.      if( e
b090: 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75  Dest==SRT_DistQu
b0a0: 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  eue ){.        /
b0b0: 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
b0c0: 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75  tion is DistQueu
b0d0: 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28  e, then cursor (
b0e0: 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e  iParm+1) is open
b0f0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61  .        ** on a
b100: 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61   second ephemera
b110: 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  l index that hol
b120: 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76  ds all values ev
b130: 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20  ery previously. 
b140: 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20         ** added 
b150: 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20 2a 2f  to the queue. */
b160: 0a 20 20 20 20 20 20 20 20 61 64 64 72 54 65 73  .        addrTes
b170: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
b180: 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46  ddOp4Int(v, OP_F
b190: 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30  ound, iParm+1, 0
b1a0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
b1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1c0: 20 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65             regRe
b1d0: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
b1e0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
b1f0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
b200: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
b210: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
b220: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
b230: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
b240: 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  Col, r3);.      
b250: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44  if( eDest==SRT_D
b260: 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20  istQueue ){.    
b270: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b280: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
b290: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20  nsert, iParm+1, 
b2a0: 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r3);.        sql
b2b0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
b2c0: 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
b2d0: 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20  EKRESULT);.     
b2e0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
b2f0: 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a  ; i<nKey; i++){.
b300: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
b310: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
b320: 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20  SCopy,.         
b330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b340: 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f   regResult + pSO
b350: 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  ->a[i].u.x.iOrde
b360: 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20  rByCol - 1,.    
b370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b380: 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20        r2+i);.   
b390: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
b3a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b3b0: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61  OP_Sequence, iPa
b3c0: 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20  rm, r2+nKey);.  
b3d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b3e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
b3f0: 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79  Record, r2, nKey
b400: 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  +2, r1);.      s
b410: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
b420: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
b430: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
b440: 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20  r2, nKey+2);.   
b450: 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20     if( addrTest 
b460: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
b470: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73  pHere(v, addrTes
b480: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
b490: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
b4a0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
b4b0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
b4c0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
b4d0: 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a  e, r2, nKey+2);.
b4e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b4f0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
b500: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
b510: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
b520: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
b530: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
b540: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
b550: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
b560: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
b570: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
b580: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
b590: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
b5a0: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
b5b0: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
b5c0: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
b5d0: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
b5e0: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
b5f0: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
b600: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
b610: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
b620: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
b630: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
b640: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
b650: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
b660: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
b670: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b680: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
b690: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
b6a0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
b6b0: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
b6c0: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
b6d0: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
b6e0: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
b6f0: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
b700: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
b710: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
b720: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
b730: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  s..  */.  if( pS
b740: 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69  ort==0 && p->iLi
b750: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
b760: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
b770: 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
b780: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
b790: 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
b7a0: 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(v);.  }.}../*.
b7b0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65  ** Allocate a Ke
b7c0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66  yInfo object suf
b7d0: 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69  ficient for an i
b7e0: 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f  ndex of N key co
b7f0: 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65  lumns and.** X e
b800: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  xtra columns..*/
b810: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
b820: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71  3KeyInfoAlloc(sq
b830: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
b840: 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e 74 20  , int X){.  int 
b850: 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29 2a 28  nExtra = (N+X)*(
b860: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
b870: 2b 31 29 20 2d 20 73 69 7a 65 6f 66 28 43 6f 6c  +1) - sizeof(Col
b880: 6c 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49 6e 66  lSeq*);.  KeyInf
b890: 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62  o *p = sqlite3Db
b8a0: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
b8b0: 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
b8c0: 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28  + nExtra);.  if(
b8d0: 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f   p ){.    p->aSo
b8e0: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
b8f0: 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20  p->aColl[N+X];. 
b900: 20 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c 64 20     p->nKeyField 
b910: 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d  = (u16)N;.    p-
b920: 3e 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28 75 31  >nAllField = (u1
b930: 36 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70 2d 3e  6)(N+X);.    p->
b940: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
b950: 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20     p->db = db;. 
b960: 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a     p->nRef = 1;.
b970: 20 20 20 20 6d 65 6d 73 65 74 28 26 70 5b 31 5d      memset(&p[1]
b980: 2c 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20  , 0, nExtra);.  
b990: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
b9a0: 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a  e3OomFault(db);.
b9b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
b9c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63  }../*.** Dealloc
b9d0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62  ate a KeyInfo ob
b9e0: 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ject.*/.void sql
b9f0: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
ba00: 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20  (KeyInfo *p){.  
ba10: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  if( p ){.    ass
ba20: 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29  ert( p->nRef>0 )
ba30: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b  ;.    p->nRef--;
ba40: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66  .    if( p->nRef
ba50: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44 62 46  ==0 ) sqlite3DbF
ba60: 72 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70 29 3b  reeNN(p->db, p);
ba70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
ba80: 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  ke a new pointer
ba90: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62   to a KeyInfo ob
baa0: 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ject.*/.KeyInfo 
bab0: 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  *sqlite3KeyInfoR
bac0: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
bad0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
bae0: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
baf0: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b   );.    p->nRef+
bb00: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
bb10: 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  p;.}..#ifdef SQL
bb20: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
bb30: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
bb40: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
bb50: 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20  can be change.  
bb60: 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  The KeyInfo obje
bb70: 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62  ct.** can only b
bb80: 65 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 69  e changed if thi
bb90: 73 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67  s is just a sing
bba0: 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  le reference to 
bbb0: 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  the object..**.*
bbc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
bbd0: 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69  s used only insi
bbe0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
bbf0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
bc00: 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  t sqlite3KeyInfo
bc10: 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49  IsWriteable(KeyI
bc20: 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20  nfo *p){ return 
bc30: 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65  p->nRef==1; }.#e
bc40: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
bc50: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  EBUG */../*.** G
bc60: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
bc70: 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74  on list, generat
bc80: 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  e a KeyInfo stru
bc90: 63 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72  cture that recor
bca0: 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74  ds.** the collat
bcb0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
bcc0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
bcd0: 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73   in that express
bce0: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ion list..**.** 
bcf0: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
bd00: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  is an ORDER BY o
bd10: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
bd20: 65 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  e then the resul
bd30: 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20  ting.** KeyInfo 
bd40: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
bd50: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
bd60: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
bd70: 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20  ual index to.** 
bd80: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63  implement that c
bd90: 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45  lause.  If the E
bda0: 78 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72  xprList is the r
bdb0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
bdc0: 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68  ELECT.** then th
bdd0: 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  e KeyInfo struct
bde0: 75 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61  ure is appropria
bdf0: 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a  te for initializ
be00: 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a  ing a virtual.**
be10: 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d   index to implem
be20: 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74  ent a DISTINCT t
be30: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  est..**.** Space
be40: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79   to hold the Key
be50: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
be60: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
be70: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
be80: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
be90: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
bea0: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
beb0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
bec0: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
bed0: 66 72 65 65 64 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  freed..*/.KeyInf
bee0: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
bef0: 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  oFromExprList(. 
bf00: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
bf10: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
bf20: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
bf30: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
bf40: 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65 20 4b     /* Form the K
bf50: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 66 72  eyInfo object fr
bf60: 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69 73 74  om this ExprList
bf70: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
bf80: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65  ,          /* Be
bf90: 67 69 6e 20 77 69 74 68 20 74 68 69 73 20 63 6f  gin with this co
bfa0: 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20 2a 2f  lumn of pList */
bfb0: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 20 20  .  int nExtra   
bfc0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
bfd0: 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61 20 63  his many extra c
bfe0: 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 65 6e  olumns to the en
bff0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45  d */.){.  int nE
c000: 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  xpr;.  KeyInfo *
c010: 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  pInfo;.  struct 
c020: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
c030: 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
c040: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c050: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45  ;.  int i;..  nE
c060: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  xpr = pList->nEx
c070: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
c080: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
c090: 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53 74 61  c(db, nExpr-iSta
c0a0: 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b 0a 20  rt, nExtra+1);. 
c0b0: 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
c0c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c0d0: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
c0e0: 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20  ble(pInfo) );.  
c0f0: 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 2c 20    for(i=iStart, 
c100: 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2b 69  pItem=pList->a+i
c110: 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72 3b 20  Start; i<nExpr; 
c120: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
c130: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c       pInfo->aCol
c140: 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 73 71  l[i-iStart] = sq
c150: 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53  lite3ExprNNCollS
c160: 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
c170: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
c180: 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  pInfo->aSortOrde
c190: 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20 70 49  r[i-iStart] = pI
c1a0: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  tem->sortOrder;.
c1b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
c1c0: 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a  rn pInfo;.}../*.
c1d0: 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  ** Name of the c
c1e0: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74  onnection operat
c1f0: 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72  or, used for err
c200: 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a  or messages..*/.
c210: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
c220: 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  r *selectOpName(
c230: 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20  int id){.  char 
c240: 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64  *z;.  switch( id
c250: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
c260: 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  ALL:       z = "
c270: 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72  UNION ALL";   br
c280: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
c290: 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20  _INTERSECT: z = 
c2a0: 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62  "INTERSECT";   b
c2b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
c2c0: 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d  K_EXCEPT:    z =
c2d0: 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20   "EXCEPT";      
c2e0: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
c2f0: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20  lt:           z 
c300: 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20  = "UNION";      
c310: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
c320: 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64  turn z;.}..#ifnd
c330: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
c340: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c  XPLAIN./*.** Unl
c350: 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20  ess an "EXPLAIN 
c360: 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d  QUERY PLAN" comm
c370: 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f  and is being pro
c380: 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e  cessed, this fun
c390: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f  ction.** is a no
c3a0: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
c3b0: 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65  it adds a single
c3c0: 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74   row of output t
c3d0: 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74  o the EQP result
c3e0: 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63  ,.** where the c
c3f0: 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  aption is of the
c400: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22   form:.**.**   "
c410: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
c420: 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77  FOR xxx".**.** w
c430: 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20  here xxx is one 
c440: 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22  of "DISTINCT", "
c450: 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52  ORDER BY" or "GR
c460: 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79  OUP BY". Exactly
c470: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74   which.** is det
c480: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a  ermined by the z
c490: 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a  Usage argument..
c4a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
c4b0: 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
c4c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
c4d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67  onst char *zUsag
c4e0: 65 29 7b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65  e){.  ExplainQue
c4f0: 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
c500: 30 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54  0, "USE TEMP B-T
c510: 52 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73  REE FOR %s", zUs
c520: 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  age));.}../*.** 
c530: 41 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f  Assign expressio
c540: 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e  n b to lvalue a.
c550: 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70   A second, no-op
c560: 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69  , version of thi
c570: 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72  s macro.** is pr
c580: 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49  ovided when SQLI
c590: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
c5a0: 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73  is defined. This
c5b0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65   allows the code
c5c0: 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65  .** in sqlite3Se
c5d0: 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e  lect() to assign
c5e0: 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63   values to struc
c5f0: 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69  ture member vari
c600: 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e  ables that.** on
c610: 6c 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49  ly exist if SQLI
c620: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
c630: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77  is not defined w
c640: 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67  ithout polluting
c650: 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74   the.** code wit
c660: 68 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74  h #ifndef direct
c670: 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e  ives..*/.# defin
c680: 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65  e explainSetInte
c690: 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a  ger(a, b) a = b.
c6a0: 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20  .#else./* No-op 
c6b0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
c6c0: 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e  explainXXX() fun
c6d0: 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f  ctions and macro
c6e0: 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s. */.# define e
c6f0: 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
c700: 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78  y,z).# define ex
c710: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
c720: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  y,z).#endif.../*
c730: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72  .** If the inner
c740: 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61   loop was genera
c750: 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d  ted using a non-
c760: 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72  null pOrderBy ar
c770: 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20  gument,.** then 
c780: 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65  the results were
c790: 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72   placed in a sor
c7a0: 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20  ter.  After the 
c7b0: 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74  loop is terminat
c7c0: 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f  ed.** we need to
c7d0: 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20   run the sorter 
c7e0: 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72  and output the r
c7f0: 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c  esults.  The fol
c800: 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e  lowing.** routin
c810: 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  e generates the 
c820: 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64  code needed to d
c830: 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69  o that..*/.stati
c840: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53  c void generateS
c850: 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65  ortTail(.  Parse
c860: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
c870: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
c880: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
c890: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
c8a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
c8b0: 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53 6f  /.  SortCtx *pSo
c8c0: 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61  rt,   /* Informa
c8d0: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52 44 45  tion on the ORDE
c8e0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
c8f0: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20   int nColumn,   
c900: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c910: 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20  columns of data 
c920: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
c930: 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20  *pDest /* Write 
c940: 74 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c  the sorted resul
c950: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
c960: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
c970: 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20 20 20  ->pVdbe;        
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c990: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
c9a0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
c9b0: 61 64 64 72 42 72 65 61 6b 20 3d 20 70 53 6f 72  addrBreak = pSor
c9c0: 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20  t->labelDone;   
c9d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
c9e0: 20 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f   here to exit lo
c9f0: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
ca00: 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
ca10: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
ca20: 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  v);  /* Jump her
ca30: 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65  e for next cycle
ca40: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20   */.  int addr; 
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca60: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
ca70: 6f 75 74 70 75 74 20 6c 6f 6f 70 2e 20 4a 75 6d  output loop. Jum
ca80: 70 20 66 6f 72 20 4e 65 78 74 2e 20 2a 2f 0a 20  p for Next. */. 
ca90: 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20 3d 20   int addrOnce = 
caa0: 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
cab0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
cac0: 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70 4f 72  rBy = pSort->pOr
cad0: 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65 44 65  derBy;.  int eDe
cae0: 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73  st = pDest->eDes
caf0: 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d  t;.  int iParm =
cb00: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b   pDest->iSDParm;
cb10: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20  .  int regRow;. 
cb20: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 20   int regRowid;. 
cb30: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74   int iCol;.  int
cb40: 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20   nKey;          
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cb60: 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20 63 6f  Number of key co
cb70: 6c 75 6d 6e 73 20 69 6e 20 73 6f 72 74 65 72 20  lumns in sorter 
cb80: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
cb90: 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20 20 20  iSortTab;       
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
cbb0: 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74 6f 20  orter cursor to 
cbc0: 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
cbd0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53 65 71  nt i;.  int bSeq
cbe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cbf0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
cc00: 69 66 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  if sorter record
cc10: 20 69 6e 63 6c 75 64 65 73 20 73 65 71 2e 20 6e   includes seq. n
cc20: 6f 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  o. */.  int nRef
cc30: 4b 65 79 20 3d 20 30 3b 0a 20 20 73 74 72 75 63  Key = 0;.  struc
cc40: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
cc50: 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70 45 4c  *aOutEx = p->pEL
cc60: 69 73 74 2d 3e 61 3b 0a 0a 20 20 61 73 73 65 72  ist->a;..  asser
cc70: 74 28 20 61 64 64 72 42 72 65 61 6b 3c 30 20 29  t( addrBreak<0 )
cc80: 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6c  ;.  if( pSort->l
cc90: 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20 20 20  abelBkOut ){.   
cca0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ccb0: 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
ccc0: 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e  pSort->regReturn
ccd0: 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b  , pSort->labelBk
cce0: 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
ccf0: 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64  3VdbeGoto(v, add
cd00: 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73 71 6c  rBreak);.    sql
cd10: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
cd20: 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d 3e 6c  abel(v, pSort->l
cd30: 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 7d 0a  abelBkOut);.  }.
cd40: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
cd50: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
cd60: 45 52 45 4e 43 45 53 0a 20 20 2f 2a 20 4f 70 65  ERENCES.  /* Ope
cd70: 6e 20 61 6e 79 20 63 75 72 73 6f 72 73 20 6e 65  n any cursors ne
cd80: 65 64 65 64 20 66 6f 72 20 73 6f 72 74 65 72 2d  eded for sorter-
cd90: 72 65 66 65 72 65 6e 63 65 20 65 78 70 72 65 73  reference expres
cda0: 73 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 69  sions */.  for(i
cdb0: 3d 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e 44 65  =0; i<pSort->nDe
cdc0: 66 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  fer; i++){.    T
cdd0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 6f  able *pTab = pSo
cde0: 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 70 54  rt->aDefer[i].pT
cdf0: 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 44 62 20  ab;.    int iDb 
ce00: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
ce10: 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
ce20: 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
ce30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70  );.    sqlite3Op
ce40: 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  enTable(pParse, 
ce50: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d  pSort->aDefer[i]
ce60: 2e 69 43 73 72 2c 20 69 44 62 2c 20 70 54 61 62  .iCsr, iDb, pTab
ce70: 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a  , OP_OpenRead);.
ce80: 20 20 20 20 6e 52 65 66 4b 65 79 20 3d 20 4d 41      nRefKey = MA
ce90: 58 28 6e 52 65 66 4b 65 79 2c 20 70 53 6f 72 74  X(nRefKey, pSort
cea0: 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e 4b 65 79  ->aDefer[i].nKey
ceb0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
cec0: 20 69 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 69   iTab = pSort->i
ced0: 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 65  ECursor;.  if( e
cee0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
cef0: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
cf00: 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44 65 73  oroutine || eDes
cf10: 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a 20 20  t==SRT_Mem ){.  
cf20: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a    regRowid = 0;.
cf30: 20 20 20 20 72 65 67 52 6f 77 20 3d 20 70 44 65      regRow = pDe
cf40: 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 7d 65 6c  st->iSdst;.  }el
cf50: 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64  se{.    regRowid
cf60: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
cf70: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
cf80: 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74    regRow = sqlit
cf90: 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
cfa0: 50 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  Parse, nColumn);
cfb0: 0a 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20 70 4f  .  }.  nKey = pO
cfc0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 2d 20  rderBy->nExpr - 
cfd0: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
cfe0: 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72 74   if( pSort->sort
cff0: 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47  Flags & SORTFLAG
d000: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
d010: 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74    int regSortOut
d020: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
d030: 6d 3b 0a 20 20 20 20 69 53 6f 72 74 54 61 62 20  m;.    iSortTab 
d040: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
d050: 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d  ;.    if( pSort-
d060: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20  >labelBkOut ){. 
d070: 20 20 20 20 20 61 64 64 72 4f 6e 63 65 20 3d 20       addrOnce = 
d080: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d090: 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
d0a0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
d0b0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
d0c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
d0d0: 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 53  P_OpenPseudo, iS
d0e0: 6f 72 74 54 61 62 2c 20 72 65 67 53 6f 72 74 4f  ortTab, regSortO
d0f0: 75 74 2c 20 0a 20 20 20 20 20 20 20 20 6e 4b 65  ut, .        nKe
d100: 79 2b 31 2b 6e 43 6f 6c 75 6d 6e 2b 6e 52 65 66  y+1+nColumn+nRef
d110: 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 61 64  Key);.    if( ad
d120: 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74 65 33  drOnce ) sqlite3
d130: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
d140: 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20 20 61  addrOnce);.    a
d150: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
d160: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d170: 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54  P_SorterSort, iT
d180: 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  ab, addrBreak);.
d190: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
d1a0: 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  (v);.    codeOff
d1b0: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
d1c0: 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  t, addrContinue)
d1d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d1e0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f  eAddOp3(v, OP_So
d1f0: 72 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20  rterData, iTab, 
d200: 72 65 67 53 6f 72 74 4f 75 74 2c 20 69 53 6f 72  regSortOut, iSor
d210: 74 54 61 62 29 3b 0a 20 20 20 20 62 53 65 71 20  tTab);.    bSeq 
d220: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
d230: 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c    addr = 1 + sql
d240: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d250: 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c  , OP_Sort, iTab,
d260: 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62   addrBreak); Vdb
d270: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
d280: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
d290: 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72  p->iOffset, addr
d2a0: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 69  Continue);.    i
d2b0: 53 6f 72 74 54 61 62 20 3d 20 69 54 61 62 3b 0a  SortTab = iTab;.
d2c0: 20 20 20 20 62 53 65 71 20 3d 20 31 3b 0a 20 20      bSeq = 1;.  
d2d0: 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 69 43 6f  }.  for(i=0, iCo
d2e0: 6c 3d 6e 4b 65 79 2b 62 53 65 71 2d 31 3b 20 69  l=nKey+bSeq-1; i
d2f0: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
d300: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d310: 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45  ABLE_SORTER_REFE
d320: 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28 20 61  RENCES.    if( a
d330: 4f 75 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65 72  OutEx[i].bSorter
d340: 52 65 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Ref ) continue;.
d350: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 61  #endif.    if( a
d360: 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72  OutEx[i].u.x.iOr
d370: 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 69 43  derByCol==0 ) iC
d380: 6f 6c 2b 2b 3b 0a 20 20 7d 0a 23 69 66 64 65 66  ol++;.  }.#ifdef
d390: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
d3a0: 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53  ORTER_REFERENCES
d3b0: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 6e 44  .  if( pSort->nD
d3c0: 65 66 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  efer ){.    int 
d3d0: 69 4b 65 79 20 3d 20 69 43 6f 6c 2b 31 3b 0a 20  iKey = iCol+1;. 
d3e0: 20 20 20 69 6e 74 20 72 65 67 4b 65 79 20 3d 20     int regKey = 
d3f0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
d400: 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 52 65 66  nge(pParse, nRef
d410: 4b 65 79 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  Key);..    for(i
d420: 3d 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e 44 65  =0; i<pSort->nDe
d430: 66 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  fer; i++){.     
d440: 20 69 6e 74 20 69 43 73 72 20 3d 20 70 53 6f 72   int iCsr = pSor
d450: 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 69 43 73  t->aDefer[i].iCs
d460: 72 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  r;.      Table *
d470: 70 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e 61 44  pTab = pSort->aD
d480: 65 66 65 72 5b 69 5d 2e 70 54 61 62 3b 0a 20 20  efer[i].pTab;.  
d490: 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70      int nKey = p
d4a0: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e  Sort->aDefer[i].
d4b0: 6e 4b 65 79 3b 0a 0a 20 20 20 20 20 20 73 71 6c  nKey;..      sql
d4c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
d4d0: 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43  , OP_NullRow, iC
d4e0: 73 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 48  sr);.      if( H
d4f0: 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b  asRowid(pTab) ){
d500: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d510: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
d520: 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74 54 61  _Column, iSortTa
d530: 62 2c 20 69 4b 65 79 2b 2b 2c 20 72 65 67 4b 65  b, iKey++, regKe
d540: 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  y);.        sqli
d550: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d560: 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c 20 69   OP_SeekRowid, i
d570: 43 73 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Csr, .          
d580: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72    sqlite3VdbeCur
d590: 72 65 6e 74 41 64 64 72 28 76 29 2b 31 2c 20 72  rentAddr(v)+1, r
d5a0: 65 67 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 65  egKey);.      }e
d5b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
d5c0: 20 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   k;.        int 
d5d0: 69 4a 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73  iJmp;.        as
d5e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 72 69  sert( sqlite3Pri
d5f0: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
d600: 62 29 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e 4b 65  b)->nKeyCol==nKe
d610: 79 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  y );.        for
d620: 28 6b 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20 6b 2b  (k=0; k<nKey; k+
d630: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
d640: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d650: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
d660: 6f 72 74 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20  ortTab, iKey++, 
d670: 72 65 67 4b 65 79 2b 6b 29 3b 0a 20 20 20 20 20  regKey+k);.     
d680: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 4a 6d     }.        iJm
d690: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
d6a0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
d6b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d6c0: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
d6d0: 50 5f 53 65 65 6b 47 45 2c 20 69 43 73 72 2c 20  P_SeekGE, iCsr, 
d6e0: 69 4a 6d 70 2b 32 2c 20 72 65 67 4b 65 79 2c 20  iJmp+2, regKey, 
d6f0: 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 73  nKey);.        s
d700: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
d710: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 4c 45 2c  Int(v, OP_IdxLE,
d720: 20 69 43 73 72 2c 20 69 4a 6d 70 2b 33 2c 20 72   iCsr, iJmp+3, r
d730: 65 67 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20  egKey, nKey);.  
d740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d750: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75  eAddOp1(v, OP_Nu
d760: 6c 6c 52 6f 77 2c 20 69 43 73 72 29 3b 0a 20 20  llRow, iCsr);.  
d770: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
d780: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
d790: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
d7a0: 72 65 67 4b 65 79 2c 20 6e 52 65 66 4b 65 79 29  regKey, nRefKey)
d7b0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66  ;.  }.#endif.  f
d7c0: 6f 72 28 69 3d 6e 43 6f 6c 75 6d 6e 2d 31 3b 20  or(i=nColumn-1; 
d7d0: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 23 69 66 64  i>=0; i--){.#ifd
d7e0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d7f0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
d800: 45 53 0a 20 20 20 20 69 66 28 20 61 4f 75 74 45  ES.    if( aOutE
d810: 78 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65 66 20  x[i].bSorterRef 
d820: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
d830: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
d840: 20 61 4f 75 74 45 78 5b 69 5d 2e 70 45 78 70 72   aOutEx[i].pExpr
d850: 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20  , regRow+i);.   
d860: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
d870: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 52    {.      int iR
d880: 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28 20 61  ead;.      if( a
d890: 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72  OutEx[i].u.x.iOr
d8a0: 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20 20  derByCol ){.    
d8b0: 20 20 20 20 69 52 65 61 64 20 3d 20 61 4f 75 74      iRead = aOut
d8c0: 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  Ex[i].u.x.iOrder
d8d0: 42 79 43 6f 6c 2d 31 3b 0a 20 20 20 20 20 20 7d  ByCol-1;.      }
d8e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 52  else{.        iR
d8f0: 65 61 64 20 3d 20 69 43 6f 6c 2d 2d 3b 0a 20 20  ead = iCol--;.  
d900: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
d910: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d920: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72   OP_Column, iSor
d930: 74 54 61 62 2c 20 69 52 65 61 64 2c 20 72 65 67  tTab, iRead, reg
d940: 52 6f 77 2b 69 29 3b 0a 20 20 20 20 20 20 56 64  Row+i);.      Vd
d950: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
d960: 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e  s", aOutEx[i].zN
d970: 61 6d 65 3f 61 4f 75 74 45 78 5b 69 5d 2e 7a 4e  ame?aOutEx[i].zN
d980: 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69 5d 2e  ame : aOutEx[i].
d990: 7a 53 70 61 6e 29 29 3b 0a 20 20 20 20 7d 0a 20  zSpan));.    }. 
d9a0: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44 65   }.  switch( eDe
d9b0: 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  st ){.    case S
d9c0: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
d9d0: 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
d9e0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
d9f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
da00: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d  _NewRowid, iParm
da10: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
da20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
da30: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
da40: 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77  t, iParm, regRow
da50: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
da60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
da70: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
da80: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20  _APPEND);.      
da90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
daa0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
dab0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
dac0: 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
dad0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c      assert( nCol
dae0: 75 6d 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  umn==sqlite3Strl
daf0: 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41 66 66  en30(pDest->zAff
db00: 53 64 73 74 29 20 29 3b 0a 20 20 20 20 20 20 73  Sdst) );.      s
db10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
db20: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
db30: 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75  d, regRow, nColu
db40: 6d 6e 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20  mn, regRowid,.  
db50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db60: 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a 41 66        pDest->zAf
db70: 66 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  fSdst, nColumn);
db80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
db90: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
dba0: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
dbb0: 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  gRow, nColumn);.
dbc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dbd0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
dbe0: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
dbf0: 6d 2c 20 72 65 67 52 6f 77 69 64 2c 20 72 65 67  m, regRowid, reg
dc00: 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Row, nColumn);. 
dc10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dc20: 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d  }.    case SRT_M
dc30: 65 6d 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  em: {.      /* T
dc40: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
dc50: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
dc60: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
dc70: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
dc80: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
dc90: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
dca0: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
dcb0: 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44  SRT_Output || eD
dcc0: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
dcd0: 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74 65 73  ne ); .      tes
dce0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
dcf0: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
dd00: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
dd10: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
dd20: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44   );.      if( eD
dd30: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
dd40: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
dd50: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
dd60: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44  OP_ResultRow, pD
dd70: 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c  est->iSdst, nCol
dd80: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71  umn);.        sq
dd90: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
dda0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
ddb0: 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53 64 73  rse, pDest->iSds
ddc0: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
ddd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dde0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ddf0: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
de00: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29   pDest->iSDParm)
de10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
de20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
de30: 0a 20 20 69 66 28 20 72 65 67 52 6f 77 69 64 20  .  if( regRowid 
de40: 29 7b 0a 20 20 20 20 69 66 28 20 65 44 65 73 74  ){.    if( eDest
de50: 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a 20 20 20  ==SRT_Set ){.   
de60: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
de70: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
de80: 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75  e, regRow, nColu
de90: 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  mn);.    }else{.
dea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
deb0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
dec0: 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20  se, regRow);.   
ded0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65   }.    sqlite3Re
dee0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
def0: 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  rse, regRowid);.
df00: 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74    }.  /* The bot
df10: 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  tom of the loop.
df20: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
df30: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
df40: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
df50: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f  .  if( pSort->so
df60: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
df70: 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  AG_UseSorter ){.
df80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
df90: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
dfa0: 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  erNext, iTab, ad
dfb0: 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  dr); VdbeCoverag
dfc0: 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  e(v);.  }else{. 
dfd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dfe0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
dff0: 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64   iTab, addr); Vd
e000: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
e010: 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e   }.  if( pSort->
e020: 72 65 67 52 65 74 75 72 6e 20 29 20 73 71 6c 69  regReturn ) sqli
e030: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
e040: 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53 6f 72   OP_Return, pSor
e050: 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20  t->regReturn);. 
e060: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
e070: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
e080: 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Break);.}../*.**
e090: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
e0a0: 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f  r to a string co
e0b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65  ntaining the 'de
e0c0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20  claration type' 
e0d0: 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  of the.** expres
e0e0: 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20  sion pExpr. The 
e0f0: 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72  string may be tr
e100: 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20  eated as static 
e110: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
e120: 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f  *.** Also try to
e130: 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 73 69   estimate the si
e140: 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  ze of the return
e150: 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74  ed value and ret
e160: 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75  urn that.** resu
e170: 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68  lt in *pEstWidth
e180: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c  ..**.** The decl
e190: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20  aration type is 
e1a0: 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79  the exact dataty
e1b0: 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78  pe definition ex
e1c0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
e1d0: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45  .** original CRE
e1e0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
e1f0: 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ent if the expre
e200: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
e210: 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72  n. The.** declar
e220: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
e230: 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20   ROWID field is 
e240: 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79  INTEGER. Exactly
e250: 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73   when an express
e260: 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  ion.** is consid
e270: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61  ered a column ca
e280: 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20  n be complex in 
e290: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
e2a0: 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a  subqueries. The.
e2b0: 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  ** result-set ex
e2c0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20  pression in all 
e2d0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
e2e0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
e2f0: 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64  ts is .** consid
e300: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79  ered a column by
e310: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
e320: 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
e330: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
e340: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
e350: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
e360: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
e370: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29  CT col FROM tbl)
e380: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62  ;.**   SELECT ab
e390: 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63  c FROM (SELECT c
e3a0: 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74  ol AS abc FROM t
e3b0: 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  bl);.** .** The 
e3c0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
e3d0: 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73   for any express
e3e0: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ion other than a
e3f0: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e   column is NULL.
e400: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
e410: 69 6e 65 20 68 61 73 20 65 69 74 68 65 72 20 33  ine has either 3
e420: 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72 73   or 6 parameters
e430: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
e440: 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
e450: 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
e460: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
e470: 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  A compile-time o
e480: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a  ption is used..*
e490: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
e4a0: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
e4b0: 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20  TADATA.# define 
e4c0: 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43  columnType(A,B,C
e4d0: 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65  ,D,E) columnType
e4e0: 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 29 0a  Impl(A,B,C,D,E).
e4f0: 23 65 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66  #else /* if !def
e500: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
e510: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
e520: 54 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  TA) */.# define 
e530: 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43  columnType(A,B,C
e540: 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79 70 65  ,D,E) columnType
e550: 49 6d 70 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66  Impl(A,B).#endif
e560: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
e570: 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ar *columnTypeIm
e580: 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  pl(.  NameContex
e590: 74 20 2a 70 4e 43 2c 20 0a 23 69 66 6e 64 65 66  t *pNC, .#ifndef
e5a0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
e5b0: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
e5c0: 20 45 78 70 72 20 2a 70 45 78 70 72 0a 23 65 6c   Expr *pExpr.#el
e5d0: 73 65 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  se.  Expr *pExpr
e5e0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e5f0: 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e  *pzOrigDb,.  con
e600: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
e610: 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Tab,.  const cha
e620: 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 0a 23 65  r **pzOrigCol.#e
e630: 6e 64 69 66 0a 29 7b 0a 20 20 63 68 61 72 20 63  ndif.){.  char c
e640: 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b  onst *zType = 0;
e650: 0a 20 20 69 6e 74 20 6a 3b 0a 23 69 66 64 65 66  .  int j;.#ifdef
e660: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
e670: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
e680: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
e690: 69 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72  igDb = 0;.  char
e6a0: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62   const *zOrigTab
e6b0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
e6c0: 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  st *zOrigCol = 0
e6d0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
e6e0: 72 74 28 20 70 45 78 70 72 21 3d 30 20 29 3b 0a  rt( pExpr!=0 );.
e6f0: 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 70    assert( pNC->p
e700: 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  SrcList!=0 );.  
e710: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
e720: 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p!=TK_AGG_COLUMN
e730: 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 72 6f 75   );  /* This rou
e740: 74 69 6e 65 20 72 75 6e 65 73 20 62 65 66 6f 72  tine runes befor
e750: 65 20 61 67 67 72 65 67 61 74 65 73 0a 20 20 20  e aggregates.   
e760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e780: 20 20 20 20 2a 2a 20 61 72 65 20 70 72 6f 63 65      ** are proce
e790: 73 73 65 64 20 2a 2f 0a 20 20 73 77 69 74 63 68  ssed */.  switch
e7a0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
e7b0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
e7c0: 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  N: {.      /* Th
e7d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
e7e0: 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65  a column. Locate
e7f0: 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63   the table the c
e800: 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20  olumn is being. 
e810: 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65       ** extracte
e820: 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f  d from in NameCo
e830: 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20  ntext.pSrcList. 
e840: 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62  This table may b
e850: 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20  e real.      ** 
e860: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f  database table o
e870: 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20  r a subquery..  
e880: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62      */.      Tab
e890: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20  le *pTab = 0;   
e8a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
e8b0: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75  e structure colu
e8c0: 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20  mn is extracted 
e8d0: 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65  from */.      Se
e8e0: 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20  lect *pS = 0;   
e8f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c            /* Sel
e900: 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ect the column i
e910: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
e920: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43   */.      int iC
e930: 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
e940: 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f  umn;  /* Index o
e950: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62  f column in pTab
e960: 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
e970: 20 70 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b   pNC && !pTab ){
e980: 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69 73 74  .        SrcList
e990: 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43   *pTabList = pNC
e9a0: 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20  ->pSrcList;.    
e9b0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54      for(j=0;j<pT
e9c0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20  abList->nSrc && 
e9d0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
e9e0: 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69  Cursor!=pExpr->i
e9f0: 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20  Table;j++);.    
ea00: 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69      if( j<pTabLi
ea10: 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20  st->nSrc ){.    
ea20: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61        pTab = pTa
ea30: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62  bList->a[j].pTab
ea40: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 20 3d  ;.          pS =
ea50: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
ea60: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  pSelect;.       
ea70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ea80: 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65    pNC = pNC->pNe
ea90: 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  xt;.        }.  
eaa0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
eab0: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
eac0: 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69      /* At one ti
ead0: 6d 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73  me, code such as
eae0: 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20   "SELECT new.x" 
eaf0: 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65 72  within a trigger
eb00: 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a   would.        *
eb10: 2a 20 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e  * cause this con
eb20: 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20  dition to run.  
eb30: 53 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68  Since then, we h
eb40: 61 76 65 20 72 65 73 74 72 75 63 74 75 72 65 64  ave restructured
eb50: 20 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20   how.        ** 
eb60: 74 72 69 67 67 65 72 20 63 6f 64 65 20 69 73 20  trigger code is 
eb70: 67 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f  generated and so
eb80: 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   this condition 
eb90: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20  is no longer .  
eba0: 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c        ** possibl
ebb0: 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63  e. However, it c
ebc0: 61 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65  an still be true
ebd0: 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20   for statements 
ebe0: 6c 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  like.        ** 
ebf0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20  the following:. 
ec00: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
ec10: 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41    **   CREATE TA
ec20: 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47  BLE t1(col INTEG
ec30: 45 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20  ER);.        ** 
ec40: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
ec50: 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52   t1.col) FROM FR
ec60: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a  OM t1;.        *
ec70: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65  *.        ** whe
ec80: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
ec90: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
eca0: 65 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63  expression "t1.c
ecb0: 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20  ol" in the .    
ecc0: 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63      ** sub-selec
ecd0: 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  t. In this case,
ece0: 20 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20   set the column 
ecf0: 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76  type to NULL, ev
ed00: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  en.        ** th
ed10: 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72  ough it should r
ed20: 65 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45  eally be "INTEGE
ed30: 52 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  R"..        **. 
ed40: 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69         ** This i
ed50: 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c  s not a problem,
ed60: 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74   as the column t
ed70: 79 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20  ype of "t1.col" 
ed80: 69 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20  is never.       
ed90: 20 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63   ** used. When c
eda0: 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63  olumnType() is c
edb0: 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70  alled on the exp
edc0: 72 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20  ression .       
edd0: 20 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e   ** "(SELECT t1.
ede0: 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65  col)", the corre
edf0: 63 74 20 74 79 70 65 20 69 73 20 72 65 74 75 72  ct type is retur
ee00: 6e 65 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f  ned (see the TK_
ee10: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a  SELECT.        *
ee20: 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20  * branch below. 
ee30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
ee40: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
ee50: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26    assert( pTab &
ee60: 26 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70  & pExpr->pTab==p
ee70: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Tab );.      if(
ee80: 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   pS ){.        /
ee90: 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20 69 73  * The "table" is
eea0: 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d   actually a sub-
eeb0: 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77  select or a view
eec0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
eed0: 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  use.        ** o
eee0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
eef0: 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74  tement. Return t
ef00: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
ef10: 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20  ype and origin. 
ef20: 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66         ** data f
ef30: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  or the result-se
ef40: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
ef50: 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20  sub-select..    
ef60: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
ef70: 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  f( iCol>=0 && iC
ef80: 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<pS->pEList->n
ef90: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
efa0: 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20    /* If iCol is 
efb0: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
efc0: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
efd0: 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65  ion requests the
efe0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  .          ** ro
eff0: 77 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73  wid of the sub-s
f000: 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54  elect or view. T
f010: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
f020: 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20  s legal (see .  
f030: 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20          ** test 
f040: 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20  case misc2.2.2) 
f050: 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c  - it always eval
f060: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20  uates to NULL.. 
f070: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
f080: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
f090: 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  t sNC;.         
f0a0: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
f0b0: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70  EList->a[iCol].p
f0c0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
f0d0: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70  sNC.pSrcList = p
f0e0: 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20  S->pSrc;.       
f0f0: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
f100: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  NC;.          sN
f110: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
f120: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20  pParse;.        
f130: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
f140: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f  Type(&sNC, p,&zO
f150: 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c  rigDb,&zOrigTab,
f160: 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20 20 20  &zOrigCol); .   
f170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
f180: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  se{.        /* A
f190: 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 61   real table or a
f1a0: 20 43 54 45 20 74 61 62 6c 65 20 2a 2f 0a 20 20   CTE table */.  
f1b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
f1c0: 53 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  S );.#ifdef SQLI
f1d0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
f1e0: 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20 20  _METADATA.      
f1f0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69    if( iCol<0 ) i
f200: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
f210: 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  y;.        asser
f220: 74 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49  t( iCol==XN_ROWI
f230: 44 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  D || (iCol>=0 &&
f240: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
f250: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ) );.        if(
f260: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
f270: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
f280: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
f290: 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f    zOrigCol = "ro
f2a0: 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65  wid";.        }e
f2b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
f2c0: 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  OrigCol = pTab->
f2d0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
f2e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  ;.          zTyp
f2f0: 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  e = sqlite3Colum
f300: 6e 54 79 70 65 28 26 70 54 61 62 2d 3e 61 43 6f  nType(&pTab->aCo
f310: 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20 20 20  l[iCol],0);.    
f320: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f      }.        zO
f330: 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a  rigTab = pTab->z
f340: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
f350: 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 26 26  ( pNC->pParse &&
f360: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29   pTab->pSchema )
f370: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
f380: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
f390: 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e  emaToIndex(pNC->
f3a0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
f3b0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
f3c0: 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20        zOrigDb = 
f3d0: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d  pNC->pParse->db-
f3e0: 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61  >aDb[iDb].zDbSNa
f3f0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  me;.        }.#e
f400: 6c 73 65 0a 20 20 20 20 20 20 20 20 61 73 73 65  lse.        asse
f410: 72 74 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57  rt( iCol==XN_ROW
f420: 49 44 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  ID || (iCol>=0 &
f430: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
f440: 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  l) );.        if
f450: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
f460: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
f470: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20  NTEGER";.       
f480: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f490: 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65    zType = sqlite
f4a0: 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70 54 61  3ColumnType(&pTa
f4b0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29  b->aCol[iCol],0)
f4c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
f4d0: 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
f4e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
f4f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f500: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
f510: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
f520: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
f530: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73 75  pression is a su
f540: 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72 6e  b-select. Return
f550: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
f560: 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20 20   type and.      
f570: 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66  ** origin info f
f580: 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63 6f  or the single co
f590: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
f5a0: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
f5b0: 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73 74  LECT.      ** st
f5c0: 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a  atement..      *
f5d0: 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74  /.      NameCont
f5e0: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 53  ext sNC;.      S
f5f0: 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78 70  elect *pS = pExp
f600: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->x.pSelect;.  
f610: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
f620: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
f630: 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
f640: 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  rt( ExprHasPrope
f650: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
f660: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
f670: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
f680: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
f690: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
f6a0: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72  ;.      sNC.pPar
f6b0: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
f6c0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  ;.      zType = 
f6d0: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
f6e0: 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a   p, &zOrigDb, &z
f6f0: 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43  OrigTab, &zOrigC
f700: 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  ol); .      brea
f710: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
f720: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
f730: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
f740: 5f 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69 66  _METADATA  .  if
f750: 28 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20  ( pzOrigDb ){.  
f760: 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67    assert( pzOrig
f770: 54 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c  Tab && pzOrigCol
f780: 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44   );.    *pzOrigD
f790: 62 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20  b = zOrigDb;.   
f7a0: 20 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f   *pzOrigTab = zO
f7b0: 72 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f  rigTab;.    *pzO
f7c0: 72 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f  rigCol = zOrigCo
f7d0: 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  l;.  }.#endif.  
f7e0: 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a  return zType;.}.
f7f0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
f800: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
f810: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
f820: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
f830: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
f840: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
f850: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  et..*/.static vo
f860: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
f870: 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20  nTypes(.  Parse 
f880: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
f890: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
f8a0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
f8b0: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
f8c0: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
f8d0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
f8e0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
f8f0: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
f900: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
f910: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f920: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20  OMIT_DECLTYPE.  
f930: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
f940: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
f950: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
f960: 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  sNC;.  sNC.pSrcL
f970: 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
f980: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
f990: 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 4e 65  Parse;.  sNC.pNe
f9a0: 78 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  xt = 0;.  for(i=
f9b0: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
f9c0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
f9d0: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
f9e0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
f9f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
fa00: 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
fa10: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
fa20: 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73  ETADATA.    cons
fa30: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20  t char *zOrigDb 
fa40: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
fa50: 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  har *zOrigTab = 
fa60: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
fa70: 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  r *zOrigCol = 0;
fa80: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
fa90: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
faa0: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
fab0: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 29  gTab, &zOrigCol)
fac0: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64  ;..    /* The vd
fad0: 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73  be must make its
fae0: 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65   own copy of the
faf0: 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64   column-type and
fb00: 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63   other .    ** c
fb10: 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73  olumn specific s
fb20: 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20  trings, in case 
fb30: 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65  the schema is re
fb40: 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a  set before this.
fb50: 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d      ** virtual m
fb60: 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65  achine is delete
fb70: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
fb80: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
fb90: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
fba0: 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69  E_DATABASE, zOri
fbb0: 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  gDb, SQLITE_TRAN
fbc0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
fbd0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
fbe0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
fbf0: 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c  TABLE, zOrigTab,
fc00: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
fc10: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
fc20: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
fc30: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55   i, COLNAME_COLU
fc40: 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51  MN, zOrigCol, SQ
fc50: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
fc60: 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65  .#else.    zType
fc70: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
fc80: 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b  NC, p, 0, 0, 0);
fc90: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
fca0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
fcb0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
fcc0: 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c  DECLTYPE, zType,
fcd0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
fce0: 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  T);.  }.#endif /
fcf0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
fd00: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 29  E_OMIT_DECLTYPE)
fd10: 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.}.../*.** Co
fd20: 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e  mpute the column
fd30: 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 53 45 4c   names for a SEL
fd40: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
fd50: 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 67 75  *.** The only gu
fd60: 61 72 61 6e 74 65 65 20 74 68 61 74 20 53 51 4c  arantee that SQL
fd70: 69 74 65 20 6d 61 6b 65 73 20 61 62 6f 75 74 20  ite makes about 
fd80: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 73 20  column names is 
fd90: 74 68 61 74 20 69 66 20 74 68 65 0a 2a 2a 20 63  that if the.** c
fda0: 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20 41 53 20  olumn has an AS 
fdb0: 63 6c 61 75 73 65 20 61 73 73 69 67 6e 69 6e 67  clause assigning
fdc0: 20 69 74 20 61 20 6e 61 6d 65 2c 20 74 68 61 74   it a name, that
fdd0: 20 77 69 6c 6c 20 62 65 20 74 68 65 20 6e 61 6d   will be the nam
fde0: 65 20 75 73 65 64 2e 0a 2a 2a 20 54 68 61 74 20  e used..** That 
fdf0: 69 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f 63 75  is the only docu
fe00: 6d 65 6e 74 65 64 20 67 75 61 72 61 6e 74 65 65  mented guarantee
fe10: 2e 20 20 48 6f 77 65 76 65 72 2c 20 63 6f 75 6e  .  However, coun
fe20: 74 6c 65 73 73 20 61 70 70 6c 69 63 61 74 69 6f  tless applicatio
fe30: 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f 70 65 64 20  ns.** developed 
fe40: 6f 76 65 72 20 74 68 65 20 79 65 61 72 73 20 68  over the years h
fe50: 61 76 65 20 6d 61 64 65 20 62 61 73 65 6c 65 73  ave made baseles
fe60: 73 20 61 73 73 75 6d 70 74 69 6f 6e 73 20 61 62  s assumptions ab
fe70: 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  out column names
fe80: 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c 20 62 72 65  .** and will bre
fe90: 61 6b 20 69 66 20 74 68 6f 73 65 20 61 73 73 75  ak if those assu
fea0: 6d 70 74 69 6f 6e 73 20 63 68 61 6e 67 65 73 2e  mptions changes.
feb0: 20 20 48 65 6e 63 65 2c 20 75 73 65 20 65 78 74    Hence, use ext
fec0: 72 65 6d 65 20 63 61 75 74 69 6f 6e 0a 2a 2a 20  reme caution.** 
fed0: 77 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74  when modifying t
fee0: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 61  his routine to a
fef0: 76 6f 69 64 20 62 72 65 61 6b 69 6e 67 20 6c 65  void breaking le
ff00: 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  gacy..**.** See 
ff10: 41 6c 73 6f 3a 20 73 71 6c 69 74 65 33 43 6f 6c  Also: sqlite3Col
ff20: 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
ff30: 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 52 41  ().**.** The PRA
ff40: 47 4d 41 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e  GMA short_column
ff50: 5f 6e 61 6d 65 73 20 61 6e 64 20 50 52 41 47 4d  _names and PRAGM
ff60: 41 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61  A full_column_na
ff70: 6d 65 73 20 73 65 74 74 69 6e 67 73 20 61 72 65  mes settings are
ff80: 0a 2a 2a 20 64 65 70 72 65 63 61 74 65 64 2e 20  .** deprecated. 
ff90: 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 65 74   The default set
ffa0: 74 69 6e 67 20 69 73 20 73 68 6f 72 74 3d 4f 4e  ting is short=ON
ffb0: 2c 20 66 75 6c 6c 3d 4f 46 46 2e 20 20 39 39 2e  , full=OFF.  99.
ffc0: 39 25 20 6f 66 20 61 6c 6c 0a 2a 2a 20 61 70 70  9% of all.** app
ffd0: 6c 69 63 61 74 69 6f 6e 73 20 73 68 6f 75 6c 64  lications should
ffe0: 20 6f 70 65 72 61 74 65 20 74 68 69 73 20 77 61   operate this wa
fff0: 79 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  y.  Nevertheless
10000 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 73 75 70  , we need to sup
10010 70 6f 72 74 20 74 68 65 0a 2a 2a 20 6f 74 68 65  port the.** othe
10020 72 20 6d 6f 64 65 73 20 66 6f 72 20 6c 65 67 61  r modes for lega
10030 63 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 68 6f  cy:.**.**    sho
10040 72 74 3d 4f 46 46 2c 20 66 75 6c 6c 3d 4f 46 46  rt=OFF, full=OFF
10050 3a 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 6e 61  :      Column na
10060 6d 65 20 69 73 20 74 68 65 20 74 65 78 74 20 6f  me is the text o
10070 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
10080 20 68 61 73 20 69 74 0a 2a 2a 20 20 20 20 20 20   has it.**      
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100a0 20 20 20 20 20 20 20 20 6f 72 69 67 69 6e 61 6c          original
100b0 6c 79 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  ly appears in th
100c0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
100d0 6e 74 2e 20 20 49 6e 0a 2a 2a 20 20 20 20 20 20  nt.  In.**      
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100f0 20 20 20 20 20 20 20 20 6f 74 68 65 72 20 77 6f          other wo
10100 72 64 73 2c 20 74 68 65 20 7a 53 70 61 6e 20 6f  rds, the zSpan o
10110 66 20 74 68 65 20 72 65 73 75 6c 74 20 65 78 70  f the result exp
10120 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  ression..**.**  
10130 20 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75 6c 6c    short=ON, full
10140 3d 4f 46 46 3a 20 20 20 20 20 20 20 28 54 68 69  =OFF:       (Thi
10150 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
10160 20 73 65 74 74 69 6e 67 29 2e 20 20 49 66 20 74   setting).  If t
10170 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20 20 20  he result.**    
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10190 20 20 20 20 20 20 20 20 20 20 72 65 66 65 72 73            refers
101a0 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61 20 74   directly to a t
101b0 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  able column, the
101c0 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101e0 20 20 20 20 20 20 72 65 73 75 6c 74 20 63 6f 6c        result col
101f0 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6a 75 73 74  umn name is just
10200 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
10210 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  n.**            
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10230 20 20 6e 61 6d 65 3a 20 43 4f 4c 55 4d 4e 2e 20    name: COLUMN. 
10240 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 7a   Otherwise use z
10250 53 70 61 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 66  Span..**.**    f
10260 75 6c 6c 3d 4f 4e 2c 20 73 68 6f 72 74 3d 41 4e  ull=ON, short=AN
10270 59 3a 20 20 20 20 20 20 20 49 66 20 74 68 65 20  Y:       If the 
10280 72 65 73 75 6c 74 20 72 65 66 65 72 73 20 64 69  result refers di
10290 72 65 63 74 6c 79 20 74 6f 20 61 20 74 61 62 6c  rectly to a tabl
102a0 65 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 20 20 20  e column,.**    
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102c0 20 20 20 20 20 20 20 20 20 20 74 68 65 6e 20 74            then t
102d0 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  he result column
102e0 20 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20 74   name with the t
102f0 61 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 20  able name.**    
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10310 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78            prefix
10320 2c 20 65 78 3a 20 54 41 42 4c 45 2e 43 4f 4c 55  , ex: TABLE.COLU
10330 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73 65 20 75  MN.  Otherwise u
10340 73 65 20 7a 53 70 61 6e 2e 0a 2a 2f 0a 73 74 61  se zSpan..*/.sta
10350 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
10360 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20  eColumnNames(.  
10370 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
10380 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
10390 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
103a0 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 2f  t *pSelect     /
103b0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 6c 75 6d  * Generate colum
103c0 6e 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73  n names for this
103d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
103e0 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  t */.){.  Vdbe *
103f0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
10400 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 54 61  e;.  int i;.  Ta
10410 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 53 72 63  ble *pTab;.  Src
10420 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a  List *pTabList;.
10430 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
10440 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st;.  sqlite3 *d
10450 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
10460 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 3b 20    int fullName; 
10470 20 20 20 2f 2a 20 54 41 42 4c 45 2e 43 4f 4c 55     /* TABLE.COLU
10480 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c 61 75  MN if no AS clau
10490 73 65 20 61 6e 64 20 69 73 20 61 20 64 69 72 65  se and is a dire
104a0 63 74 20 74 61 62 6c 65 20 72 65 66 20 2a 2f 0a  ct table ref */.
104b0 20 20 69 6e 74 20 73 72 63 4e 61 6d 65 3b 20 20    int srcName;  
104c0 20 20 20 2f 2a 20 43 4f 4c 55 4d 4e 20 6f 72 20     /* COLUMN or 
104d0 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69 66 20  TABLE.COLUMN if 
104e0 6e 6f 20 41 53 20 63 6c 61 75 73 65 20 61 6e 64  no AS clause and
104f0 20 69 73 20 64 69 72 65 63 74 20 2a 2f 0a 0a 23   is direct */..#
10500 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10510 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20  IT_EXPLAIN.  /* 
10520 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58  If this is an EX
10530 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73  PLAIN, skip this
10540 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70   step */.  if( p
10550 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
10560 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
10570 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
10580 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
10590 53 65 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Set ) return;.  
105a0 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  /* Column names 
105b0 61 72 65 20 64 65 74 65 72 6d 69 6e 65 64 20 62  are determined b
105c0 79 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  y the left-most 
105d0 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75  term of a compou
105e0 6e 64 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20 77  nd select */.  w
105f0 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
10600 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20  Prior ) pSelect 
10610 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
10620 72 3b 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  r;.  SELECTTRACE
10630 28 31 2c 70 50 61 72 73 65 2c 70 53 65 6c 65 63  (1,pParse,pSelec
10640 74 2c 28 22 67 65 6e 65 72 61 74 69 6e 67 20 63  t,("generating c
10650 6f 6c 75 6d 6e 20 6e 61 6d 65 73 5c 6e 22 29 29  olumn names\n"))
10660 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
10670 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
10680 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
10690 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65  ->pEList;.  asse
106a0 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73  rt( v!=0 );.  as
106b0 73 65 72 74 28 20 70 54 61 62 4c 69 73 74 21 3d  sert( pTabList!=
106c0 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  0 );.  pParse->c
106d0 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a  olNamesSet = 1;.
106e0 20 20 66 75 6c 6c 4e 61 6d 65 20 3d 20 28 64 62    fullName = (db
106f0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
10700 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
10710 30 3b 0a 20 20 73 72 63 4e 61 6d 65 20 3d 20 28  0;.  srcName = (
10720 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
10730 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
10740 29 21 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61 6d 65  )!=0 || fullName
10750 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  ;.  sqlite3VdbeS
10760 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c  etNumCols(v, pEL
10770 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66  ist->nExpr);.  f
10780 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
10790 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
107a0 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c     Expr *p = pEL
107b0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
107c0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 21  ..    assert( p!
107d0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
107e0 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  ( p->op!=TK_AGG_
107f0 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20 41 67  COLUMN );  /* Ag
10800 67 20 70 72 6f 63 65 73 73 69 6e 67 20 68 61 73  g processing has
10810 20 6e 6f 74 20 72 75 6e 20 79 65 74 20 2a 2f 0a   not run yet */.
10820 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f      assert( p->o
10830 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
10840 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 20 2f 2a  p->pTab!=0 ); /*
10850 20 43 6f 76 65 72 69 6e 67 20 69 64 78 20 6e 6f   Covering idx no
10860 74 20 79 65 74 20 63 6f 64 65 64 20 2a 2f 0a 20  t yet coded */. 
10870 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
10880 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
10890 20 20 20 2f 2a 20 41 6e 20 41 53 20 63 6c 61 75     /* An AS clau
108a0 73 65 20 61 6c 77 61 79 73 20 74 61 6b 65 73 20  se always takes 
108b0 66 69 72 73 74 20 70 72 69 6f 72 69 74 79 20 2a  first priority *
108c0 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  /.      char *zN
108d0 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
108e0 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
108f0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
10900 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
10910 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c  AME_NAME, zName,
10920 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
10930 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  T);.    }else if
10940 28 20 73 72 63 4e 61 6d 65 20 26 26 20 70 2d 3e  ( srcName && p->
10950 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b  op==TK_COLUMN ){
10960 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  .      char *zCo
10970 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  l;.      int iCo
10980 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  l = p->iColumn;.
10990 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 2d 3e        pTab = p->
109a0 70 54 61 62 3b 0a 20 20 20 20 20 20 61 73 73 65  pTab;.      asse
109b0 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
109c0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
109d0 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69  ) iCol = pTab->i
109e0 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65  PKey;.      asse
109f0 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
10a00 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
10a10 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
10a20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
10a30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c   ){.        zCol
10a40 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   = "rowid";.    
10a50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10a60 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43   zCol = pTab->aC
10a70 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a  ol[iCol].zName;.
10a80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10a90 28 20 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a 20 20  ( fullName ){.  
10aa0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
10ab0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  e = 0;.        z
10ac0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
10ad0 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
10ae0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
10af0 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  zCol);.        s
10b00 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
10b10 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
10b20 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
10b30 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
10b40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10b50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10b60 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
10b70 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
10b80 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  zCol, SQLITE_TRA
10b90 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
10ba0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10bb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
10bc0 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
10bd0 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20  Span;.      z = 
10be0 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50  z==0 ? sqlite3MP
10bf0 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d  rintf(db, "colum
10c00 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c  n%d", i+1) : sql
10c10 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
10c20 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   z);.      sqlit
10c30 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
10c40 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
10c50 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44  AME, z, SQLITE_D
10c60 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20  YNAMIC);.    }. 
10c70 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c   }.  generateCol
10c80 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c  umnTypes(pParse,
10c90 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73   pTabList, pELis
10ca0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  t);.}../*.** Giv
10cb0 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  en an expression
10cc0 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20   list (which is 
10cd0 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20  really the list 
10ce0 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  of expressions.*
10cf0 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  * that form the 
10d00 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
10d10 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
10d20 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70  ) compute approp
10d30 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  riate.** column 
10d40 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c  names for a tabl
10d50 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c  e that would hol
10d60 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
10d70 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c   list..**.** All
10d80 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69   column names wi
10d90 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a  ll be unique..**
10da0 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c  .** Only the col
10db0 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f  umn names are co
10dc0 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e  mputed.  Column.
10dd0 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43  zType, Column.zC
10de0 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65  oll,.** and othe
10df0 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75  r fields of Colu
10e00 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  mn are zeroed..*
10e10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
10e20 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
10e30 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
10e40 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
10e50 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65  occurs,.** store
10e60 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20   NULL in *paCol 
10e70 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20  and 0 in *pnCol 
10e80 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
10e90 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a 20 54  E_NOMEM..**.** T
10ea0 68 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65  he only guarante
10eb0 65 20 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61  e that SQLite ma
10ec0 6b 65 73 20 61 62 6f 75 74 20 63 6f 6c 75 6d 6e  kes about column
10ed0 20 6e 61 6d 65 73 20 69 73 20 74 68 61 74 20 69   names is that i
10ee0 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
10ef0 68 61 73 20 61 6e 20 41 53 20 63 6c 61 75 73 65  has an AS clause
10f00 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20   assigning it a 
10f10 6e 61 6d 65 2c 20 74 68 61 74 20 77 69 6c 6c 20  name, that will 
10f20 62 65 20 74 68 65 20 6e 61 6d 65 20 75 73 65 64  be the name used
10f30 2e 0a 2a 2a 20 54 68 61 74 20 69 73 20 74 68 65  ..** That is the
10f40 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74 65 64   only documented
10f50 20 67 75 61 72 61 6e 74 65 65 2e 20 20 48 6f 77   guarantee.  How
10f60 65 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73 73 20  ever, countless 
10f70 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a 2a 20  applications.** 
10f80 64 65 76 65 6c 6f 70 65 64 20 6f 76 65 72 20 74  developed over t
10f90 68 65 20 79 65 61 72 73 20 68 61 76 65 20 6d 61  he years have ma
10fa0 64 65 20 62 61 73 65 6c 65 73 73 20 61 73 73 75  de baseless assu
10fb0 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 63 6f  mptions about co
10fc0 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20 61 6e  lumn names.** an
10fd0 64 20 77 69 6c 6c 20 62 72 65 61 6b 20 69 66 20  d will break if 
10fe0 74 68 6f 73 65 20 61 73 73 75 6d 70 74 69 6f 6e  those assumption
10ff0 73 20 63 68 61 6e 67 65 73 2e 20 20 48 65 6e 63  s changes.  Henc
11000 65 2c 20 75 73 65 20 65 78 74 72 65 6d 65 20 63  e, use extreme c
11010 61 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e 20 6d  aution.** when m
11020 6f 64 69 66 79 69 6e 67 20 74 68 69 73 20 72 6f  odifying this ro
11030 75 74 69 6e 65 20 74 6f 20 61 76 6f 69 64 20 62  utine to avoid b
11040 72 65 61 6b 69 6e 67 20 6c 65 67 61 63 79 2e 0a  reaking legacy..
11050 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f 3a 20  **.** See Also: 
11060 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
11070 6d 65 73 28 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mes().*/.int sql
11080 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45  ite3ColumnsFromE
11090 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
110a0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
110b0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
110c0 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
110d0 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
110e0 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20     /* Expr list 
110f0 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65  from which to de
11100 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  rive column name
11110 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f  s */.  i16 *pnCo
11120 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l,             /
11130 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
11140 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65  er of columns he
11150 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a  re */.  Column *
11160 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20  *paCol          
11170 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77  /* Write the new
11180 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72   column list her
11190 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
111a0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
111b0 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73  db;   /* Databas
111c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
111d0 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
111e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
111f0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
11200 2f 0a 20 20 75 33 32 20 63 6e 74 3b 20 20 20 20  /.  u32 cnt;    
11210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11220 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20 74  /* Index added t
11230 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20  o make the name 
11240 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75  unique */.  Colu
11250 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b  mn *aCol, *pCol;
11260 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
11270 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75  ooping over resu
11280 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20  lt columns */.  
11290 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20  int nCol;       
112a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
112b0 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
112c0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
112d0 65 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  et */.  char *zN
112e0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
112f0 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
11300 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  me */.  int nNam
11310 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
11320 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e      /* Size of n
11330 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a  ame in zName[] *
11340 2f 0a 20 20 48 61 73 68 20 68 74 3b 20 20 20 20  /.  Hash ht;    
11350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11360 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 6f 66  /* Hash table of
11370 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
11380 0a 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  ..  sqlite3HashI
11390 6e 69 74 28 26 68 74 29 3b 0a 20 20 69 66 28 20  nit(&ht);.  if( 
113a0 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e 43  pEList ){.    nC
113b0 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ol = pEList->nEx
113c0 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73  pr;.    aCol = s
113d0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
113e0 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61 43  ro(db, sizeof(aC
113f0 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20  ol[0])*nCol);.  
11400 20 20 74 65 73 74 63 61 73 65 28 20 61 43 6f 6c    testcase( aCol
11410 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  ==0 );.    if( n
11420 43 6f 6c 3e 33 32 37 36 37 20 29 20 6e 43 6f 6c  Col>32767 ) nCol
11430 20 3d 20 33 32 37 36 37 3b 0a 20 20 7d 65 6c 73   = 32767;.  }els
11440 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b  e{.    nCol = 0;
11450 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20  .    aCol = 0;. 
11460 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43 6f   }.  assert( nCo
11470 6c 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29 3b 0a  l==(i16)nCol );.
11480 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b    *pnCol = nCol;
11490 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c  .  *paCol = aCol
114a0 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  ;..  for(i=0, pC
114b0 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 20  ol=aCol; i<nCol 
114c0 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
114d0 69 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  iled; i++, pCol+
114e0 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61  +){.    /* Get a
114f0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61  n appropriate na
11500 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  me for the colum
11510 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  n.    */.    if(
11520 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   (zName = pEList
11530 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ->a[i].zName)!=0
11540 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
11550 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  the column conta
11560 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65  ins an "AS <name
11570 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c  >" phrase, use <
11580 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d  name> as the nam
11590 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e */.    }else{.
115a0 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c        Expr *pCol
115b0 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
115c0 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
115d0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
115e0 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
115f0 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
11600 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20  _DOT ){.        
11610 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45  pColExpr = pColE
11620 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
11630 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
11640 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  lExpr!=0 );.    
11650 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
11660 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 21 3d  ( pColExpr->op!=
11670 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
11680 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45  .      if( pColE
11690 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
116a0 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  MN ){.        /*
116b0 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65   For columns use
116c0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
116d0 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
116e0 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c   int iCol = pCol
116f0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
11700 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
11710 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  ab = pColExpr->p
11720 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Tab;.        ass
11730 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
11740 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
11750 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62  <0 ) iCol = pTab
11760 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
11770 20 7a 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e 3d 30   zName = iCol>=0
11780 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   ? pTab->aCol[iC
11790 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77  ol].zName : "row
117a0 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
117b0 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
117c0 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
117d0 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
117e0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f  rHasProperty(pCo
117f0 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  lExpr, EP_IntVal
11800 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  ue) );.        z
11810 4e 61 6d 65 20 3d 20 70 43 6f 6c 45 78 70 72 2d  Name = pColExpr-
11820 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
11830 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11840 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69  /* Use the origi
11850 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20  nal text of the 
11860 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
11870 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f  n as its name */
11880 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
11890 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
118a0 70 61 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pan;.      }.   
118b0 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65   }.    if( zName
118c0 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20   ){.      zName 
118d0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
118e0 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  p(db, zName);.  
118f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
11900 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
11910 72 69 6e 74 66 28 64 62 2c 22 63 6f 6c 75 6d 6e  rintf(db,"column
11920 25 64 22 2c 69 2b 31 29 3b 0a 20 20 20 20 7d 0a  %d",i+1);.    }.
11930 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
11940 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
11950 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66  e is unique.  If
11960 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74   the name is not
11970 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20   unique,.    ** 
11980 61 70 70 65 6e 64 20 61 6e 20 69 6e 74 65 67 65  append an intege
11990 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f  r to the name so
119a0 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73   that it becomes
119b0 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a   unique..    */.
119c0 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20      cnt = 0;.   
119d0 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 20 26 26   while( zName &&
119e0 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
119f0 28 26 68 74 2c 20 7a 4e 61 6d 65 29 21 3d 30 20  (&ht, zName)!=0 
11a00 29 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d  ){.      nName =
11a10 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
11a20 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  (zName);.      i
11a30 66 28 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a 20 20  f( nName>0 ){.  
11a40 20 20 20 20 20 20 66 6f 72 28 6a 3d 6e 4e 61 6d        for(j=nNam
11a50 65 2d 31 3b 20 6a 3e 30 20 26 26 20 73 71 6c 69  e-1; j>0 && sqli
11a60 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61 6d 65  te3Isdigit(zName
11a70 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20 20 20  [j]); j--){}.   
11a80 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6a       if( zName[j
11a90 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d  ]==':' ) nName =
11aa0 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   j;.      }.    
11ab0 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
11ac0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 2e  3MPrintf(db, "%.
11ad0 2a 7a 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c 20 7a  *z:%u", nName, z
11ae0 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20  Name, ++cnt);.  
11af0 20 20 20 20 69 66 28 20 63 6e 74 3e 33 20 29 20      if( cnt>3 ) 
11b00 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
11b10 73 73 28 73 69 7a 65 6f 66 28 63 6e 74 29 2c 20  ss(sizeof(cnt), 
11b20 26 63 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &cnt);.    }.   
11b30 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
11b40 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Name;.    sqlite
11b50 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65  3ColumnPropertie
11b60 73 46 72 6f 6d 4e 61 6d 65 28 30 2c 20 70 43 6f  sFromName(0, pCo
11b70 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  l);.    if( zNam
11b80 65 20 26 26 20 73 71 6c 69 74 65 33 48 61 73 68  e && sqlite3Hash
11b90 49 6e 73 65 72 74 28 26 68 74 2c 20 7a 4e 61 6d  Insert(&ht, zNam
11ba0 65 2c 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c 20 29  e, pCol)==pCol )
11bb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
11bc0 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20  omFault(db);.   
11bd0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
11be0 48 61 73 68 43 6c 65 61 72 28 26 68 74 29 3b 0a  HashClear(&ht);.
11bf0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
11c00 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f  Failed ){.    fo
11c10 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29  r(j=0; j<i; j++)
11c20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
11c30 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a  bFree(db, aCol[j
11c40 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ].zName);.    }.
11c50 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
11c60 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20  e(db, aCol);.   
11c70 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20   *paCol = 0;.   
11c80 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20   *pnCol = 0;.   
11c90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
11ca0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
11cb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11cc0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  K;.}../*.** Add 
11cd0 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
11ce0 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  on information t
11cf0 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  o a column list 
11d00 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45  based on.** a SE
11d10 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
11d20 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ** .** The colum
11d30 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c  n list presumabl
11d40 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65  y came from sele
11d50 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f  ctColumnNamesFro
11d60 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20  mExprList()..** 
11d70 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  The column list 
11d80 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20  has only names, 
11d90 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c  not types or col
11da0 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a  lations.  This.*
11db0 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  * routine goes t
11dc0 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20  hrough and adds 
11dd0 74 68 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f  the types and co
11de0 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  llations..**.** 
11df0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71  This routine req
11e00 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69  uires that all i
11e10 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68  dentifiers in th
11e20 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74  e SELECT.** stat
11e30 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65  ement be resolve
11e40 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
11e50 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d  e3SelectAddColum
11e60 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
11e70 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
11e80 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
11e90 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a  rsing contexts *
11ea0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
11eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
11ec0 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66   column type inf
11ed0 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73  ormation to this
11ee0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65   table */.  Sele
11ef0 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
11f00 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64    /* SELECT used
11f10 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79   to determine ty
11f20 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
11f30 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ns */.){.  sqlit
11f40 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
11f50 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  >db;.  NameConte
11f60 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e  xt sNC;.  Column
11f70 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65   *pCol;.  CollSe
11f80 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
11f90 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  i;.  Expr *p;.  
11fa0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
11fb0 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65  item *a;..  asse
11fc0 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29  rt( pSelect!=0 )
11fd0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65  ;.  assert( (pSe
11fe0 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
11ff0 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30   SF_Resolved)!=0
12000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
12010 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63  ab->nCol==pSelec
12020 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
12030 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
12040 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62  iled );.  if( db
12050 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
12060 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65   return;.  memse
12070 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
12080 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
12090 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
120a0 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70  t->pSrc;.  a = p
120b0 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
120c0 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  a;.  for(i=0, pC
120d0 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
120e0 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
120f0 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 63  , pCol++){.    c
12100 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
12110 3b 0a 20 20 20 20 69 6e 74 20 6e 2c 20 6d 3b 0a  ;.    int n, m;.
12120 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78      p = a[i].pEx
12130 70 72 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20  pr;.    zType = 
12140 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
12150 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   p, 0, 0, 0);.  
12160 20 20 2f 2a 20 70 43 6f 6c 2d 3e 73 7a 45 73 74    /* pCol->szEst
12170 20 3d 20 2e 2e 2e 20 2f 2f 20 43 6f 6c 75 6d 6e   = ... // Column
12180 20 73 69 7a 65 20 65 73 74 20 66 6f 72 20 53 45   size est for SE
12190 4c 45 43 54 20 74 61 62 6c 65 73 20 6e 65 76 65  LECT tables neve
121a0 72 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 70 43  r used */.    pC
121b0 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
121c0 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
121d0 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a  ty(p);.    if( z
121e0 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 6d 20  Type ){.      m 
121f0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
12200 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20  0(zType);.      
12210 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
12220 6e 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  n30(pCol->zName)
12230 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e  ;.      pCol->zN
12240 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 52  ame = sqlite3DbR
12250 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64 62 2c  eallocOrFree(db,
12260 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 6e 2b   pCol->zName, n+
12270 6d 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  m+2);.      if( 
12280 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20  pCol->zName ){. 
12290 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
122a0 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31 5d 2c  Col->zName[n+1],
122b0 20 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a 20 20   zType, m+1);.  
122c0 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46        pCol->colF
122d0 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
122e0 48 41 53 54 59 50 45 3b 0a 20 20 20 20 20 20 7d  HASTYPE;.      }
122f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
12300 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30  Col->affinity==0
12310 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74   ) pCol->affinit
12320 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y = SQLITE_AFF_B
12330 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  LOB;.    pColl =
12340 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
12350 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
12360 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26      if( pColl &&
12370 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d 30 20   pCol->zColl==0 
12380 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a  ){.      pCol->z
12390 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  Coll = sqlite3Db
123a0 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c  StrDup(db, pColl
123b0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
123c0 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61    }.  pTab->szTa
123d0 62 52 6f 77 20 3d 20 31 3b 20 2f 2a 20 41 6e 79  bRow = 1; /* Any
123e0 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
123f0 77 6f 72 6b 73 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  works */.}../*.*
12400 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54  * Given a SELECT
12410 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65   statement, gene
12420 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72  rate a Table str
12430 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
12440 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73  ribes.** the res
12450 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20  ult set of that 
12460 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65  SELECT..*/.Table
12470 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53   *sqlite3ResultS
12480 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65  etOfSelect(Parse
12490 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
124a0 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61   *pSelect){.  Ta
124b0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c  ble *pTab;.  sql
124c0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
124d0 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76  e->db;.  int sav
124e0 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65  edFlags;..  save
124f0 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61  dFlags = db->fla
12500 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  gs;.  db->flags 
12510 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43  &= ~SQLITE_FullC
12520 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66  olNames;.  db->f
12530 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
12540 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  hortColNames;.  
12550 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
12560 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  p(pParse, pSelec
12570 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61  t, 0);.  if( pPa
12580 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
12590 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70  rn 0;.  while( p
125a0 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
125b0 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
125c0 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62  ct->pPrior;.  db
125d0 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46  ->flags = savedF
125e0 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73  lags;.  pTab = s
125f0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
12600 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  ro(db, sizeof(Ta
12610 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54  ble) );.  if( pT
12620 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ab==0 ){.    ret
12630 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20  urn 0;.  }.  /* 
12640 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c  The sqlite3Resul
12650 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69  tSetOfSelect() i
12660 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f  s only used n co
12670 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f  ntexts where loo
12680 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64  kaside.  ** is d
12690 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73  isabled */.  ass
126a0 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
126b0 64 65 2e 62 44 69 73 61 62 6c 65 20 29 3b 0a 20  de.bDisable );. 
126c0 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d   pTab->nTabRef =
126d0 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d   1;.  pTab->zNam
126e0 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e  e = 0;.  pTab->n
126f0 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30 3b  RowLogEst = 200;
12700 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73 71   assert( 200==sq
12710 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34 38  lite3LogEst(1048
12720 35 37 36 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  576) );.  sqlite
12730 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
12740 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
12750 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70  lect->pEList, &p
12760 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
12770 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  ->aCol);.  sqlit
12780 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d  e3SelectAddColum
12790 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
127a0 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  n(pParse, pTab, 
127b0 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62  pSelect);.  pTab
127c0 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
127d0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
127e0 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
127f0 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
12800 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65  b, pTab);.    re
12810 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
12820 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
12830 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20 66  .** Get a VDBE f
12840 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 72  or the given par
12850 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72  ser context.  Cr
12860 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
12870 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
12880 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
12890 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  rs, return NULL 
128a0 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73  and leave a mess
128b0 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  age in pParse..*
128c0 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47  /.Vdbe *sqlite3G
128d0 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70 50  etVdbe(Parse *pP
128e0 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70 50 61  arse){.  if( pPa
128f0 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20  rse->pVdbe ){.  
12900 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
12910 3e 70 56 64 62 65 3b 0a 20 20 7d 0a 20 20 69 66  >pVdbe;.  }.  if
12920 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65  ( pParse->pTople
12930 76 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f 70 74  vel==0.   && Opt
12940 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
12950 28 70 50 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49  (pParse->db,SQLI
12960 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73  TE_FactorOutCons
12970 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 72  t).  ){.    pPar
12980 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
12990 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  r = 1;.  }.  ret
129a0 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43  urn sqlite3VdbeC
129b0 72 65 61 74 65 28 70 50 61 72 73 65 29 3b 0a 7d  reate(pParse);.}
129c0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
129d0 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
129e0 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
129f0 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
12a00 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69  ed on the.** pLi
12a10 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  mit expressions.
12a20 20 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20    pLimit->pLeft 
12a30 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67  and pLimit->pRig
12a40 68 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  ht hold the expr
12a50 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
12a60 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
12a70 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
12a80 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
12a90 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
12aa0 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
12ab0 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
12ac0 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
12ad0 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
12ae0 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
12af0 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
12b00 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
12b10 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
12b20 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
12b30 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
12b40 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
12b50 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
12b60 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
12b70 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
12b80 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
12b90 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
12ba0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
12bb0 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
12bc0 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  of iLimit and iO
12bd0 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
12be0 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
12bf0 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
12c00 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 20 61   pLimit->pLeft a
12c10 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68  nd pLimit->pRigh
12c20 74 2e 20 20 69 4c 69 6d 69 74 0a 2a 2a 20 61 6e  t.  iLimit.** an
12c30 64 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  d iOffset should
12c40 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
12c50 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
12c60 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20   default values 
12c70 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20  (zero).** prior 
12c80 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
12c90 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
12ca0 68 65 20 69 4f 66 66 73 65 74 20 72 65 67 69 73  he iOffset regis
12cb0 74 65 72 20 28 69 66 20 69 74 20 65 78 69 73 74  ter (if it exist
12cc0 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  s) is initialize
12cd0 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a  d to the value.*
12ce0 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e  * of the OFFSET.
12cf0 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67    The iLimit reg
12d00 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c  ister is initial
12d10 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20  ized to LIMIT.  
12d20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66  Register.** iOff
12d30 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c  set+1 is initial
12d40 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46  ized to LIMIT+OF
12d50 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  FSET..**.** Only
12d60 20 69 66 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66   if pLimit->pLef
12d70 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69  t!=0 do the limi
12d80 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a  t registers get.
12d90 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54  ** redefined.  T
12da0 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
12db0 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20  rator uses this 
12dc0 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63  property to forc
12dd0 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f  e.** the reuse o
12de0 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74  f the same limit
12df0 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69   and offset regi
12e00 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c  sters across mul
12e10 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20  tiple.** SELECT 
12e20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  statements..*/.s
12e30 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75  tatic void compu
12e40 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
12e50 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12e60 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
12e70 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a  Break){.  Vdbe *
12e80 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69  v = 0;.  int iLi
12e90 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  mit = 0;.  int i
12ea0 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 6e 3b  Offset;.  int n;
12eb0 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20  .  Expr *pLimit 
12ec0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a 20 20  = p->pLimit;..  
12ed0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20  if( p->iLimit ) 
12ee0 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20  return;..  /* . 
12ef0 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
12f00 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
12f10 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
12f20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f  some.  ** contro
12f30 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
12f40 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
12f50 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
12f60 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
12f70 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
12f80 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
12f90 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
12fa0 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
12fb0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
12fc0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
12fd0 3b 0a 20 20 69 66 28 20 70 4c 69 6d 69 74 20 29  ;.  if( pLimit )
12fe0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
12ff0 69 6d 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c 49 4d  imit->op==TK_LIM
13000 49 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  IT );.    assert
13010 28 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 21  ( pLimit->pLeft!
13020 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69 4c 69  =0 );.    p->iLi
13030 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20 2b  mit = iLimit = +
13040 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
13050 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
13060 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
13070 20 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20     assert( v!=0 
13080 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
13090 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
130a0 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26  pLimit->pLeft, &
130b0 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  n) ){.      sqli
130c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
130d0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20   OP_Integer, n, 
130e0 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56  iLimit);.      V
130f0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
13100 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
13110 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  ;.      if( n==0
13120 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
13130 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 69  te3VdbeGoto(v, i
13140 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65  Break);.      }e
13150 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20  lse if( n>=0 && 
13160 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 73 71  p->nSelectRow>sq
13170 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
13180 29 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  )n) ){.        p
13190 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
131a0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
131b0 34 29 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  4)n);.        p-
131c0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
131d0 46 69 78 65 64 4c 69 6d 69 74 3b 0a 20 20 20 20  FixedLimit;.    
131e0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
131f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13200 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69  Code(pParse, pLi
13210 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 69 4c 69 6d  mit->pLeft, iLim
13220 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  it);.      sqlit
13230 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
13240 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4c  OP_MustBeInt, iL
13250 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  imit); VdbeCover
13260 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56 64  age(v);.      Vd
13270 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
13280 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
13290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
132a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
132b0 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 69 42  fNot, iLimit, iB
132c0 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
132d0 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
132e0 20 20 69 66 28 20 70 4c 69 6d 69 74 2d 3e 70 52    if( pLimit->pR
132f0 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 2d  ight ){.      p-
13300 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73  >iOffset = iOffs
13310 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
13320 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73  Mem;.      pPars
13330 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20  e->nMem++;   /* 
13340 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72  Allocate an extr
13350 61 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c  a register for l
13360 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20  imit+offset */. 
13370 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13380 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69  Code(pParse, pLi
13390 6d 69 74 2d 3e 70 52 69 67 68 74 2c 20 69 4f 66  mit->pRight, iOf
133a0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
133b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
133c0 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
133d0 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f  iOffset); VdbeCo
133e0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
133f0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
13400 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72   "OFFSET counter
13410 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
13420 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
13430 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74 2c 20  OP_OffsetLimit, 
13440 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2b  iLimit, iOffset+
13450 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  1, iOffset);.   
13460 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
13470 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54  v, "LIMIT+OFFSET
13480 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  "));.    }.  }.}
13490 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
134a0 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
134b0 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ELECT./*.** Retu
134c0 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
134d0 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  te collating seq
134e0 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69 43  uence for the iC
134f0 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a  ol-th column of.
13500 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ** the result se
13510 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75  t for the compou
13520 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd-select statem
13530 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72 6e  ent "p".  Return
13540 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20   NULL if.** the 
13550 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65  column has no de
13560 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
13570 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
13580 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  The collating se
13590 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 63  quence for the c
135a0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 69  ompound select i
135b0 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65  s taken from the
135c0 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  .** left-most te
135d0 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  rm of the select
135e0 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 6c   that has a coll
135f0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a  ating sequence..
13600 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65  */.static CollSe
13610 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f  q *multiSelectCo
13620 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
13630 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20  rse, Select *p, 
13640 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c  int iCol){.  Col
13650 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69 66  lSeq *pRet;.  if
13660 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
13670 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69 53     pRet = multiS
13680 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
13690 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  rse, p->pPrior, 
136a0 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCol);.  }else{.
136b0 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
136c0 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c  }.  assert( iCol
136d0 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43 6f 6c  >=0 );.  /* iCol
136e0 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20 74 68   must be less th
136f0 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  an p->pEList->nE
13700 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73 65 20  xpr.  Otherwise 
13710 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64 0a 20  an error would. 
13720 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 68   ** have been th
13730 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61 6d 65  rown during name
13740 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e 64 20   resolution and 
13750 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68 61 76  we would not hav
13760 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20 74 68  e gotten.  ** th
13770 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66 28 20  is far */.  if( 
13780 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57 41 59  pRet==0 && ALWAY
13790 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74  S(iCol<p->pEList
137a0 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
137b0 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  pRet = sqlite3Ex
137c0 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
137d0 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
137e0 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d  Col].pExpr);.  }
137f0 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
13800 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c  }../*.** The sel
13810 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
13820 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
13830 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
13840 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
13850 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f 52 44  T.** with an ORD
13860 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 54 68  ER BY clause. Th
13870 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
13880 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e  cates and return
13890 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73  s a KeyInfo.** s
138a0 74 72 75 63 74 75 72 65 20 73 75 69 74 61 62 6c  tructure suitabl
138b0 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e 74 69  e for implementi
138c0 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e  ng the ORDER BY.
138d0 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
138e0 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f  hold the KeyInfo
138f0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62   structure is ob
13900 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
13910 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a  oc. The calling.
13920 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ** function is r
13930 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65  esponsible for e
13940 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74 68 69  nsuring that thi
13950 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  s structure is e
13960 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65  ventually.** fre
13970 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65  ed..*/.static Ke
13980 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65 6c 65  yInfo *multiSele
13990 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f  ctOrderByKeyInfo
139a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
139b0 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 6e  Select *p, int n
139c0 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72 4c 69  Extra){.  ExprLi
139d0 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
139e0 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e  ->pOrderBy;.  in
139f0 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  t nOrderBy = p->
13a00 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
13a10 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
13a20 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b   pParse->db;.  K
13a30 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d 20 73  eyInfo *pRet = s
13a40 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
13a50 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2b  oc(db, nOrderBy+
13a60 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69 66  nExtra, 1);.  if
13a70 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 69 6e  ( pRet ){.    in
13a80 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
13a90 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
13aa0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
13ab0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
13ac0 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65 72 42  pItem = &pOrderB
13ad0 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 45  y->a[i];.      E
13ae0 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 49 74  xpr *pTerm = pIt
13af0 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
13b00 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
13b10 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ..      if( pTer
13b20 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  m->flags & EP_Co
13b30 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
13b40 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
13b50 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
13b60 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  se, pTerm);.    
13b70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13b80 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65   pColl = multiSe
13b90 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
13ba0 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e 75 2e  se, p, pItem->u.
13bb0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 29  x.iOrderByCol-1)
13bc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
13bd0 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d  oll==0 ) pColl =
13be0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
13bf0 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
13c00 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20  ->a[i].pExpr =. 
13c10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13c20 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74  ExprAddCollateSt
13c30 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65  ring(pParse, pTe
13c40 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  rm, pColl->zName
13c50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13c60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13c70 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
13c80 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20 20 20  le(pRet) );.    
13c90 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d    pRet->aColl[i]
13ca0 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
13cb0 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pRet->aSortOrder
13cc0 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  [i] = pOrderBy->
13cd0 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
13ce0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
13cf0 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66  urn pRet;.}..#if
13d00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13d10 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  _CTE./*.** This 
13d20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
13d30 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 63  s VDBE code to c
13d40 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 74 65  ompute the conte
13d50 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52 45 43  nt of a WITH REC
13d60 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72 79 20  URSIVE.** query 
13d70 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
13d80 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76 65 2d  **   <recursive-
13d90 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65 74 75  table> AS (<setu
13da0 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e 20 5b  p-query> UNION [
13db0 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76 65 2d  ALL] <recursive-
13dc0 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20 20 20  query>).**      
13dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13de0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f     \___________/
13df0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
13e00 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a  _____________/.*
13e10 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
13e20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
13e30 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20  Prior           
13e40 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a 2a 0a             p.**.
13e50 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 65  **.** There is e
13e60 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66 65 72  xactly one refer
13e70 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65 63 75  ence to the recu
13e80 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e 20 74  rsive-table in t
13e90 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a  he FROM clause.*
13ea0 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65 2d 71  * of recursive-q
13eb0 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77 69 74  uery, marked wit
13ec0 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d 3e 61  h the SrcList->a
13ed0 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69 76  [].fg.isRecursiv
13ee0 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  e flag..**.** Th
13ef0 65 20 73 65 74 75 70 2d 71 75 65 72 79 20 72 75  e setup-query ru
13f00 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72  ns once to gener
13f10 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73  ate an initial s
13f20 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  et of rows that 
13f30 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65  go.** into a Que
13f40 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20  ue table.  Rows 
13f50 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72  are extracted fr
13f60 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74 61 62  om the Queue tab
13f70 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65  le one by.** one
13f80 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72  .  Each row extr
13f90 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65  acted from Queue
13fa0 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44   is output to pD
13fb0 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73  est.  Then the s
13fc0 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74  ingle.** extract
13fd0 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74  ed row (now in t
13fe0 68 65 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c  he iCurrent tabl
13ff0 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63  e) becomes the c
14000 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a  ontent of the.**
14010 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65   recursive-table
14020 20 66 6f 72 20 61 20 72 65 63 75 72 73 69 76 65   for a recursive
14030 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65  -query run.  The
14040 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 72   output of the r
14050 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a  ecursive-query.*
14060 2a 20 69 73 20 61 64 64 65 64 20 62 61 63 6b 20  * is added back 
14070 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74  into the Queue t
14080 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74  able.  Then anot
14090 68 65 72 20 72 6f 77 20 69 73 20 65 78 74 72 61  her row is extra
140a0 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a  cted from Queue.
140b0 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72 61  ** and the itera
140c0 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75  tion continues u
140d0 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 74  ntil the Queue t
140e0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
140f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70  *.** If the comp
14100 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61  ound query opera
14110 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65  tor is UNION the
14120 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72  n no duplicate r
14130 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20  ows are ever.** 
14140 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
14150 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  e Queue table.  
14160 54 68 65 20 69 44 69 73 74 69 6e 63 74 20 74 61  The iDistinct ta
14170 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79  ble keeps a copy
14180 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20   of all rows.** 
14190 74 68 61 74 20 68 61 76 65 20 65 76 65 72 20 62  that have ever b
141a0 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74  een inserted int
141b0 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73  o Queue and caus
141c0 65 73 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f  es duplicates to
141d0 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64   be.** discarded
141e0 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  .  If the operat
141f0 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c  or is UNION ALL,
14200 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73   then duplicates
14210 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a   are allowed..**
14220 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72   .** If the quer
14230 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42  y has an ORDER B
14240 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20  Y, then entries 
14250 69 6e 20 74 68 65 20 51 75 65 75 65 20 74 61 62  in the Queue tab
14260 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a  le are kept in.*
14270 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72  * ORDER BY order
14280 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 65   and the first e
14290 6e 74 72 79 20 69 73 20 65 78 74 72 61 63 74 65  ntry is extracte
142a0 64 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65  d for each cycle
142b0 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e  .  Without.** an
142c0 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 51   ORDER BY, the Q
142d0 75 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75  ueue table is ju
142e0 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a  st a FIFO..**.**
142f0 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   If a LIMIT clau
14300 73 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20  se is provided, 
14310 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 69  then the iterati
14320 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c  on stops after L
14330 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76  IMIT rows.** hav
14340 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f  e been output to
14350 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54   pDest.  A LIMIT
14360 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74   of zero means t
14370 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73  o output no rows
14380 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69   and a.** negati
14390 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74  ve LIMIT means t
143a0 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77  o output all row
143b0 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  s.  If there is 
143c0 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63  also an OFFSET c
143d0 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20  lause.** with a 
143e0 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20  positive value, 
143f0 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f  then the first O
14400 46 46 53 45 54 20 6f 75 74 70 75 74 73 20 61 72  FFSET outputs ar
14410 65 20 64 69 73 63 61 72 64 65 64 20 72 61 74 68  e discarded rath
14420 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67  er.** than being
14430 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20   sent to pDest. 
14440 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74   The LIMIT count
14450 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
14460 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53  until after OFFS
14470 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20  ET.** rows have 
14480 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f  been skipped..*/
14490 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
144a0 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
144b0 76 65 51 75 65 72 79 28 0a 20 20 50 61 72 73 65  veQuery(.  Parse
144c0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
144d0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
144e0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
144f0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
14500 2a 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20  * The recursive 
14510 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64  SELECT to be cod
14520 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
14530 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
14540 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
14550 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
14560 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  /.){.  SrcList *
14570 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20  pSrc = p->pSrc; 
14580 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
14590 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72   clause of the r
145a0 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a  ecursive query *
145b0 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  /.  int nCol = p
145c0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
145d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
145e0 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
145f0 63 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f  cursive table */
14600 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
14610 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20  rse->pVdbe;     
14620 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64   /* The prepared
14630 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
14640 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
14650 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75  .  Select *pSetu
14660 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20  p = p->pPrior;  
14670 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71 75   /* The setup qu
14680 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ery */.  int add
14690 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  rTop;           
146a0 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
146b0 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69   the loop */.  i
146c0 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  nt addrCont, add
146d0 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20  rBreak;      /* 
146e0 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45  CONTINUE and BRE
146f0 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a  AK addresses */.
14700 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d    int iCurrent =
14710 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
14720 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20 74  /* The Current t
14730 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  able */.  int re
14740 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20  gCurrent;       
14750 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
14760 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72  ter holding Curr
14770 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ent table */.  i
14780 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20 20 20  nt iQueue;      
14790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
147a0 54 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  The Queue table 
147b0 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e  */.  int iDistin
147c0 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ct = 0;         
147d0 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20     /* To ensure 
147e0 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69  unique results i
147f0 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74  f UNION */.  int
14800 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46 69 66   eDest = SRT_Fif
14810 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f  o;         /* Ho
14820 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75  w to write to Qu
14830 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  eue */.  SelectD
14840 65 73 74 20 64 65 73 74 51 75 65 75 65 3b 20 20  est destQueue;  
14850 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
14860 44 65 73 74 20 74 61 72 67 65 74 74 69 6e 67 20  Dest targetting 
14870 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
14880 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148a0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
148b0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  er */.  int rc; 
148c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148d0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
148e0 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  code */.  ExprLi
148f0 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
14900 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
14910 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
14920 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74  /.  Expr *pLimit
14930 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14940 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54    /* Saved LIMIT
14950 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20   and OFFSET */. 
14960 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72   int regLimit, r
14970 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  egOffset;      /
14980 2a 20 52 65 67 69 73 74 65 72 73 20 75 73 65 64  * Registers used
14990 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46   by LIMIT and OF
149a0 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62  FSET */..  /* Ob
149b0 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  tain authorizati
149c0 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72  on to do a recur
149d0 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  sive query */.  
149e0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
149f0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
14a00 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30  ITE_RECURSIVE, 0
14a10 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
14a20 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  ;..  /* Process 
14a30 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
14a40 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66  FSET clauses, if
14a50 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20   they exist */. 
14a60 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c   addrBreak = sql
14a70 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
14a80 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65  l(v);.  p->nSele
14a90 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a  ctRow = 320;  /*
14aa0 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20   4 billion rows 
14ab0 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  */.  computeLimi
14ac0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
14ad0 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61 6b 29  e, p, addrBreak)
14ae0 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  ;.  pLimit = p->
14af0 70 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4c 69 6d  pLimit;.  regLim
14b00 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
14b10 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d    regOffset = p-
14b20 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70  >iOffset;.  p->p
14b30 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  Limit = 0;.  p->
14b40 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66  iLimit = p->iOff
14b50 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64 65  set = 0;.  pOrde
14b60 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
14b70 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20  y;..  /* Locate 
14b80 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
14b90 72 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e 74  r of the Current
14ba0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28   table */.  for(
14bb0 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70 53  i=0; ALWAYS(i<pS
14bc0 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29 7b  rc->nSrc); i++){
14bd0 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 61  .    if( pSrc->a
14be0 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75 72 73 69  [i].fg.isRecursi
14bf0 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72  ve ){.      iCur
14c00 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69  rent = pSrc->a[i
14c10 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ].iCursor;.     
14c20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14c30 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
14c40 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73   cursors numbers
14c50 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44   for Queue and D
14c60 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75  istinct.  The cu
14c70 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a  rsor number for.
14c80 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63    ** the Distinc
14c90 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20  t table must be 
14ca0 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61  exactly one grea
14cb0 74 65 72 20 74 68 61 6e 20 51 75 65 75 65 20 69  ter than Queue i
14cc0 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72  n order.  ** for
14cd0 20 74 68 65 20 53 52 54 5f 44 69 73 74 46 69 66   the SRT_DistFif
14ce0 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75  o and SRT_DistQu
14cf0 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73  eue destinations
14d00 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69   to work. */.  i
14d10 51 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e  Queue = pParse->
14d20 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d  nTab++;.  if( p-
14d30 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b  >op==TK_UNION ){
14d40 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72  .    eDest = pOr
14d50 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74  derBy ? SRT_Dist
14d60 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74  Queue : SRT_Dist
14d70 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73 74 69  Fifo;.    iDisti
14d80 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
14d90 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ab++;.  }else{. 
14da0 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65     eDest = pOrde
14db0 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20  rBy ? SRT_Queue 
14dc0 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20 7d 0a  : SRT_Fifo;.  }.
14dd0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
14de0 65 73 74 49 6e 69 74 28 26 64 65 73 74 51 75 65  estInit(&destQue
14df0 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65 75  ue, eDest, iQueu
14e00 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  e);..  /* Alloca
14e10 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20 43  te cursors for C
14e20 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20 61  urrent, Queue, a
14e30 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a  nd Distinct. */.
14e40 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20 2b    regCurrent = +
14e50 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
14e60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14e70 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
14e80 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20 72  udo, iCurrent, r
14e90 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29  egCurrent, nCol)
14ea0 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
14eb0 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
14ec0 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c 74  *pKeyInfo = mult
14ed0 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65  iSelectOrderByKe
14ee0 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c  yInfo(pParse, p,
14ef0 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
14f00 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
14f10 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
14f20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79  iQueue, pOrderBy
14f30 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20  ->nExpr+2, 0,.  
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f50 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
14f60 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
14f70 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75 65 2e  ;.    destQueue.
14f80 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
14f90 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rBy;.  }else{.  
14fa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14fb0 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
14fc0 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c  hemeral, iQueue,
14fd0 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64   nCol);.  }.  Vd
14fe0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51  beComment((v, "Q
14ff0 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20  ueue table"));. 
15000 20 69 66 28 20 69 44 69 73 74 69 6e 63 74 20 29   if( iDistinct )
15010 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65  {.    p->addrOpe
15020 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74  nEphm[0] = sqlit
15030 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15040 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
15050 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b  , iDistinct, 0);
15060 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
15070 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
15080 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  eral;.  }..  /* 
15090 44 65 74 61 63 68 20 74 68 65 20 4f 52 44 45 52  Detach the ORDER
150a0 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20   BY clause from 
150b0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
150c0 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ECT */.  p->pOrd
150d0 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  erBy = 0;..  /* 
150e0 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
150f0 73 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71  s of the setup-q
15100 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a  uery in Queue. *
15110 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78  /.  pSetup->pNex
15120 74 20 3d 20 30 3b 0a 20 20 45 78 70 6c 61 69 6e  t = 0;.  Explain
15130 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
15140 65 2c 20 31 2c 20 22 53 45 54 55 50 22 29 29 3b  e, 1, "SETUP"));
15150 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53  .  rc = sqlite3S
15160 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
15170 65 74 75 70 2c 20 26 64 65 73 74 51 75 65 75 65  etup, &destQueue
15180 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65  );.  pSetup->pNe
15190 78 74 20 3d 20 70 3b 0a 20 20 69 66 28 20 72 63  xt = p;.  if( rc
151a0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72   ) goto end_of_r
151b0 65 63 75 72 73 69 76 65 5f 71 75 65 72 79 3b 0a  ecursive_query;.
151c0 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  /* Find the n
151d0 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65 20 51  ext row in the Q
151e0 75 65 75 65 20 61 6e 64 20 6f 75 74 70 75 74 20  ueue and output 
151f0 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64  that row */.  ad
15200 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
15210 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15220 52 65 77 69 6e 64 2c 20 69 51 75 65 75 65 2c 20  Rewind, iQueue, 
15230 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64 62 65  addrBreak); Vdbe
15240 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20 20  Coverage(v);..  
15250 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
15260 6e 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65 75  next row in Queu
15270 65 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65 6e  e over to Curren
15280 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  t */.  sqlite3Vd
15290 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
152a0 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e 74  ullRow, iCurrent
152b0 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20 63  ); /* To reset c
152c0 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20  olumn cache */. 
152d0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
152e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
152f0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
15300 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f 72  umn, iQueue, pOr
15310 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20  derBy->nExpr+1, 
15320 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d  regCurrent);.  }
15330 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
15340 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15350 50 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65 75  P_RowData, iQueu
15360 65 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a  e, regCurrent);.
15370 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
15380 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65  eAddOp1(v, OP_De
15390 6c 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a  lete, iQueue);..
153a0 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
153b0 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43 75  single row in Cu
153c0 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43  rrent */.  addrC
153d0 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
153e0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
153f0 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 72   codeOffset(v, r
15400 65 67 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f  egOffset, addrCo
15410 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e  nt);.  selectInn
15420 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
15430 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20 20 20  , iCurrent,.    
15440 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20 61    0, 0, pDest, a
15450 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72 65  ddrCont, addrBre
15460 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67 4c 69  ak);.  if( regLi
15470 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
15480 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15490 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c  OP_DecrJumpZero,
154a0 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64 72 42   regLimit, addrB
154b0 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65 43  reak);.    VdbeC
154c0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
154d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
154e0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
154f0 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45 78  rCont);..  /* Ex
15500 65 63 75 74 65 20 74 68 65 20 72 65 63 75 72 73  ecute the recurs
15510 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e  ive SELECT takin
15520 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  g the single row
15530 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20   in Current as. 
15540 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f   ** the value fo
15550 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 2d  r the recursive-
15560 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65  table. Store the
15570 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20   results in the 
15580 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  Queue..  */.  if
15590 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
155a0 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b 0a  SF_Aggregate ){.
155b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
155c0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 65 63  Msg(pParse, "rec
155d0 75 72 73 69 76 65 20 61 67 67 72 65 67 61 74 65  ursive aggregate
155e0 20 71 75 65 72 69 65 73 20 6e 6f 74 20 73 75 70   queries not sup
155f0 70 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65 6c 73  ported");.  }els
15600 65 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  e{.    p->pPrior
15610 20 3d 20 30 3b 0a 20 20 20 20 45 78 70 6c 61 69   = 0;.    Explai
15620 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
15630 73 65 2c 20 31 2c 20 22 52 45 43 55 52 53 49 56  se, 1, "RECURSIV
15640 45 20 53 54 45 50 22 29 29 3b 0a 20 20 20 20 73  E STEP"));.    s
15650 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
15660 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65  rse, p, &destQue
15670 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ue);.    assert(
15680 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b   p->pPrior==0 );
15690 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  .    p->pPrior =
156a0 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a 20 20   pSetup;.  }..  
156b0 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20  /* Keep running 
156c0 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74  the loop until t
156d0 68 65 20 51 75 65 75 65 20 69 73 20 65 6d 70 74  he Queue is empt
156e0 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  y */.  sqlite3Vd
156f0 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f  beGoto(v, addrTo
15700 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  p);.  sqlite3Vdb
15710 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
15720 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 65 6e   addrBreak);..en
15730 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f 71  d_of_recursive_q
15740 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65 33 45  uery:.  sqlite3E
15750 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
15760 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 4f 72  arse->db, p->pOr
15770 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70 4f 72  derBy);.  p->pOr
15780 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
15790 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
157a0 70 4c 69 6d 69 74 3b 0a 20 20 72 65 74 75 72 6e  pLimit;.  return
157b0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
157c0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f  LITE_OMIT_CTE */
157d0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
157e0 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69  erences */.stati
157f0 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
15800 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  tOrderBy(.  Pars
15810 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
15820 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
15830 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
15840 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
15850 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
15860 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
15870 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
15880 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
15890 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
158a0 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
158b0 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a  ults */.);../*.*
158c0 2a 20 48 61 6e 64 6c 65 20 74 68 65 20 73 70 65  * Handle the spe
158d0 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61 20 63  cial case of a c
158e0 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 74  ompound-select t
158f0 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66  hat originates f
15900 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45 53 20  rom a.** VALUES 
15910 63 6c 61 75 73 65 2e 20 20 42 79 20 68 61 6e 64  clause.  By hand
15920 6c 69 6e 67 20 74 68 69 73 20 61 73 20 61 20 73  ling this as a s
15930 70 65 63 69 61 6c 20 63 61 73 65 2c 20 77 65 20  pecial case, we 
15940 61 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20 72 65  avoid deep.** re
15950 63 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74 68 75  cursion, and thu
15960 73 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  s do not need to
15970 20 65 6e 66 6f 72 63 65 20 74 68 65 20 53 51 4c   enforce the SQL
15980 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55  ITE_LIMIT_COMPOU
15990 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f 6e 20  ND_SELECT.** on 
159a0 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 2e  a VALUES clause.
159b0 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65 20 74  .**.** Because t
159c0 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74  he Select object
159d0 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72 6f 6d   originates from
159e0 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65   a VALUES clause
159f0 3a 0a 2a 2a 20 20 20 28 31 29 20 54 68 65 72 65  :.**   (1) There
15a00 20 69 73 20 6e 6f 20 4c 49 4d 49 54 20 6f 72 20   is no LIMIT or 
15a10 4f 46 46 53 45 54 20 6f 72 20 65 6c 73 65 20 74  OFFSET or else t
15a20 68 65 72 65 20 69 73 20 61 20 4c 49 4d 49 54 20  here is a LIMIT 
15a30 6f 66 20 65 78 61 63 74 6c 79 20 31 0a 2a 2a 20  of exactly 1.** 
15a40 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d 73 20    (2) All terms 
15a50 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a 2a 2a  are UNION ALL.**
15a60 20 20 20 28 33 29 20 54 68 65 72 65 20 69 73 20     (3) There is 
15a70 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
15a80 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 4c 49  se.**.** The "LI
15a90 4d 49 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31  MIT of exactly 1
15aa0 22 20 63 61 73 65 20 6f 66 20 63 6f 6e 64 69 74  " case of condit
15ab0 69 6f 6e 20 28 31 29 20 63 6f 6d 65 73 20 61 62  ion (1) comes ab
15ac0 6f 75 74 20 77 68 65 6e 20 61 20 56 41 4c 55 45  out when a VALUE
15ad0 53 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 63 63 75  S.** clause occu
15ae0 72 73 20 77 69 74 68 69 6e 20 73 63 61 6c 61 72  rs within scalar
15af0 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65 78 3a   expression (ex:
15b00 20 22 53 45 4c 45 43 54 20 28 56 41 4c 55 45 53   "SELECT (VALUES
15b10 28 31 29 2c 28 32 29 2c 28 33 29 29 22 29 2e 0a  (1),(2),(3))")..
15b20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 43 6f  ** The sqlite3Co
15b30 64 65 53 75 62 73 65 6c 65 63 74 20 77 69 6c 6c  deSubselect will
15b40 20 68 61 76 65 20 61 64 64 65 64 20 74 68 65 20   have added the 
15b50 4c 49 4d 49 54 20 31 20 63 6c 61 75 73 65 20 69  LIMIT 1 clause i
15b60 6e 20 74 68 74 20 63 61 73 65 2e 0a 2a 2a 20 53  n tht case..** S
15b70 69 6e 63 65 20 74 68 65 20 6c 69 6d 69 74 20 69  ince the limit i
15b80 73 20 65 78 61 63 74 6c 79 20 31 2c 20 77 65 20  s exactly 1, we 
15b90 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 65 76 61  only need to eva
15ba0 6c 75 74 65 73 20 74 68 65 20 6c 65 66 74 2d 6d  lutes the left-m
15bb0 6f 73 74 20 56 41 4c 55 45 53 2e 0a 2a 2f 0a 73  ost VALUES..*/.s
15bc0 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
15bd0 65 6c 65 63 74 56 61 6c 75 65 73 28 0a 20 20 50  electValues(.  P
15be0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
15bf0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
15c00 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
15c10 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
15c20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
15c30 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20  most of SELECTs 
15c40 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
15c50 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
15c60 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
15c70 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
15c80 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
15c90 69 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20  int nRow = 1;.  
15ca0 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 6e  int rc = 0;.  in
15cb0 74 20 62 53 68 6f 77 41 6c 6c 20 3d 20 70 2d 3e  t bShowAll = p->
15cc0 70 4c 69 6d 69 74 3d 3d 30 3b 0a 20 20 61 73 73  pLimit==0;.  ass
15cd0 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
15ce0 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65   & SF_MultiValue
15cf0 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 61 73   );.  do{.    as
15d00 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
15d10 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29 3b  s & SF_Values );
15d20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
15d30 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 28 70  op==TK_ALL || (p
15d40 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
15d50 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 29  && p->pPrior==0)
15d60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15d70 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  p->pNext==0 || p
15d80 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  ->pEList->nExpr=
15d90 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73  =p->pNext->pELis
15da0 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20  t->nExpr );.    
15db0 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30  if( p->pPrior==0
15dc0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
15dd0 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 2d  sert( p->pPrior-
15de0 3e 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20 20 20  >pNext==p );.   
15df0 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a   p = p->pPrior;.
15e00 20 20 20 20 6e 52 6f 77 20 2b 3d 20 62 53 68 6f      nRow += bSho
15e10 77 41 6c 6c 3b 0a 20 20 7d 77 68 69 6c 65 28 31  wAll;.  }while(1
15e20 29 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72  );.  ExplainQuer
15e30 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 30  yPlan((pParse, 0
15e40 2c 20 22 53 43 41 4e 20 25 64 20 43 4f 4e 53 54  , "SCAN %d CONST
15e50 41 4e 54 20 52 4f 57 25 73 22 2c 20 6e 52 6f 77  ANT ROW%s", nRow
15e60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15e70 20 20 20 20 20 20 6e 52 6f 77 3d 3d 31 20 3f 20        nRow==1 ? 
15e80 22 22 20 3a 20 22 53 22 29 29 3b 0a 20 20 77 68  "" : "S"));.  wh
15e90 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 73 65  ile( p ){.    se
15ea0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
15eb0 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30 2c 20  arse, p, -1, 0, 
15ec0 30 2c 20 70 44 65 73 74 2c 20 31 2c 20 31 29 3b  0, pDest, 1, 1);
15ed0 0a 20 20 20 20 69 66 28 20 21 62 53 68 6f 77 41  .    if( !bShowA
15ee0 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ll ) break;.    
15ef0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
15f00 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20 70 2d  nRow;.    p = p-
15f10 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  >pNext;.  }.  re
15f20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15f30 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
15f40 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63  s called to proc
15f50 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71  ess a compound q
15f60 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a  uery form from.*
15f70 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65  * two or more se
15f80 70 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75  parate queries u
15f90 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f  sing UNION, UNIO
15fa0 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f  N ALL, EXCEPT, o
15fb0 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a  r.** INTERSECT.*
15fc0 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20  *.** "p" points 
15fd0 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
15fe0 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65  t of the two que
15ff0 72 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79  ries.  the query
16000 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20   on the.** left 
16010 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54  is p->pPrior.  T
16020 68 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f  he left query co
16030 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f  uld also be a co
16040 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20  mpound query.** 
16050 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
16060 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
16070 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73  be called recurs
16080 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ively. .**.** Th
16090 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
160a0 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65   total query are
160b0 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
160c0 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f  nto a destinatio
160d0 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65  n.** of type eDe
160e0 73 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65  st with paramete
160f0 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45  r iParm..**.** E
16100 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69  xample 1:  Consi
16110 64 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20  der a three-way 
16120 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61  compound SQL sta
16130 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  tement..**.**   
16140 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
16150 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t1 UNION SELECT 
16160 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20  b FROM t2 UNION 
16170 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33  SELECT c FROM t3
16180 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74  .**.** This stat
16190 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20  ement is parsed 
161a0 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  up as follows:.*
161b0 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20  *.**     SELECT 
161c0 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20  c FROM t3.**    
161d0 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d    |.**      `---
161e0 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52  -->  SELECT b FR
161f0 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20  OM t2.**        
16200 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
16210 20 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d              `---
16220 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46  --->  SELECT a F
16230 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65  ROM t1.**.** The
16240 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64   arrows in the d
16250 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70  iagram above rep
16260 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63  resent the Selec
16270 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72  t.pPrior pointer
16280 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20  ..** So if this 
16290 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
162a0 64 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74  d with p equal t
162b0 6f 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20  o the t3 query, 
162c0 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77  then.** pPrior w
162d0 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75  ill be the t2 qu
162e0 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c  ery.  p->op will
162f0 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20   be TK_UNION in 
16300 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
16310 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63   Notice that bec
16320 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20  ause of the way 
16330 53 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f  SQLite parses co
16340 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20  mpound SELECTs, 
16350 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
16360 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73  l selects always
16370 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74   group from left
16380 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74   to right..*/.st
16390 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65  atic int multiSe
163a0 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
163b0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
163c0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
163d0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
163e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
163f0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
16400 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
16410 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
16420 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
16430 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
16440 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
16450 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
16460 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f  = SQLITE_OK;   /
16470 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66  * Success code f
16480 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65  rom a subroutine
16490 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50   */.  Select *pP
164a0 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41  rior;       /* A
164b0 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d  nother SELECT im
164c0 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72  mediately to our
164d0 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20   left */.  Vdbe 
164e0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
164f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
16500 65 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  e to this VDBE *
16510 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64  /.  SelectDest d
16520 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74  est;      /* Alt
16530 65 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65  ernative data de
16540 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53  stination */.  S
16550 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d  elect *pDelete =
16560 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66   0;  /* Chain of
16570 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20   simple selects 
16580 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73  to delete */.  s
16590 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
165a0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
165b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
165c0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
165d0 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
165e0 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61   BY or LIMIT cla
165f0 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c  use on prior SEL
16600 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a  ECTs.  Only.  **
16610 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74   the last (right
16620 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e  -most) SELECT in
16630 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20   the series may 
16640 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
16650 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a   or LIMIT..  */.
16660 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70    assert( p && p
16670 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20  ->pPrior );  /* 
16680 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  Calling function
16690 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73   guarantees this
166a0 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72   much */.  asser
166b0 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
166c0 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 3d  & SF_Recursive)=
166d0 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  =0 || p->op==TK_
166e0 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b  ALL || p->op==TK
166f0 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d  _UNION );.  db =
16700 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
16710 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
16720 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65  r;.  dest = *pDe
16730 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72  st;.  if( pPrior
16740 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20 70 50  ->pOrderBy || pP
16750 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  rior->pLimit ){.
16760 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
16770 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73 20 63  Msg(pParse,"%s c
16780 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
16790 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
167a0 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 70 50  efore",.      pP
167b0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 21 3d  rior->pOrderBy!=
167c0 30 20 3f 20 22 4f 52 44 45 52 20 42 59 22 20 3a  0 ? "ORDER BY" :
167d0 20 22 4c 49 4d 49 54 22 2c 20 73 65 6c 65 63 74   "LIMIT", select
167e0 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a  OpName(p->op));.
167f0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
16800 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
16810 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20  t_end;.  }..  v 
16820 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
16830 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
16840 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20  rt( v!=0 );  /* 
16850 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79  The VDBE already
16860 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c   created by call
16870 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ing function */.
16880 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65  .  /* Create the
16890 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d   destination tem
168a0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20  porary table if 
168b0 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20  necessary.  */. 
168c0 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
168d0 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b  =SRT_EphemTab ){
168e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
168f0 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71  pEList );.    sq
16900 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16910 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
16920 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72  ral, dest.iSDPar
16930 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  m, p->pEList->nE
16940 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74 2e 65  xpr);.    dest.e
16950 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65  Dest = SRT_Table
16960 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63  ;.  }..  /* Spec
16970 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66 6f 72  ial handling for
16980 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65   a compound-sele
16990 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74  ct that originat
169a0 65 73 20 61 73 20 61 20 56 41 4c 55 45 53 20 63  es as a VALUES c
169b0 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  lause..  */.  if
169c0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
169d0 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20 29 7b  SF_MultiValue ){
169e0 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53  .    rc = multiS
169f0 65 6c 65 63 74 56 61 6c 75 65 73 28 70 50 61 72  electValues(pPar
16a00 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20  se, p, &dest);. 
16a10 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
16a20 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
16a30 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c   /* Make sure al
16a40 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65  l SELECTs in the
16a50 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20   statement have 
16a60 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
16a70 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a  of elements.  **
16a80 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74   in their result
16a90 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73   sets..  */.  as
16aa0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
16ab0 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  && pPrior->pELis
16ac0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
16ad0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  ->pEList->nExpr=
16ae0 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d  =pPrior->pEList-
16af0 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66 6e 64  >nExpr );..#ifnd
16b00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
16b10 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  TE.  if( p->selF
16b20 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
16b30 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  ive ){.    gener
16b40 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65  ateWithRecursive
16b50 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  Query(pParse, p,
16b60 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65   &dest);.  }else
16b70 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
16b80 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74  mpound SELECTs t
16b90 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45  hat have an ORDE
16ba0 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
16bb0 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
16bc0 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ly..  */.  if( p
16bd0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
16be0 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
16bf0 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72  lectOrderBy(pPar
16c00 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
16c10 20 7d 65 6c 73 65 7b 0a 0a 23 69 66 6e 64 65 66   }else{..#ifndef
16c20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
16c30 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70 50 72  LAIN.    if( pPr
16c40 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ior->pPrior==0 )
16c50 7b 0a 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51  {.      ExplainQ
16c60 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
16c70 2c 20 31 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 51  , 1, "COMPOUND Q
16c80 55 45 52 59 22 29 29 3b 0a 20 20 20 20 20 20 45  UERY"));.      E
16c90 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
16ca0 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4c 45 46  (pParse, 1, "LEF
16cb0 54 2d 4d 4f 53 54 20 53 55 42 51 55 45 52 59 22  T-MOST SUBQUERY"
16cc0 29 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ));.    }.#endif
16cd0 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
16ce0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 6c  e code for the l
16cf0 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53 45  eft and right SE
16d00 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
16d10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 77 69 74  .    */.    swit
16d20 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
16d30 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
16d40 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
16d50 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  dr = 0;.        
16d60 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20  int nLimit;.    
16d70 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
16d80 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20  ior->pLimit );. 
16d90 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69         pPrior->i
16da0 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69  Limit = p->iLimi
16db0 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f  t;.        pPrio
16dc0 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d 3e  r->iOffset = p->
16dd0 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  iOffset;.       
16de0 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20   pPrior->pLimit 
16df0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
16e00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16e10 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
16e20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a  pPrior, &dest);.
16e30 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69          p->pLimi
16e40 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  t = 0;.        i
16e50 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
16e60 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
16e70 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
16e80 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 70    }.        p->p
16e90 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  Prior = 0;.     
16ea0 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70     p->iLimit = p
16eb0 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20  Prior->iLimit;. 
16ec0 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65         p->iOffse
16ed0 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66  t = pPrior->iOff
16ee0 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  set;.        if(
16ef0 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
16f00 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
16f10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16f20 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 70 2d  (v, OP_IfNot, p-
16f30 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f  >iLimit); VdbeCo
16f40 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
16f50 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
16f60 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64  ((v, "Jump ahead
16f70 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65   if LIMIT reache
16f80 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d"));.          
16f90 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74 20 29  if( p->iOffset )
16fa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
16fb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16fc0 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69  v, OP_OffsetLimi
16fd0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ff0 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d 3e 69   p->iLimit, p->i
17000 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69 4f 66  Offset+1, p->iOf
17010 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  fset);.         
17020 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
17030 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
17040 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
17050 2c 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 29 29 3b  , "UNION ALL"));
17060 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
17070 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
17080 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20  se, p, &dest);. 
17090 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
170a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
170b0 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c 65 74  ;.        pDelet
170c0 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
170d0 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
170e0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
170f0 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
17100 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
17110 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  Add(p->nSelectRo
17120 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  w, pPrior->nSele
17130 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20  ctRow);.        
17140 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  if( pPrior->pLim
17150 69 74 0a 20 20 20 20 20 20 20 20 20 26 26 20 73  it.         && s
17160 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
17170 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  ger(pPrior->pLim
17180 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c 69 6d  it->pLeft, &nLim
17190 69 74 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  it).         && 
171a0 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e  nLimit>0 && p->n
171b0 53 65 6c 65 63 74 52 6f 77 20 3e 20 73 71 6c 69  SelectRow > sqli
171c0 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29 6e  te3LogEst((u64)n
171d0 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20 20 20  Limit) .        
171e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
171f0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c  nSelectRow = sql
17200 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34 29  ite3LogEst((u64)
17210 6e 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20  nLimit);.       
17220 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 61   }.        if( a
17230 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ddr ){.         
17240 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
17250 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
17260 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17270 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
17280 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58        case TK_EX
17290 43 45 50 54 3a 0a 20 20 20 20 20 20 63 61 73 65  CEPT:.      case
172a0 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20   TK_UNION: {.   
172b0 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61       int unionTa
172c0 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  b;    /* Cursor 
172d0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65  number of the te
172e0 6d 70 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67  mp table holding
172f0 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20   result */.     
17300 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20     u8 op = 0;   
17310 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
17320 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
17330 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65  s to apply to se
17340 6c 66 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  lf */.        in
17350 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f  t priorOp;     /
17360 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61  * The SRT_ opera
17370 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f  tion to apply to
17380 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a   prior selects *
17390 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
173a0 70 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 53 61  pLimit;    /* Sa
173b0 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d  ved values of p-
173c0 3e 6e 4c 69 6d 69 74 20 20 2a 2f 0a 20 20 20 20  >nLimit  */.    
173d0 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
173e0 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
173f0 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 20 20 0a 20   uniondest;.  . 
17400 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
17410 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
17420 54 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  T );.        tes
17430 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b  tcase( p->op==TK
17440 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20  _UNION );.      
17450 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54 5f    priorOp = SRT_
17460 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69  Union;.        i
17470 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70  f( dest.eDest==p
17480 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20  riorOp ){.      
17490 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72 65      /* We can re
174a0 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  use a temporary 
174b0 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
174c0 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20 6f  by a SELECT to o
174d0 75 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ur.          ** 
174e0 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 20  right..         
174f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
17500 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d  sert( p->pLimit=
17510 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  =0 );      /* No
17520 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66  t allowed on lef
17530 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a  tward elements *
17540 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 6f  /.          unio
17550 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50  nTab = dest.iSDP
17560 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  arm;.        }el
17570 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
17580 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f   We will need to
17590 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20   create our own 
175a0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
175b0 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20  to hold the.    
175c0 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d 65        ** interme
175d0 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a 20  diate results.. 
175e0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
175f0 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
17600 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
17610 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
17620 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
17630 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
17640 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
17650 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
17660 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69  enEphemeral, uni
17670 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
17680 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
17690 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
176a0 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  == -1 );.       
176b0 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
176c0 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[0] = addr;.  
176d0 20 20 20 20 20 20 20 20 66 69 6e 64 52 69 67 68          findRigh
176e0 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61  tmost(p)->selFla
176f0 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
17700 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 20 20  emeral;.        
17710 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
17720 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  ist );.        }
17730 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  .  .        /* C
17740 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
17750 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
17760 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2f   left.        */
17770 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17780 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72   !pPrior->pOrder
17790 42 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  By );.        sq
177a0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
177b0 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20  nit(&uniondest, 
177c0 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61  priorOp, unionTa
177d0 62 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  b);.        rc =
177e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
177f0 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
17800 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20  uniondest);.    
17810 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
17820 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
17830 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
17840 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20         }.  .    
17850 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
17860 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73  current SELECT s
17870 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 20  tatement.       
17880 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
17890 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
178a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 70   ){.          op
178b0 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20   = SRT_Except;. 
178c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
178d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
178e0 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
178f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20  );.          op 
17900 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20  = SRT_Union;.   
17910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
17920 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
17930 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
17940 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
17950 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
17960 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 64 65  .        unionde
17970 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20  st.eDest = op;. 
17980 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75         ExplainQu
17990 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
179a0 20 31 2c 20 22 25 73 20 55 53 49 4e 47 20 54 45   1, "%s USING TE
179b0 4d 50 20 42 2d 54 52 45 45 22 2c 0a 20 20 20 20  MP B-TREE",.    
179c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179d0 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
179e0 6d 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20 20 20  me(p->op)));.   
179f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17a00 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
17a10 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  p, &uniondest);.
17a20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
17a30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17a40 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 51 75  );.        /* Qu
17a50 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69  ery flattening i
17a60 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  n sqlite3Select(
17a70 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70  ) might refill p
17a80 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20  ->pOrderBy..    
17a90 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20 74      ** Be sure t
17aa0 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64  o delete p->pOrd
17ab0 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65 2c  erBy, therefore,
17ac0 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f   to avoid a memo
17ad0 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20  ry leak. */.    
17ae0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
17af0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
17b00 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
17b10 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
17b20 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
17b30 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
17b40 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ior;.        p->
17b50 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
17b60 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d        if( p->op=
17b70 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
17b80 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
17b90 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  tRow = sqlite3Lo
17ba0 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65  gEstAdd(p->nSele
17bb0 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e  ctRow, pPrior->n
17bc0 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20  SelectRow);.    
17bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
17be0 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
17bf0 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
17c00 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69          p->pLimi
17c10 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
17c20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
17c30 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f  0;.        p->iO
17c40 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 0a 20 20  ffset = 0;.  .  
17c50 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
17c60 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68 65   the data in the
17c70 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
17c80 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
17c90 6f 72 6d 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  orm.        ** i
17ca0 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
17cb0 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
17cc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17cd0 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62  assert( unionTab
17ce0 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c  ==dest.iSDParm |
17cf0 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  | dest.eDest!=pr
17d00 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 20  iorOp );.       
17d10 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21   if( dest.eDest!
17d20 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
17d30 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c        int iCont,
17d40 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b   iBreak, iStart;
17d50 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
17d60 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
17d70 20 20 20 20 20 20 20 20 20 20 69 42 72 65 61 6b            iBreak
17d80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
17d90 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
17da0 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
17db0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
17dc0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  el(v);.         
17dd0 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
17de0 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
17df0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
17e00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
17e10 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
17e20 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ind, unionTab, i
17e30 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
17e40 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
17e50 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
17e60 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
17e70 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  dr(v);.         
17e80 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
17e90 28 70 50 61 72 73 65 2c 20 70 2c 20 75 6e 69 6f  (pParse, p, unio
17ea0 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20 20 20  nTab,.          
17eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ec0 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f  0, 0, &dest, iCo
17ed0 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  nt, iBreak);.   
17ee0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17ef0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
17f00 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
17f10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17f20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
17f30 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61  , unionTab, iSta
17f40 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  rt); VdbeCoverag
17f50 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(v);.          
17f60 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
17f70 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
17f80 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  k);.          sq
17f90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17fa0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69  v, OP_Close, uni
17fb0 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
17fc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
17fd0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
17fe0 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73 65 72    default: asser
17ff0 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  t( p->op==TK_INT
18000 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20 20 20  ERSECT ); {.    
18010 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
18020 62 32 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  b2;.        int 
18030 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69  iCont, iBreak, i
18040 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 45  Start;.        E
18050 78 70 72 20 2a 70 4c 69 6d 69 74 3b 0a 20 20 20  xpr *pLimit;.   
18060 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
18070 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73         SelectDes
18080 74 20 69 6e 74 65 72 73 65 63 74 64 65 73 74 3b  t intersectdest;
18090 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 3b  .        int r1;
180a0 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  .  .        /* I
180b0 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
180c0 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
180d0 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
180e0 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 20 20  equires.        
180f0 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
18100 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
18110 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
18120 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
18130 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
18140 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
18150 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
18160 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
18170 20 74 61 62 31 20 3d 20 70 50 61 72 73 65 2d 3e   tab1 = pParse->
18180 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
18190 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
181a0 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Tab++;.        a
181b0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
181c0 42 79 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20  By==0 );.  .    
181d0 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
181e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
181f0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
18200 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
18210 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
18220 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
18230 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  = -1 );.        
18240 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
18250 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
18260 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74     findRightmost
18270 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  (p)->selFlags |=
18280 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
18290 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  l;.        asser
182a0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
182b0 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f    .        /* Co
182c0 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
182d0 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
182e0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
182f0 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 20 20  "tab1"..        
18300 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
18310 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
18320 28 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c  (&intersectdest,
18330 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31   SRT_Union, tab1
18340 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
18350 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
18360 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69  arse, pPrior, &i
18370 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20  ntersectdest);. 
18380 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
18390 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
183a0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
183b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20  ;.        }.  . 
183c0 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
183d0 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43  he current SELEC
183e0 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79  T into temporary
183f0 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20   table "tab2".  
18400 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
18410 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
18420 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18430 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
18440 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ab2, 0);.       
18450 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
18460 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d  OpenEphm[1] == -
18470 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
18480 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
18490 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20  = addr;.        
184a0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
184b0 20 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20         pLimit = 
184c0 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20  p->pLimit;.     
184d0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
184e0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 73  ;.        inters
184f0 65 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d 20  ectdest.iSDParm 
18500 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 20 20  = tab2;.        
18510 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
18520 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 25 73  ((pParse, 1, "%s
18530 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52   USING TEMP B-TR
18540 45 45 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EE",.           
18550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
18560 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
18570 70 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  p)));.        rc
18580 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
18590 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74  (pParse, p, &int
185a0 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
185b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
185c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
185d0 20 20 20 20 20 20 20 20 70 44 65 6c 65 74 65 20          pDelete 
185e0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
185f0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
18600 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20   pPrior;.       
18610 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
18620 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  ow>pPrior->nSele
18630 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  ctRow ){.       
18640 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
18650 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   = pPrior->nSele
18660 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d  ctRow;.        }
18670 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18680 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
18690 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  ->pLimit);.     
186a0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
186b0 4c 69 6d 69 74 3b 0a 20 20 0a 20 20 20 20 20 20  Limit;.  .      
186c0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
186d0 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69  de to take the i
186e0 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74  ntersection of t
186f0 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  he two temporary
18700 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
18710 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
18720 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
18730 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
18740 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
18750 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18760 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43  l(v);.        iC
18770 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
18780 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
18790 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69         computeLi
187a0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
187b0 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
187c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
187d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
187e0 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69  _Rewind, tab1, i
187f0 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65  Break); VdbeCove
18800 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
18810 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
18820 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
18830 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20  .        iStart 
18840 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
18850 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74  Op2(v, OP_RowDat
18860 61 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20  a, tab1, r1);.  
18870 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18880 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
18890 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c  _NotFound, tab2,
188a0 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 0a   iCont, r1, 0);.
188b0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
188c0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
188d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
188e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
188f0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65  1);.        sele
18900 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
18910 73 65 2c 20 70 2c 20 74 61 62 31 2c 0a 20 20 20  se, p, tab1,.   
18920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18930 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74       0, 0, &dest
18940 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
18950 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18960 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
18970 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20  l(v, iCont);.   
18980 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18990 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
189a0 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74 29  t, tab1, iStart)
189b0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
189c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
189d0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
189e0 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20  el(v, iBreak);. 
189f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18a00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
18a10 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a  lose, tab2, 0);.
18a20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18a30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18a40 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b  Close, tab1, 0);
18a50 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
18a60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18a70 0a 20 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  .  #ifndef SQLIT
18a80 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
18a90 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d     if( p->pNext=
18aa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 6c  =0 ){.      Expl
18ab0 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70 28  ainQueryPlanPop(
18ac0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
18ad0 20 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 0a 20   #endif.  }.  . 
18ae0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c   /* Compute coll
18af0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
18b00 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65  used by .  ** te
18b10 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e  mporary tables n
18b20 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65  eeded to impleme
18b30 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  nt the compound 
18b40 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74  select..  ** Att
18b50 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  ach the KeyInfo 
18b60 73 74 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c  structure to all
18b70 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
18b80 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  s..  **.  ** Thi
18b90 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e  s section is run
18ba0 20 62 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   by the right-mo
18bb0 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
18bc0 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53  ent only..  ** S
18bd0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
18be0 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77   to the left alw
18bf0 61 79 73 20 73 6b 69 70 20 74 68 69 73 20 70 61  ays skip this pa
18c00 72 74 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d  rt.  The right-m
18c10 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20  ost.  ** SELECT 
18c20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20  might also skip 
18c30 74 68 69 73 20 70 61 72 74 20 69 66 20 69 74 20  this part if it 
18c40 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20  has no ORDER BY 
18c50 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20  clause and.  ** 
18c60 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61  no temp tables a
18c70 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  re required..  *
18c80 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
18c90 61 67 73 20 26 20 53 46 5f 55 73 65 73 45 70 68  ags & SF_UsesEph
18ca0 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e  emeral ){.    in
18cb0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
18cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
18cd0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
18ce0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
18cf0 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
18d00 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
18d10 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72  quence for the r
18d20 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20  esult set */.   
18d30 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20   Select *pLoop; 
18d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18d50 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
18d60 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73 74 61  rough SELECT sta
18d70 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43  tements */.    C
18d80 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b  ollSeq **apColl;
18d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18da0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
18db0 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  ugh pKeyInfo->aC
18dc0 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74  oll[] */.    int
18dd0 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   nCol;          
18de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
18df0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
18e00 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  in result set */
18e10 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ..    assert( p-
18e20 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20  >pNext==0 );.   
18e30 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73   nCol = p->pELis
18e40 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b  t->nExpr;.    pK
18e50 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
18e60 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
18e70 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69   nCol, 1);.    i
18e80 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  f( !pKeyInfo ){.
18e90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18ea0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
18eb0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
18ec0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
18ed0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 61 70  .    for(i=0, ap
18ee0 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61  Coll=pKeyInfo->a
18ef0 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  Coll; i<nCol; i+
18f00 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20  +, apColl++){.  
18f10 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75      *apColl = mu
18f20 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
18f30 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
18f40 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a 61 70        if( 0==*ap
18f50 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
18f60 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  *apColl = db->pD
18f70 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  fltColl;.      }
18f80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
18f90 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20  pLoop=p; pLoop; 
18fa0 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72  pLoop=pLoop->pPr
18fb0 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ior){.      for(
18fc0 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
18fd0 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
18fe0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70   = pLoop->addrOp
18ff0 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20  enEphm[i];.     
19000 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b     if( addr<0 ){
19010 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
19020 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74   [0] is unused t
19030 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20  hen [1] is also 
19040 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63  unused.  So we c
19050 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  an.          ** 
19060 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62  always safely ab
19070 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ort as soon as t
19080 68 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20  he first unused 
19090 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f  slot is found */
190a0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
190b0 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70  t( pLoop->addrOp
190c0 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20  enEphm[1]<0 );. 
190d0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
190e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
190f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
19100 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e  ngeP2(v, addr, n
19110 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
19120 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
19130 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72  4(v, addr, (char
19140 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
19150 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 0a 20  Ref(pKeyInfo),. 
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19170 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45             P4_KE
19180 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
19190 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
191a0 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[i] = -1;.   
191b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
191c0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
191d0 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  ef(pKeyInfo);.  
191e0 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  }..multi_select_
191f0 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53  end:.  pDest->iS
19200 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74  dst = dest.iSdst
19210 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  ;.  pDest->nSdst
19220 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20   = dest.nSdst;. 
19230 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
19240 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65  lete(db, pDelete
19250 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19260 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
19270 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
19280 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a  _SELECT */../*.*
19290 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * Error message 
192a0 66 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f 72 20  for when two or 
192b0 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20 61 20  more terms of a 
192c0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
192d0 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
192e0 2a 20 73 69 7a 65 20 72 65 73 75 6c 74 20 73 65  * size result se
192f0 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ts..*/.void sqli
19300 74 65 33 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75  te3SelectWrongNu
19310 6d 54 65 72 6d 73 45 72 72 6f 72 28 50 61 72 73  mTermsError(Pars
19320 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
19330 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  t *p){.  if( p->
19340 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61  selFlags & SF_Va
19350 6c 75 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  lues ){.    sqli
19360 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
19370 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20  se, "all VALUES 
19380 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61  must have the sa
19390 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72  me number of ter
193a0 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ms");.  }else{. 
193b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
193c0 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45  sg(pParse, "SELE
193d0 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
193e0 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22  and right of %s"
193f0 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20  .      " do not 
19400 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
19410 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
19420 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f  olumns", selectO
19430 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
19440 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
19450 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f   an output subro
19460 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f  utine for a coro
19470 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61  utine implementa
19480 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c  tion of a.** SEL
19490 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a  ECT statment..**
194a0 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20  .** The data to 
194b0 62 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e  be output is con
194c0 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69  tained in pIn->i
194d0 53 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65  Sdst.  There are
194e0 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63  .** pIn->nSdst c
194f0 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74  olumns to be out
19500 70 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77  put.  pDest is w
19510 68 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20  here the output 
19520 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e  should.** be sen
19530 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75  t..**.** regRetu
19540 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  rn is the number
19550 20 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72   of the register
19560 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62   holding the sub
19570 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
19580 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a  n address..**.**
19590 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68   If regPrev>0 th
195a0 65 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72  en it is the fir
195b0 73 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61  st register in a
195c0 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20   vector that.** 
195d0 72 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76  records the prev
195e0 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65  ious output.  me
195f0 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20  m[regPrev] is a 
19600 66 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c  flag that is fal
19610 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68  se.** if there h
19620 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69  as been no previ
19630 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20  ous output.  If 
19640 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63  regPrev>0 then c
19650 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61  ode is.** genera
19660 74 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20  ted to suppress 
19670 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65  duplicates.  pKe
19680 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f  yInfo is used fo
19690 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b  r comparing.** k
196a0 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  eys..**.** If th
196b0 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e  e LIMIT found in
196c0 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65   p->iLimit is re
196d0 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65  ached, jump imme
196e0 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42  diately to.** iB
196f0 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reak..*/.static 
19700 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70  int generateOutp
19710 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20  utSubroutine(.  
19720 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
19730 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
19740 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
19750 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
19760 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
19770 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
19780 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
19790 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20  *pIn,        /* 
197a0 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79  Coroutine supply
197b0 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65  ing data */.  Se
197c0 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
197d0 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
197e0 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20  o send the data 
197f0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75  */.  int regRetu
19800 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rn,          /* 
19810 54 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65  The return addre
19820 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  ss register */. 
19830 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20   int regPrev,   
19840 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
19850 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69  ious result regi
19860 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65  ster.  No unique
19870 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b  ness if 0 */.  K
19880 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
19890 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f  ,      /* For co
198a0 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65  mparing with pre
198b0 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20  vious entry */. 
198c0 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20   int iBreak     
198d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
198e0 20 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20   here if we hit 
198f0 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a  the LIMIT */.){.
19900 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
19910 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
19920 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e   iContinue;.  in
19930 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20  t addr;..  addr 
19940 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
19950 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
19960 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74  Continue = sqlit
19970 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
19980 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65  v);..  /* Suppre
19990 73 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f  ss duplicates fo
199a0 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  r UNION, EXCEPT,
199b0 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a   and INTERSECT .
199c0 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72    */.  if( regPr
199d0 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  ev ){.    int ad
199e0 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20  dr1, addr2;.    
199f0 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
19a00 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
19a10 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29 3b  IfNot, regPrev);
19a20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19a30 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  ;.    addr2 = sq
19a40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
19a50 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70  v, OP_Compare, p
19a60 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72  In->iSdst, regPr
19a70 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  ev+1, pIn->nSdst
19a80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19aa0 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65  (char*)sqlite3Ke
19ab0 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66  yInfoRef(pKeyInf
19ac0 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  o), P4_KEYINFO);
19ad0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19ae0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
19af0 70 2c 20 61 64 64 72 32 2b 32 2c 20 69 43 6f 6e  p, addr2+2, iCon
19b00 74 69 6e 75 65 2c 20 61 64 64 72 32 2b 32 29 3b  tinue, addr2+2);
19b10 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
19b20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19b30 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
19b40 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r1);.    sqlite3
19b50 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
19b60 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73  _Copy, pIn->iSds
19b70 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49  t, regPrev+1, pI
19b80 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20  n->nSdst-1);.   
19b90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19ba0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
19bb0 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 1, regPrev);. 
19bc0 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d   }.  if( pParse-
19bd0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
19be0 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  d ) return 0;.. 
19bf0 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65   /* Suppress the
19c00 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e   first OFFSET en
19c10 74 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69  tries if there i
19c20 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75  s an OFFSET clau
19c30 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66  se.  */.  codeOf
19c40 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
19c50 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
19c60 0a 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74  .  assert( pDest
19c70 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69  ->eDest!=SRT_Exi
19c80 73 74 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  sts );.  assert(
19c90 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
19ca0 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 73 77  RT_Table );.  sw
19cb0 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65  itch( pDest->eDe
19cc0 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f  st ){.    /* Sto
19cd0 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
19ce0 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
19cf0 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
19d00 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
19d10 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
19d20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
19d30 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
19d40 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32  e);.      int r2
19d50 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
19d60 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
19d70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19d80 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
19d90 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64  Record, pIn->iSd
19da0 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20  st, pIn->nSdst, 
19db0 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
19dc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
19dd0 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65  OP_NewRowid, pDe
19de0 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29  st->iSDParm, r2)
19df0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19e00 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
19e10 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69  Insert, pDest->i
19e20 53 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b  SDParm, r1, r2);
19e30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
19e40 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
19e50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
19e60 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
19e70 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
19e80 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
19e90 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
19ea0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
19eb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19ec0 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
19ed0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
19ee0 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
19ef0 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  e creating a set
19f00 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e   for an "expr IN
19f10 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2e 0a   (SELECT ...)"..
19f20 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
19f30 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
19f40 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 74   int r1;.      t
19f50 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e 6e 53  estcase( pIn->nS
19f60 64 73 74 3e 31 20 29 3b 0a 20 20 20 20 20 20 72  dst>1 );.      r
19f70 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
19f80 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
19f90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19fa0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp4(v, OP_Mak
19fb0 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53  eRecord, pIn->iS
19fc0 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c  dst, pIn->nSdst,
19fd0 20 0a 20 20 20 20 20 20 20 20 20 20 72 31 2c 20   .          r1, 
19fe0 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 2c  pDest->zAffSdst,
19ff0 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
1a000 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1a010 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
1a020 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e  ge(pParse, pIn->
1a030 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
1a040 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1a050 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
1a060 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
1a070 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
1a080 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r1,.            
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1a0a0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
1a0b0 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
1a0c0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
1a0d0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
1a0e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a0f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1a100 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
1a110 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
1a120 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
1a130 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
1a140 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
1a150 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
1a160 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
1a170 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
1a180 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
1a190 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
1a1a0 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
1a1b0 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
1a1c0 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31  t( pIn->nSdst==1
1a1d0 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
1a1e0 3e 30 20 29 3b 20 20 74 65 73 74 63 61 73 65 28  >0 );  testcase(
1a1f0 20 70 49 6e 2d 3e 6e 53 64 73 74 21 3d 31 20 29   pIn->nSdst!=1 )
1a200 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1a210 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
1a220 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
1a230 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
1a240 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  1);.      /* The
1a250 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
1a260 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
1a270 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
1a280 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
1a290 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
1a2a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a2b0 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
1a2c0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
1a2d0 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
1a2e0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
1a2f0 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
1a300 73 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73  starting at pDes
1a310 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20  t->iSdst.  Then 
1a320 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79  the co-routine y
1a330 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ields..    */.  
1a340 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
1a350 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66  tine: {.      if
1a360 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d  ( pDest->iSdst==
1a370 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
1a380 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69  st->iSdst = sqli
1a390 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
1a3a0 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64  pParse, pIn->nSd
1a3b0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65  st);.        pDe
1a3c0 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d  st->nSdst = pIn-
1a3d0 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a  >nSdst;.      }.
1a3e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a3f0 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
1a400 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44  , pIn->iSdst, pD
1a410 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  est->iSdst, pIn-
1a420 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  >nSdst);.      s
1a430 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1a440 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44  (v, OP_Yield, pD
1a450 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20  est->iSDParm);. 
1a460 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a470 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e  }..    /* If non
1a480 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20  e of the above, 
1a490 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
1a4a0 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74  destination must
1a4b0 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f   be.    ** SRT_O
1a4c0 75 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75  utput.  This rou
1a4d0 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
1a4e0 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74  lled with any ot
1a4f0 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69  her.    ** desti
1a500 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  nation other tha
1a510 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c  n the ones handl
1a520 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f  ed above or SRT_
1a530 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20  Output..    **. 
1a540 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75     ** For SRT_Ou
1a550 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72  tput, results ar
1a560 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65  e stored in a se
1a570 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74  quence of regist
1a580 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68  ers.  .    ** Th
1a590 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74  en the OP_Result
1a5a0 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73  Row opcode is us
1a5b0 65 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69  ed to cause sqli
1a5c0 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20  te3_step() to.  
1a5d0 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20    ** return the 
1a5e0 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75  next row of resu
1a5f0 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  lt..    */.    d
1a600 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
1a610 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65  assert( pDest->e
1a620 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
1a630 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1a640 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a650 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e  P_ResultRow, pIn
1a660 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
1a670 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
1a680 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1a690 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
1a6a0 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  e, pIn->iSdst, p
1a6b0 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  In->nSdst);.    
1a6c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1a6d0 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f   }..  /* Jump to
1a6e0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1a6f0 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49  loop if the LIMI
1a700 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20  T is reached..  
1a710 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  */.  if( p->iLim
1a720 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
1a730 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a740 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f 2c 20  P_DecrJumpZero, 
1a750 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61  p->iLimit, iBrea
1a760 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  k); VdbeCoverage
1a770 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  (v);.  }..  /* G
1a780 65 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72  enerate the subr
1a790 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20  outine return.  
1a7a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1a7b0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1a7c0 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71  iContinue);.  sq
1a7d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1a7e0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
1a7f0 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74  gReturn);..  ret
1a800 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
1a810 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63  ** Alternative c
1a820 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63  ompound select c
1a830 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f  ode generator fo
1a840 72 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65  r cases when the
1a850 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45  re.** is an ORDE
1a860 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  R BY clause..**.
1a870 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71  ** We assume a q
1a880 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c  uery of the foll
1a890 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  owing form:.**.*
1a8a0 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e  *      <selectA>
1a8b0 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73    <operator>  <s
1a8c0 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42  electB>  ORDER B
1a8d0 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a  Y <orderbylist>.
1a8e0 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  **.** <operator>
1a8f0 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e   is one of UNION
1a900 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43   ALL, UNION, EXC
1a910 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43  EPT, or INTERSEC
1a920 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20  T.  The idea.** 
1a930 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20  is to code both 
1a940 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73  <selectA> and <s
1a950 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65  electB> with the
1a960 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1a970 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e   as.** co-routin
1a980 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68  es.  Then run th
1a990 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e  e co-routines in
1a9a0 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65   parallel and me
1a9b0 72 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  rge the results.
1a9c0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ** into the outp
1a9d0 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  ut.  In addition
1a9e0 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f   to the two coro
1a9f0 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73  utines (called s
1aa00 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65  electA and.** se
1aa10 6c 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65  lectB) there are
1aa20 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a   7 subroutines:.
1aa30 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20  **.**    outA:  
1aa40 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
1aa50 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41  t of the selectA
1aa60 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
1aa70 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
1aa80 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
1aa90 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
1aaa0 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20  .**.**    outB: 
1aab0 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70     Move the outp
1aac0 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ut of the select
1aad0 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f  B coroutine into
1aae0 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20   the output.**  
1aaf0 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
1ab00 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
1ab10 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74  .  (Only generat
1ab20 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64  ed for UNION and
1ab30 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1ab40 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45  UNION ALL.  EXCE
1ab50 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43  PT and INSERTSEC
1ab60 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61  T never output a
1ab70 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20   row that.**    
1ab80 20 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73           appears
1ab90 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a   only in B.).**.
1aba0 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43  **    AltB:    C
1abb0 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
1abc0 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
1abd0 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
1abe0 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  d A<B..**.**    
1abf0 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AeqB:    Called 
1ac00 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
1ac10 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
1ac20 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42  outines and A==B
1ac30 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a  ..**.**    AgtB:
1ac40 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
1ac50 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
1ac60 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
1ac70 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a  es and A>B..**.*
1ac80 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61  *    EofA:    Ca
1ac90 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
1aca0 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
1acb0 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20   selectA..**.** 
1acc0 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c     EofB:    Call
1acd0 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20  ed when data is 
1ace0 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73  exhausted from s
1acf0 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68  electB..**.** Th
1ad00 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1ad10 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66   of the latter f
1ad20 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20  ive subroutines 
1ad30 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20  depend on which 
1ad40 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69  .** <operator> i
1ad50 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a  s used:.**.**.**
1ad60 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49               UNI
1ad70 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55  ON ALL         U
1ad80 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20  NION            
1ad90 45 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20  EXCEPT          
1ada0 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20  INTERSECT.**    
1adb0 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
1adc0 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
1add0 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
1ade0 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
1adf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41  ---------.**   A
1ae00 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ltB:   outA, nex
1ae10 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
1ae20 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
1ae30 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65  nextA         ne
1ae40 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42  xtA.**.**   AeqB
1ae50 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
1ae60 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20          nextA   
1ae70 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20            nextA 
1ae80 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65          outA, ne
1ae90 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42  xtA.**.**   AgtB
1aea0 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20  :   outB, nextB 
1aeb0 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42       outB, nextB
1aec0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20            nextB 
1aed0 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42             nextB
1aee0 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20  .**.**   EofA:  
1aef0 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
1af00 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
1af10 20 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20         halt     
1af20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a          halt.**.
1af30 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74  **   EofB:   out
1af40 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75  A, nextA      ou
1af50 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
1af60 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
1af70 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49      halt.**.** I
1af80 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42  n the AltB, AeqB
1af90 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f  , and AgtB subro
1afa0 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f  utines, an EOF o
1afb0 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n A following ne
1afc0 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e  xtA.** causes an
1afd0 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
1afe0 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45  to EofA and an E
1aff0 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e  OF on B followin
1b000 67 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a  g nextB causes.*
1b010 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a  * an immediate j
1b020 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69  ump to EofB.  Wi
1b030 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f  thin EofA and Eo
1b040 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65  fB, and EOF on e
1b050 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f  ntry or.** follo
1b060 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65  wing nextX cause
1b070 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  s a jump to the 
1b080 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63  end of the selec
1b090 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  t processing..**
1b0a0 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65  .** Duplicate re
1b0b0 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49  moval in the UNI
1b0c0 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
1b0d0 49 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20  INTERSECT cases 
1b0e0 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69  is handled.** wi
1b0f0 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  thin the output 
1b100 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  subroutine.  The
1b110 20 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65   regPrev registe
1b120 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20  r set holds the 
1b130 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75  previously.** ou
1b140 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63  tput value.  A c
1b150 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64  omparison is mad
1b160 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76  e against this v
1b170 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74  alue and the out
1b180 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65  put.** is skippe
1b190 64 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65  d if the next re
1b1a0 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74  sults would be t
1b1b0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70  he same as the p
1b1c0 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54  revious..**.** T
1b1d0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
1b1e0 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70  n plan is to imp
1b1f0 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63  lement the two c
1b200 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65  oroutines and se
1b210 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e  ven.** subroutin
1b220 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70  es first, then p
1b230 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c  ut the control l
1b240 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74  ogic at the bott
1b250 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a  om.  Like this:.
1b260 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67  **.**          g
1b270 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20  oto Init.**     
1b280 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66  coA: coroutine f
1b290 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41  or left query (A
1b2a0 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f  ).**     coB: co
1b2b0 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68  routine for righ
1b2c0 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20  t query (B).**  
1b2d0 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f    outA: output o
1b2e0 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20  ne row of A.**  
1b2f0 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f    outB: output o
1b300 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49  ne row of B (UNI
1b310 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c  ON and UNION ALL
1b320 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66   only).**    Eof
1b330 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66  A: ....**    Eof
1b340 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74  B: ....**    Alt
1b350 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71  B: ....**    Aeq
1b360 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74  B: ....**    Agt
1b370 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69  B: ....**    Ini
1b380 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f  t: initialize co
1b390 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72  routine register
1b3a0 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  s.**          yi
1b3b0 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20  eld coA.**      
1b3c0 20 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f      if eof(A) go
1b3d0 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20  to EofA.**      
1b3e0 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a      yield coB.**
1b3f0 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66            if eof
1b400 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a  (B) goto EofB.**
1b410 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72      Cmpr: Compar
1b420 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20  e A, B.**       
1b430 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65     Jump AltB, Ae
1b440 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20  qB, AgtB.**     
1b450 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57  End: ....**.** W
1b460 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71  e call AltB, Aeq
1b470 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61  B, AgtB, EofA, a
1b480 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74  nd EofB "subrout
1b490 69 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61  ines" but they a
1b4a0 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c  re not.** actual
1b4b0 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20  ly called using 
1b4c0 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64  Gosub and they d
1b4d0 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45  o not Return.  E
1b4e0 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f  ofA and EofB loo
1b4f0 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64  p.** until all d
1b500 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
1b510 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68   then jump to th
1b520 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41  e "end" labe.  A
1b530 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e  ltB, AeqB,.** an
1b540 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65  d AgtB jump to e
1b550 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f  ither L2 or to o
1b560 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f  ne of EofA or Eo
1b570 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  fB..*/.#ifndef S
1b580 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
1b590 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69  UND_SELECT.stati
1b5a0 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
1b5b0 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  tOrderBy(.  Pars
1b5c0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1b5d0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1b5e0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
1b5f0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1b600 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
1b610 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
1b620 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
1b630 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
1b640 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
1b650 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
1b660 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
1b670 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
1b680 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1b690 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ers */.  Select 
1b6a0 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f  *pPrior;       /
1b6b0 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
1b6c0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
1b6d0 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
1b6e0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
1b6f0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
1b700 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
1b710 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  E */.  SelectDes
1b720 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20  t destA;     /* 
1b730 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  Destination for 
1b740 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20  coroutine A */. 
1b750 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
1b760 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  B;     /* Destin
1b770 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
1b780 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72  ine B */.  int r
1b790 65 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20  egAddrA;        
1b7a0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
1b7b0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
1b7c0 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
1b7d0 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20   int regAddrB;  
1b7e0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1b7f0 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  s register for s
1b800 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e  elect-B coroutin
1b810 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  e */.  int addrS
1b820 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20  electA;      /* 
1b830 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
1b840 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e  elect-A coroutin
1b850 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  e */.  int addrS
1b860 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20  electB;      /* 
1b870 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
1b880 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e  elect-B coroutin
1b890 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  e */.  int regOu
1b8a0 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tA;          /* 
1b8b0 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
1b8c0 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d   for the output-
1b8d0 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  A subroutine */.
1b8e0 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20    int regOutB;  
1b8f0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1b900 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
1b910 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
1b920 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b930 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20   addrOutA;      
1b940 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1b950 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75   the output-A su
1b960 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
1b970 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20  t addrOutB = 0; 
1b980 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1b990 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  f the output-B s
1b9a0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1b9b0 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20  nt addrEofA;    
1b9c0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1b9d0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d  of the select-A-
1b9e0 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75  exhausted subrou
1b9f0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1ba00 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20  drEofA_noB;     
1ba10 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64  /* Alternate add
1ba20 72 45 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e  rEofA if B is un
1ba30 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
1ba40 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20   int addrEofB;  
1ba50 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1ba60 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
1ba70 42 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  B-exhausted subr
1ba80 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1ba90 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20  addrAltB;       
1baa0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
1bab0 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69  the A<B subrouti
1bac0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
1bad0 41 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AeqB;         /*
1bae0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
1baf0 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  A==B subroutine 
1bb00 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74  */.  int addrAgt
1bb10 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
1bb20 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42  dress of the A>B
1bb30 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1bb40 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20   int regLimitA; 
1bb50 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20         /* Limit 
1bb60 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
1bb70 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72  ect-A */.  int r
1bb80 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20  egLimitB;       
1bb90 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
1bba0 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
1bbb0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76  */.  int regPrev
1bbc0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
1bbd0 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65  range of registe
1bbe0 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69  rs to hold previ
1bbf0 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  ous output */.  
1bc00 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20  int savedLimit; 
1bc10 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
1bc20 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69  alue of p->iLimi
1bc30 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  t */.  int saved
1bc40 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  Offset;      /* 
1bc50 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70  Saved value of p
1bc60 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69  ->iOffset */.  i
1bc70 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20  nt labelCmpr;   
1bc80 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
1bc90 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  r the start of t
1bca0 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74  he merge algorit
1bcb0 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  hm */.  int labe
1bcc0 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  lEnd;         /*
1bcd0 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65   Label for the e
1bce0 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c  nd of the overal
1bcf0 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f  l SELECT stmt */
1bd00 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20  .  int addr1;   
1bd10 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
1bd20 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68   instructions th
1bd30 61 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74  at get retargett
1bd40 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  ed */.  int op; 
1bd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bd60 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20   One of TK_ALL, 
1bd70 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
1bd80 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43  EPT, TK_INTERSEC
1bd90 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  T */.  KeyInfo *
1bda0 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20  pKeyDup = 0; /* 
1bdb0 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72  Comparison infor
1bdc0 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  mation for dupli
1bdd0 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a  cate removal */.
1bde0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d    KeyInfo *pKeyM
1bdf0 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61  erge;   /* Compa
1be00 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  rison informatio
1be10 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f  n for merging ro
1be20 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ws */.  sqlite3 
1be30 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *db;          /*
1be40 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
1be50 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69  tion */.  ExprLi
1be60 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
1be70 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
1be80 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
1be90 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
1bea0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
1beb0 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
1bec0 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
1bed0 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20   int *aPermute; 
1bee0 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e         /* Mappin
1bef0 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20  g from ORDER BY 
1bf00 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20  terms to result 
1bf10 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a  set columns */..
1bf20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
1bf30 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73  derBy!=0 );.  as
1bf40 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30  sert( pKeyDup==0
1bf50 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22   ); /* "Managed"
1bf60 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73   code needs this
1bf70 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e  .  Ticket #3382.
1bf80 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
1bf90 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61  e->db;.  v = pPa
1bfa0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
1bfb0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20  sert( v!=0 );   
1bfc0 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74      /* Already t
1bfd0 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20  hrown the error 
1bfe0 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61  if VDBE alloc fa
1bff0 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45  iled */.  labelE
1c000 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
1c010 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1c020 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69  labelCmpr = sqli
1c030 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1c040 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63  (v);...  /* Patc
1c050 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42  h up the ORDER B
1c060 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  Y clause.  */.  
1c070 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20  op = p->op;  .  
1c080 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
1c090 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
1c0a0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rior->pOrderBy==
1c0b0 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  0 );.  pOrderBy 
1c0c0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
1c0d0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
1c0e0 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  y );.  nOrderBy 
1c0f0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
1c100 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65  r;..  /* For ope
1c110 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61  rators other tha
1c120 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68  n UNION ALL we h
1c130 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ave to make sure
1c140 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f   that.  ** the O
1c150 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
1c160 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d  overs every term
1c170 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
1c180 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65  et.  Add.  ** te
1c190 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  rms to the ORDER
1c1a0 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65   BY clause as ne
1c1b0 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
1c1c0 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29  if( op!=TK_ALL )
1c1d0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64  {.    for(i=1; d
1c1e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
1c1f0 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69  =0 && i<=p->pELi
1c200 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1c210 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
1c220 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1c230 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  em;.      for(j=
1c240 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
1c250 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79  y->a; j<nOrderBy
1c260 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
1c270 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1c280 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
1c290 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  erByCol>0 );.   
1c2a0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1c2b0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
1c2c0 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =i ) break;.    
1c2d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
1c2e0 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  =nOrderBy ){.   
1c2f0 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
1c300 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
1c310 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29  , TK_INTEGER, 0)
1c320 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
1c330 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
1c340 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1c350 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1c360 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
1c370 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  alue;.        pN
1c380 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
1c390 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4f 72  ;.        p->pOr
1c3a0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1c3b0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
1c3c0 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
1c3d0 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29   pOrderBy, pNew)
1c3e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
1c3f0 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42  rderBy ) pOrderB
1c400 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d  y->a[nOrderBy++]
1c410 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
1c420 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20   = (u16)i;.     
1c430 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1c440 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
1c450 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74  omparison permut
1c460 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66  ation and keyinf
1c470 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77  o that is used w
1c480 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72  ith.  ** the per
1c490 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f  mutation used to
1c4a0 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
1c4b0 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20  e next.  ** row 
1c4c0 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73  of results comes
1c4d0 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72   from selectA or
1c4e0 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20   selectB.  Also 
1c4f0 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a  add explicit.  *
1c500 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20  * collations to 
1c510 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1c520 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61  use terms so tha
1c530 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75  t when the subqu
1c540 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68  eries.  ** to th
1c550 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20  e right and the 
1c560 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74  left are evaluat
1c570 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65  ed, they use the
1c580 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f   correct.  ** co
1c590 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  llation..  */.  
1c5a0 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74  aPermute = sqlit
1c5b0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
1c5c0 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  db, sizeof(int)*
1c5d0 28 6e 4f 72 64 65 72 42 79 20 2b 20 31 29 29 3b  (nOrderBy + 1));
1c5e0 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20  .  if( aPermute 
1c5f0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
1c600 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1c610 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75 74 65  em;.    aPermute
1c620 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a  [0] = nOrderBy;.
1c630 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70 49 74      for(i=1, pIt
1c640 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
1c650 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b  i<=nOrderBy; i++
1c660 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1c670 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1c680 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
1c690 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
1c6a0 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
1c6b0 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70  OrderByCol<=p->p
1c6c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
1c6d0 20 20 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69        aPermute[i
1c6e0 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  ] = pItem->u.x.i
1c6f0 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a  OrderByCol - 1;.
1c700 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65      }.    pKeyMe
1c710 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  rge = multiSelec
1c720 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f 28  tOrderByKeyInfo(
1c730 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20  pParse, p, 1);. 
1c740 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79   }else{.    pKey
1c750 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Merge = 0;.  }..
1c760 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68    /* Reattach th
1c770 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1c780 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a  e to the query..
1c790 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72    */.  p->pOrder
1c7a0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
1c7b0 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
1c7c0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
1c7d0 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64  istDup(pParse->d
1c7e0 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b  b, pOrderBy, 0);
1c7f0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1c800 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f  a range of tempo
1c810 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61  rary registers a
1c820 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e  nd the KeyInfo n
1c830 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74  eeded.  ** for t
1c840 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65  he logic that re
1c850 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20  moves duplicate 
1c860 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e  result rows when
1c870 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74   the.  ** operat
1c880 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43  or is UNION, EXC
1c890 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43  EPT, or INTERSEC
1c8a0 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e  T (but not UNION
1c8b0 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66   ALL)..  */.  if
1c8c0 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op==TK_ALL ){.
1c8d0 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b      regPrev = 0;
1c8e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1c8f0 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c  t nExpr = p->pEL
1c900 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
1c910 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79  assert( nOrderBy
1c920 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  >=nExpr || db->m
1c930 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1c940 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61     regPrev = pPa
1c950 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
1c960 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
1c970 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71   nExpr+1;.    sq
1c980 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1c990 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
1c9a0 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20  , regPrev);.    
1c9b0 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65  pKeyDup = sqlite
1c9c0 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
1c9d0 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20  , nExpr, 1);.   
1c9e0 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a   if( pKeyDup ){.
1c9f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
1ca00 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
1ca10 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29  iteable(pKeyDup)
1ca20 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
1ca30 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29  0; i<nExpr; i++)
1ca40 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75  {.        pKeyDu
1ca50 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75  p->aColl[i] = mu
1ca60 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
1ca70 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
1ca80 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d          pKeyDup-
1ca90 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
1caa0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1cab0 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70  }.  }. .  /* Sep
1cac0 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61  arate the left a
1cad0 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65  nd the right que
1cae0 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74  ry from one anot
1caf0 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50  her.  */.  p->pP
1cb00 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50 72 69  rior = 0;.  pPri
1cb10 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  or->pNext = 0;. 
1cb20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f   sqlite3ResolveO
1cb30 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72  rderGroupBy(pPar
1cb40 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72  se, p, p->pOrder
1cb50 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20  By, "ORDER");.  
1cb60 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69  if( pPrior->pPri
1cb70 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  or==0 ){.    sql
1cb80 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
1cb90 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
1cba0 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e  pPrior, pPrior->
1cbb0 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
1cbc0 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  ");.  }..  /* Co
1cbd0 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20  mpute the limit 
1cbe0 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63  registers */.  c
1cbf0 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
1cc00 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
1cc10 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28  labelEnd);.  if(
1cc20 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70   p->iLimit && op
1cc30 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
1cc40 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50  regLimitA = ++pP
1cc50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1cc60 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50  regLimitB = ++pP
1cc70 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1cc80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cc90 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d  2(v, OP_Copy, p-
1cca0 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f  >iOffset ? p->iO
1ccb0 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69  ffset+1 : p->iLi
1ccc0 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mit,.           
1ccd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cce0 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41         regLimitA
1ccf0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1cd00 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
1cd10 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20  opy, regLimitA, 
1cd20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65  regLimitB);.  }e
1cd30 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  lse{.    regLimi
1cd40 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d  tA = regLimitB =
1cd50 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
1cd60 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1cd70 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d  p->pLimit);.  p-
1cd80 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20  >pLimit = 0;..  
1cd90 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61  regAddrA = ++pPa
1cda0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
1cdb0 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65  AddrB = ++pParse
1cdc0 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74  ->nMem;.  regOut
1cdd0 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
1cde0 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20  em;.  regOutB = 
1cdf0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1ce00 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1ce10 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20  estInit(&destA, 
1ce20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
1ce30 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
1ce40 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
1ce50 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f  t(&destB, SRT_Co
1ce60 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
1ce70 42 29 3b 0a 0a 20 20 45 78 70 6c 61 69 6e 51 75  B);..  ExplainQu
1ce80 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
1ce90 20 31 2c 20 22 4d 45 52 47 45 20 28 25 73 29 22   1, "MERGE (%s)"
1cea0 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
1ceb0 2d 3e 6f 70 29 29 29 3b 0a 0a 20 20 2f 2a 20 47  ->op)));..  /* G
1cec0 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
1ced0 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
1cee0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1cef0 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ment to the.  **
1cf00 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d   left of the com
1cf10 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d  pound operator -
1cf20 20 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e   the "A" select.
1cf30 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65  .  */.  addrSele
1cf40 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ctA = sqlite3Vdb
1cf50 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
1cf60 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  + 1;.  addr1 = s
1cf70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1cf80 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
1cf90 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41 2c 20  tine, regAddrA, 
1cfa0 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b  0, addrSelectA);
1cfb0 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
1cfc0 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43 54 22  v, "left SELECT"
1cfd0 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c  ));.  pPrior->iL
1cfe0 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41  imit = regLimitA
1cff0 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79  ;.  ExplainQuery
1d000 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c  Plan((pParse, 1,
1d010 20 22 4c 45 46 54 22 29 29 3b 0a 20 20 73 71 6c   "LEFT"));.  sql
1d020 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
1d030 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74  e, pPrior, &dest
1d040 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
1d050 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c  eEndCoroutine(v,
1d060 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
1d070 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
1d080 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20  e(v, addr1);..  
1d090 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f  /* Generate a co
1d0a0 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75  routine to evalu
1d0b0 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ate the SELECT s
1d0c0 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a  tatement on .  *
1d0d0 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20 74 68  * the right - th
1d0e0 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20 20 2a  e "B" select.  *
1d0f0 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42 20  /.  addrSelectB 
1d100 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1d110 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b  rentAddr(v) + 1;
1d120 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
1d130 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1d140 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
1d150 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c 20 61  , regAddrB, 0, a
1d160 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 56  ddrSelectB);.  V
1d170 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
1d180 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b  right SELECT"));
1d190 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20  .  savedLimit = 
1d1a0 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76  p->iLimit;.  sav
1d1b0 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  edOffset = p->iO
1d1c0 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d  ffset;.  p->iLim
1d1d0 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a  it = regLimitB;.
1d1e0 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
1d1f0 3b 20 20 0a 20 20 45 78 70 6c 61 69 6e 51 75 65  ;  .  ExplainQue
1d200 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
1d210 31 2c 20 22 52 49 47 48 54 22 29 29 3b 0a 20 20  1, "RIGHT"));.  
1d220 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
1d230 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29  arse, p, &destB)
1d240 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
1d250 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d  savedLimit;.  p-
1d260 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64  >iOffset = saved
1d270 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65  Offset;.  sqlite
1d280 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e  3VdbeEndCoroutin
1d290 65 28 76 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  e(v, regAddrB);.
1d2a0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1d2b0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
1d2c0 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
1d2d0 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
1d2e0 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  A.  ** select as
1d2f0 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
1d300 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
1d310 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
1d320 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
1d330 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
1d340 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29  routine for A"))
1d350 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67  ;.  addrOutA = g
1d360 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
1d370 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
1d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d390 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73   p, &destA, pDes
1d3a0 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20  t, regOutA,.    
1d3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
1d3c0 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c  Prev, pKeyDup, l
1d3d0 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f  abelEnd);.  .  /
1d3e0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
1d3f0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
1d400 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
1d410 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20   row of the B.  
1d420 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
1d430 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
1d440 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
1d450 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
1d460 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  if( op==TK_ALL |
1d470 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  | op==TK_UNION )
1d480 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
1d490 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
1d4a0 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22  t routine for B"
1d4b0 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42  ));.    addrOutB
1d4c0 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
1d4d0 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
1d4e0 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
1d4f0 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20       p, &destB, 
1d500 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a  pDest, regOutB,.
1d510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d520 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
1d530 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
1d540 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  }.  sqlite3KeyIn
1d550 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29  foUnref(pKeyDup)
1d560 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1d570 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
1d580 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65   run when the re
1d590 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63  sults from selec
1d5a0 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68  t A.  ** are exh
1d5b0 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20  austed and only 
1d5c0 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42  data in select B
1d5d0 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20   remains..  */. 
1d5e0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45   if( op==TK_EXCE
1d5f0 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54  PT || op==TK_INT
1d600 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
1d610 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64  drEofA_noB = add
1d620 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64  rEofA = labelEnd
1d630 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
1d640 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
1d650 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72  ((v, "eof-A subr
1d660 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
1d670 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65  ddrEofA = sqlite
1d680 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d690 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
1d6a0 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20  , addrOutB);.   
1d6b0 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20   addrEofA_noB = 
1d6c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1d6d0 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
1d6e0 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e  egAddrB, labelEn
1d6f0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
1d700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d710 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
1d720 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
1d730 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
1d740 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20   addrEofA);.    
1d750 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
1d760 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
1d770 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 2c 20  (p->nSelectRow, 
1d780 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
1d790 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  ow);.  }..  /* G
1d7a0 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
1d7b0 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
1d7c0 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
1d7d0 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20  m select B.  ** 
1d7e0 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
1d7f0 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
1d800 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e  elect A remains.
1d810 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
1d820 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
1d830 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61      addrEofB = a
1d840 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28  ddrEofA;.    if(
1d850 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e   p->nSelectRow >
1d860 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
1d870 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  Row ) p->nSelect
1d880 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  Row = pPrior->nS
1d890 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73  electRow;.  }els
1d8a0 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f  e{  .    VdbeNoo
1d8b0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
1d8c0 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-B subroutine")
1d8d0 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  );.    addrEofB 
1d8e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1d8f0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
1d900 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
1d910 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
1d920 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1d930 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
1d940 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56 64 62  , labelEnd); Vdb
1d950 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
1d960 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
1d970 6f 28 76 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  o(v, addrEofB);.
1d980 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
1d990 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
1d9a0 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c  e the case of A<
1d9b0 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
1d9c0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
1d9d0 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  lt-B subroutine"
1d9e0 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d  ));.  addrAltB =
1d9f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1da00 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1da10 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
1da20 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
1da30 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1da40 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
1da50 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f  ddrEofA); VdbeCo
1da60 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1da70 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1da80 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
1da90 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1daa0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
1dab0 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a  se of A==B.  */.
1dac0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1dad0 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
1dae0 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d   = addrAltB;.  }
1daf0 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
1db00 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
1db10 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72   addrAeqB = addr
1db20 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41 6c  AltB;.    addrAl
1db30 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tB++;.  }else{. 
1db40 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1db50 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20 73  nt((v, "A-eq-B s
1db60 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
1db70 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20 20    addrAeqB =.   
1db80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1db90 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
1dba0 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
1dbb0 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  fA); VdbeCoverag
1dbc0 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
1dbd0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c 61 62  3VdbeGoto(v, lab
1dbe0 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20  elCmpr);.  }..  
1dbf0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1dc00 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
1dc10 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a  ase of A>B.  */.
1dc20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
1dc30 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75  t((v, "A-gt-B su
1dc40 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61  broutine"));.  a
1dc50 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65  ddrAgtB = sqlite
1dc60 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1dc70 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54  (v);.  if( op==T
1dc80 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
1dc90 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c  UNION ){.    sql
1dca0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1dcb0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
1dcc0 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a  utB, addrOutB);.
1dcd0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
1dce0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
1dcf0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61  eld, regAddrB, a
1dd00 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f  ddrEofB); VdbeCo
1dd10 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
1dd20 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1dd30 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
1dd40 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73  * This code runs
1dd50 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c   once to initial
1dd60 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a  ize everything..
1dd70 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1dd80 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
1dd90 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  dr1);.  sqlite3V
1dda0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1ddb0 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1ddc0 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 20   addrEofA_noB); 
1ddd0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
1dde0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1ddf0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1de00 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72  , regAddrB, addr
1de10 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76 65 72  EofB); VdbeCover
1de20 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d  age(v);..  /* Im
1de30 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e  plement the main
1de40 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f   merge loop.  */
1de50 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
1de60 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
1de70 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69  belCmpr);.  sqli
1de80 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1de90 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c   OP_Permutation,
1dea0 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a   0, 0, 0, (char*
1deb0 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e  )aPermute, P4_IN
1dec0 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74  TARRAY);.  sqlit
1ded0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1dee0 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74  OP_Compare, dest
1def0 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69  A.iSdst, destB.i
1df00 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a  Sdst, nOrderBy,.
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
1df30 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45  pKeyMerge, P4_KE
1df40 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65  YINFO);.  sqlite
1df50 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1df60 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29   OPFLAG_PERMUTE)
1df70 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
1df80 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70  ddOp3(v, OP_Jump
1df90 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72  , addrAltB, addr
1dfa0 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b  AeqB, addrAgtB);
1dfb0 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
1dfc0 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  ;..  /* Jump to 
1dfd0 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69  the this point i
1dfe0 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69  n order to termi
1dff0 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a  nate the query..
1e000 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1e010 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1e020 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20  , labelEnd);..  
1e030 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68  /* Reassembly th
1e040 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
1e050 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
1e060 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63   be freed correc
1e070 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  tly.  ** by the 
1e080 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1e090 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
1e0a0 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ior ){.    sqlit
1e0b0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1e0c0 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  b, p->pPrior);. 
1e0d0 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d   }.  p->pPrior =
1e0e0 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72 69 6f   pPrior;.  pPrio
1e0f0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 0a 20  r->pNext = p;.. 
1e100 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65   /*** TBD:  Inse
1e110 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61  rt subroutine ca
1e120 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72  lls to close cur
1e130 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65  sors on incomple
1e140 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65  te.  **** subque
1e150 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 45 78 70  ries ****/.  Exp
1e160 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f 70  lainQueryPlanPop
1e170 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74 75  (pParse);.  retu
1e180 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 21  rn pParse->nErr!
1e190 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  =0;.}.#endif..#i
1e1a0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1e1b0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
1e1c0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
1e1d0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 0a  ITE_OMIT_VIEW)..
1e1e0 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  /* An instance o
1e1f0 66 20 74 68 65 20 53 75 62 73 74 43 6f 6e 74 65  f the SubstConte
1e200 78 74 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69  xt object descri
1e210 62 65 73 20 61 6e 20 73 75 62 73 74 69 74 75 74  bes an substitut
1e220 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74 6f 20 62  ion edit.** to b
1e230 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 61  e performed on a
1e240 20 70 61 72 73 65 20 74 72 65 65 2e 0a 2a 2a 0a   parse tree..**.
1e250 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65 6e 63 65  ** All reference
1e260 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s to columns in 
1e270 74 61 62 6c 65 20 69 54 61 62 6c 65 20 61 72 65  table iTable are
1e280 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20   to be replaced 
1e290 62 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  by corresponding
1e2a0 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
1e2b0 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a 74 79  in pEList..*/.ty
1e2c0 70 65 64 65 66 20 73 74 72 75 63 74 20 53 75 62  pedef struct Sub
1e2d0 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20 20 50 61  stContext {.  Pa
1e2e0 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
1e2f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
1e300 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1e310 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 3b 20  /.  int iTable; 
1e320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e330 20 52 65 70 6c 61 63 65 20 72 65 66 65 72 65 6e   Replace referen
1e340 63 65 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ces to this tabl
1e350 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77 54  e */.  int iNewT
1e360 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
1e370 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65 20 6e 75   /* New table nu
1e380 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73  mber */.  int is
1e390 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20 20 20 20  LeftJoin;       
1e3a0 20 20 20 20 2f 2a 20 41 64 64 20 54 4b 5f 49 46      /* Add TK_IF
1e3b0 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f 64 65  _NULL_ROW opcode
1e3c0 73 20 6f 6e 20 65 61 63 68 20 72 65 70 6c 61 63  s on each replac
1e3d0 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ement */.  ExprL
1e3e0 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
1e3f0 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d       /* Replacem
1e400 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ent expressions 
1e410 2a 2f 0a 7d 20 53 75 62 73 74 43 6f 6e 74 65 78  */.} SubstContex
1e420 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44  t;../* Forward D
1e430 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  eclarations */.s
1e440 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
1e450 45 78 70 72 4c 69 73 74 28 53 75 62 73 74 43 6f  ExprList(SubstCo
1e460 6e 74 65 78 74 2a 2c 20 45 78 70 72 4c 69 73 74  ntext*, ExprList
1e470 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  *);.static void 
1e480 73 75 62 73 74 53 65 6c 65 63 74 28 53 75 62 73  substSelect(Subs
1e490 74 43 6f 6e 74 65 78 74 2a 2c 20 53 65 6c 65 63  tContext*, Selec
1e4a0 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a  t*, int);../*.**
1e4b0 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   Scan through th
1e4c0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
1e4d0 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65  pr.  Replace eve
1e4e0 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a  ry reference to.
1e4f0 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ** a column in t
1e500 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62  able number iTab
1e510 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  le with a copy o
1e520 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  f the iColumn-th
1e530 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c  .** entry in pEL
1e540 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65  ist.  (But leave
1e550 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1e560 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  he ROWID column 
1e570 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a  .** unchanged.).
1e580 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1e590 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ne is part of th
1e5a0 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f  e flattening pro
1e5b0 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75  cedure.  A subqu
1e5c0 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73  ery.** whose res
1e5d0 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e  ult set is defin
1e5e0 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70  ed by pEList app
1e5f0 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e  ears as entry in
1e600 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   the.** FROM cla
1e610 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
1e620 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44  such that the VD
1e630 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e  BE cursor assign
1e640 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f  ed to that.** FO
1e650 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20  RM clause entry 
1e660 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73  is iTable.  This
1e670 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 74   routine makes t
1e680 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
1e690 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
1e6a0 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
1e6b0 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
1e6c0 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
1e6d0 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
1e6e0 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
1e6f0 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
1e700 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
1e710 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74  atic Expr *subst
1e720 45 78 70 72 28 0a 20 20 53 75 62 73 74 43 6f 6e  Expr(.  SubstCon
1e730 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20 20 2f  text *pSubst,  /
1e740 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1e750 20 74 68 65 20 73 75 62 73 74 69 74 75 74 69 6f   the substitutio
1e760 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  n */.  Expr *pEx
1e770 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pr            /*
1e780 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20 73   Expr in which s
1e790 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75  ubstitution occu
1e7a0 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  rs */.){.  if( p
1e7b0 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
1e7c0 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61   0;.  if( ExprHa
1e7d0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1e7e0 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
1e7f0 20 26 26 20 70 45 78 70 72 2d 3e 69 52 69 67 68   && pExpr->iRigh
1e800 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53 75 62  tJoinTable==pSub
1e810 73 74 2d 3e 69 54 61 62 6c 65 0a 20 20 29 7b 0a  st->iTable.  ){.
1e820 20 20 20 20 70 45 78 70 72 2d 3e 69 52 69 67 68      pExpr->iRigh
1e830 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 53 75  tJoinTable = pSu
1e840 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a  bst->iNewTable;.
1e850 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d    }.  if( pExpr-
1e860 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
1e870 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
1e880 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c 65 20  =pSubst->iTable 
1e890 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
1e8a0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
1e8b0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
1e8c0 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65   TK_NULL;.    }e
1e8d0 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
1e8e0 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70  *pNew;.      Exp
1e8f0 72 20 2a 70 43 6f 70 79 20 3d 20 70 53 75 62 73  r *pCopy = pSubs
1e900 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70 45 78  t->pEList->a[pEx
1e910 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78  pr->iColumn].pEx
1e920 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 69  pr;.      Expr i
1e930 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20  fNullRow;.      
1e940 61 73 73 65 72 74 28 20 70 53 75 62 73 74 2d 3e  assert( pSubst->
1e950 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70 45 78  pEList!=0 && pEx
1e960 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53 75 62  pr->iColumn<pSub
1e970 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  st->pEList->nExp
1e980 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
1e990 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
1e9a0 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
1e9b0 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
1e9c0 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
1e9d0 73 56 65 63 74 6f 72 28 70 43 6f 70 79 29 20 29  sVector(pCopy) )
1e9e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e9f0 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73 67 28  3VectorErrorMsg(
1ea00 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65 2c 20  pSubst->pParse, 
1ea10 70 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 7d 65  pCopy);.      }e
1ea20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1ea30 69 74 65 33 20 2a 64 62 20 3d 20 70 53 75 62 73  ite3 *db = pSubs
1ea40 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  t->pParse->db;. 
1ea50 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 73         if( pSubs
1ea60 74 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20 26 26  t->isLeftJoin &&
1ea70 20 70 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b 5f 43   pCopy->op!=TK_C
1ea80 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20  OLUMN ){.       
1ea90 20 20 20 6d 65 6d 73 65 74 28 26 69 66 4e 75 6c     memset(&ifNul
1eaa0 6c 52 6f 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  lRow, 0, sizeof(
1eab0 69 66 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20 20 20  ifNullRow));.   
1eac0 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77         ifNullRow
1ead0 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f 4e 55 4c 4c  .op = TK_IF_NULL
1eae0 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 20 20  _ROW;.          
1eaf0 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66 74 20  ifNullRow.pLeft 
1eb00 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20  = pCopy;.       
1eb10 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 69 54 61     ifNullRow.iTa
1eb20 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e 69 4e  ble = pSubst->iN
1eb30 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  ewTable;.       
1eb40 20 20 20 70 43 6f 70 79 20 3d 20 26 69 66 4e 75     pCopy = &ifNu
1eb50 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 7d  llRow;.        }
1eb60 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
1eb70 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
1eb80 62 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a 20 20  b, pCopy, 0);.  
1eb90 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
1eba0 26 20 70 53 75 62 73 74 2d 3e 69 73 4c 65 66 74  & pSubst->isLeft
1ebb0 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Join ){.        
1ebc0 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
1ebd0 79 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e 42 65  y(pNew, EP_CanBe
1ebe0 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Null);.        }
1ebf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
1ec00 77 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  w && ExprHasProp
1ec10 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 46 72  erty(pExpr,EP_Fr
1ec20 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20  omJoin) ){.     
1ec30 20 20 20 20 20 70 4e 65 77 2d 3e 69 52 69 67 68       pNew->iRigh
1ec40 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 45 78  tJoinTable = pEx
1ec50 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
1ec60 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 45  ble;.          E
1ec70 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
1ec80 4e 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  New, EP_FromJoin
1ec90 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1eca0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1ecb0 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
1ecc0 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
1ecd0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 7d   = pNew;.      }
1ece0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1ecf0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
1ed00 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f 52 4f  p==TK_IF_NULL_RO
1ed10 57 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62  W && pExpr->iTab
1ed20 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62  le==pSubst->iTab
1ed30 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  le ){.      pExp
1ed40 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53 75 62  r->iTable = pSub
1ed50 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b 0a 20  st->iNewTable;. 
1ed60 20 20 20 7d 0a 20 20 20 20 70 45 78 70 72 2d 3e     }.    pExpr->
1ed70 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70  pLeft = substExp
1ed80 72 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d  r(pSubst, pExpr-
1ed90 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70 45 78  >pLeft);.    pEx
1eda0 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62  pr->pRight = sub
1edb0 73 74 45 78 70 72 28 70 53 75 62 73 74 2c 20 70  stExpr(pSubst, p
1edc0 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
1edd0 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
1ede0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1edf0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
1ee00 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
1ee10 28 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e  (pSubst, pExpr->
1ee20 78 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20  x.pSelect, 1);. 
1ee30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ee40 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53  substExprList(pS
1ee50 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  ubst, pExpr->x.p
1ee60 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
1ee70 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b  .  return pExpr;
1ee80 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
1ee90 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20  ubstExprList(.  
1eea0 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53  SubstContext *pS
1eeb0 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70  ubst, /* Descrip
1eec0 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73  tion of the subs
1eed0 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  titution */.  Ex
1eee0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20  prList *pList   
1eef0 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
1ef00 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
1ef10 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
1ef20 75 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  utes */.){.  int
1ef30 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1ef40 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1ef50 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1ef60 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
1ef70 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45    pList->a[i].pE
1ef80 78 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28  xpr = substExpr(
1ef90 70 53 75 62 73 74 2c 20 70 4c 69 73 74 2d 3e 61  pSubst, pList->a
1efa0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  [i].pExpr);.  }.
1efb0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
1efc0 62 73 74 53 65 6c 65 63 74 28 0a 20 20 53 75 62  bstSelect(.  Sub
1efd0 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75 62 73  stContext *pSubs
1efe0 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f  t, /* Descriptio
1eff0 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74 69 74  n of the substit
1f000 75 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ution */.  Selec
1f010 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1f020 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
1f030 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f  ment in which to
1f040 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74 69   make substituti
1f050 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 50  ons */.  int doP
1f060 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 2f  rior           /
1f070 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74 65 73  * Do substitutes
1f080 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20 74 6f   on p->pPrior to
1f090 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  o */.){.  SrcLis
1f0a0 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63  t *pSrc;.  struc
1f0b0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1f0c0 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
1f0d0 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
1f0e0 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 75 62  n;.  do{.    sub
1f0f0 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1f100 74 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  t, p->pEList);. 
1f110 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74     substExprList
1f120 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 47 72 6f  (pSubst, p->pGro
1f130 75 70 42 79 29 3b 0a 20 20 20 20 73 75 62 73 74  upBy);.    subst
1f140 45 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c  ExprList(pSubst,
1f150 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
1f160 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d 20     p->pHaving = 
1f170 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74  substExpr(pSubst
1f180 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  , p->pHaving);. 
1f190 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
1f1a0 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1f1b0 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20   p->pWhere);.   
1f1c0 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
1f1d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72  .    assert( pSr
1f1e0 63 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  c!=0 );.    for(
1f1f0 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49  i=pSrc->nSrc, pI
1f200 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30  tem=pSrc->a; i>0
1f210 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
1f220 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1f230 63 74 28 70 53 75 62 73 74 2c 20 70 49 74 65 6d  ct(pSubst, pItem
1f240 2d 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b 0a 20  ->pSelect, 1);. 
1f250 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1f260 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a  fg.isTabFunc ){.
1f270 20 20 20 20 20 20 20 20 73 75 62 73 74 45 78 70          substExp
1f280 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20 70 49  rList(pSubst, pI
1f290 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
1f2a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1f2b0 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50 72 69  .  }while( doPri
1f2c0 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e 70 50  or && (p = p->pP
1f2d0 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a 23 65  rior)!=0 );.}.#e
1f2e0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
1f2f0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
1f300 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
1f310 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
1f320 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65  IEW) */..#if !de
1f330 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1f340 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1f350 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1f360 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20  MIT_VIEW)./*.** 
1f370 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
1f380 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e  empts to flatten
1f390 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20 61   subqueries as a
1f3a0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74   performance opt
1f3b0 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68  imization..** Th
1f3c0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1f3d0 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73  ns 1 if it makes
1f3e0 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69   changes and 0 i
1f3f0 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20  f no flattening 
1f400 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  occurs..**.** To
1f410 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20   understand the 
1f420 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74  concept of flatt
1f430 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20  ening, consider 
1f440 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1f450 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
1f460 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
1f470 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61  (SELECT x+y AS a
1f480 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
1f490 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a  <100) WHERE a>5.
1f4a0 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  **.** The defaul
1f4b0 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65  t way of impleme
1f4c0 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72 79  nting this query
1f4d0 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20 74   is to execute t
1f4e0 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66  he.** subquery f
1f4f0 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74  irst and store t
1f500 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  he results in a 
1f510 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
1f520 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65   then.** run the
1f530 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20   outer query on 
1f540 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74  that temporary t
1f550 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75  able.  This requ
1f560 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73  ires two.** pass
1f570 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74 61  es over the data
1f580 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  .  Furthermore, 
1f590 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d 70  because the temp
1f5a0 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68  orary table.** h
1f5b0 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74  as no indices, t
1f5c0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1f5d0 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  on the outer que
1f5e0 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ry cannot be.** 
1f5f0 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a  optimized..**.**
1f600 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
1f610 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74  tempts to rewrit
1f620 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20 61  e queries such a
1f630 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f  s the above into
1f640 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61  .** a single fla
1f650 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74  t select, like t
1f660 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  his:.**.**     S
1f670 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
1f680 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
1f690 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a  00 AND a>5.**.**
1f6a0 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
1f6b0 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d  ted for this sim
1f6c0 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  plification give
1f6d0 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
1f6e0 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
1f6f0 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
1f700 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
1f710 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
1f720 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
1f730 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
1f740 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
1f750 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
1f760 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
1f770 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
1f780 20 69 73 20 73 75 62 6a 65 63 74 20 74 6f 20 74   is subject to t
1f790 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
1f7a0 73 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20  straints:.**.** 
1f7b0 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e   (**)  We no lon
1f7c0 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66  ger attempt to f
1f7d0 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65  latten aggregate
1f7e0 20 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73   subqueries. Was
1f7f0 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20  :.**        The 
1f800 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
1f810 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61 6e   outer query can
1f820 6e 6f 74 20 62 6f 74 68 20 62 65 20 61 67 67 72  not both be aggr
1f830 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28  egates..**.**  (
1f840 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65  **)  We no longe
1f850 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61  r attempt to fla
1f860 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73  tten aggregate s
1f870 75 62 71 75 65 72 69 65 73 2e 20 57 61 73 3a 0a  ubqueries. Was:.
1f880 2a 2a 20 20 20 20 20 20 20 20 28 32 29 20 49 66  **        (2) If
1f890 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1f8a0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68   an aggregate th
1f8b0 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 61  en.**        (2a
1f8c0 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1f8d0 79 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 20  y must not be a 
1f8e0 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20 20 20  join and.**     
1f8f0 20 20 20 28 32 62 29 20 74 68 65 20 6f 75 74 65     (2b) the oute
1f900 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e 6f 74  r query must not
1f910 20 75 73 65 20 73 75 62 71 75 65 72 69 65 73 0a   use subqueries.
1f920 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
1f930 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ther than the on
1f940 65 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  e FROM-clause su
1f950 62 71 75 65 72 79 20 74 68 61 74 20 69 73 20 61  bquery that is a
1f960 20 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20 20 20   candidate.**   
1f970 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 66 6c            for fl
1f980 61 74 74 65 6e 69 6e 67 2e 20 20 28 54 68 69 73  attening.  (This
1f990 20 69 73 20 64 75 65 20 74 6f 20 74 69 63 6b 65   is due to ticke
1f9a0 74 20 5b 32 66 37 31 37 30 64 37 33 62 66 39 61  t [2f7170d73bf9a
1f9b0 62 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20 20 20  bf80].**        
1f9c0 20 20 20 20 20 66 72 6f 6d 20 32 30 31 35 2d 30       from 2015-0
1f9d0 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 28  2-09.).**.**   (
1f9e0 33 29 20 20 49 66 20 74 68 65 20 73 75 62 71 75  3)  If the subqu
1f9f0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
1fa00 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c 45   operand of a LE
1fa10 46 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a 2a 20  FT JOIN then.** 
1fa20 20 20 20 20 20 20 20 28 33 61 29 20 74 68 65 20         (3a) the 
1fa30 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
1fa40 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a   be a join and.*
1fa50 2a 20 20 20 20 20 20 20 20 28 33 62 29 20 74 68  *        (3b) th
1fa60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1fa70 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6d 61   the subquery ma
1fa80 79 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  y not contain a 
1fa90 76 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20 20 20  virtual.**      
1faa0 20 20 20 20 20 20 20 74 61 62 6c 65 20 61 6e 64         table and
1fab0 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 63 29 20  .**        (3c) 
1fac0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1fad0 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20 61 67  may not be an ag
1fae0 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20  gregate..**.**  
1faf0 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
1fb00 72 79 20 63 61 6e 20 6e 6f 74 20 62 65 20 44 49  ry can not be DI
1fb10 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28  STINCT..**.**  (
1fb20 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e  **)  At one poin
1fb30 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  t restrictions (
1fb40 34 29 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e  4) and (5) defin
1fb50 65 64 20 61 20 73 75 62 73 65 74 20 6f 66 20 44  ed a subset of D
1fb60 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20  ISTINCT.**      
1fb70 20 20 73 75 62 2d 71 75 65 72 69 65 73 20 74 68    sub-queries th
1fb80 61 74 20 77 65 72 65 20 65 78 63 6c 75 64 65 64  at were excluded
1fb90 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d   from this optim
1fba0 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63  ization. Restric
1fbb0 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20  tion .**        
1fbc0 28 34 29 20 68 61 73 20 73 69 6e 63 65 20 62 65  (4) has since be
1fbd0 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65  en expanded to e
1fbe0 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49  xclude all DISTI
1fbf0 4e 43 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a  NCT subqueries..
1fc00 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57 65 20  **.**  (**)  We 
1fc10 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65 6d 70  no longer attemp
1fc20 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 67 67  t to flatten agg
1fc30 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65  regate subquerie
1fc40 73 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20 20 20  s.  Was:.**     
1fc50 20 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65     If the subque
1fc60 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c  ry is aggregate,
1fc70 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1fc80 20 6d 61 79 20 6e 6f 74 20 62 65 20 44 49 53 54   may not be DIST
1fc90 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37  INCT..**.**   (7
1fca0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1fcb0 6d 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d  must have a FROM
1fcc0 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20   clause.  TODO: 
1fcd0 20 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20   For subqueries 
1fce0 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20  without.**      
1fcf0 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c    A FROM clause,
1fd00 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   consider adding
1fd10 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77   a FROM clause w
1fd20 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a  ith the special.
1fd30 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20  **        table 
1fd40 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74  sqlite_once that
1fd50 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
1fd60 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69  ingle row contai
1fd70 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ning a.**       
1fd80 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a   single NULL..**
1fd90 0a 2a 2a 20 20 20 28 38 29 20 20 49 66 20 74 68  .**   (8)  If th
1fda0 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1fdb0 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
1fdc0 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1fdd0 6f 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  ot be a join..**
1fde0 0a 2a 2a 20 20 20 28 39 29 20 20 49 66 20 74 68  .**   (9)  If th
1fdf0 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1fe00 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f  LIMIT then the o
1fe10 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1fe20 6f 74 20 62 65 20 61 67 67 72 65 67 61 74 65 2e  ot be aggregate.
1fe30 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 52 65  .**.**  (**)  Re
1fe40 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29 20 77  striction (10) w
1fe50 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  as removed from 
1fe60 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30 30 35  the code on 2005
1fe70 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a 2a 2a  -02-05 but we.**
1fe80 20 20 20 20 20 20 20 20 61 63 63 69 64 65 6e 74          accident
1fe90 6c 79 20 63 61 72 72 69 65 64 20 74 68 65 20 63  ly carried the c
1fea0 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64 20 75  omment forward u
1feb0 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31 35 2e  ntil 2014-09-15.
1fec0 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20    Original.**   
1fed0 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 3a       constraint:
1fee0 20 22 49 66 20 74 68 65 20 73 75 62 71 75 65 72   "If the subquer
1fef0 79 20 69 73 20 61 67 67 72 65 67 61 74 65 20 74  y is aggregate t
1ff00 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75  hen the outer qu
1ff10 65 72 79 20 0a 2a 2a 20 20 20 20 20 20 20 20 6d  ery .**        m
1ff20 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  ay not use LIMIT
1ff30 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20  .".**.**  (11)  
1ff40 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
1ff50 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1ff60 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20 68 61   may not both ha
1ff70 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ve ORDER BY clau
1ff80 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ses..**.**  (**)
1ff90 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65    Not implemente
1ffa0 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74  d.  Subsumed int
1ffb0 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33  o restriction (3
1ffc0 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73  ).  Was previous
1ffd0 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73  ly.**        a s
1ffe0 65 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74  eparate restrict
1fff0 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f  ion deriving fro
20000 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a  m ticket #350..*
20010 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20  *.**  (13)  The 
20020 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74  subquery and out
20030 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
20040 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e   both use LIMIT.
20050 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68  .**.**  (14)  Th
20060 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
20070 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a  ot use OFFSET..*
20080 2a 0a 2a 2a 20 20 28 31 35 29 20 20 49 66 20 74  *.**  (15)  If t
20090 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
200a0 73 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  s part of a comp
200b0 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
200c0 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
200d0 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  subquery may not
200e0 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 20 20   use LIMIT..**  
200f0 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b 65        (See ticke
20100 74 20 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b  t #2339 and tick
20110 65 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29  et [02a8e81d44])
20120 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 49  ..**.**  (16)  I
20130 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
20140 79 20 69 73 20 61 67 67 72 65 67 61 74 65 2c 20  y is aggregate, 
20150 74 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72  then the subquer
20160 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20 20 20  y may not.**    
20170 20 20 20 20 75 73 65 20 4f 52 44 45 52 20 42 59      use ORDER BY
20180 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32  .  (Ticket #2942
20190 29 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20  )  This used to 
201a0 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20  not matter.**   
201b0 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e       until we in
201c0 74 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f  troduced the gro
201d0 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63  up_concat() func
201e0 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28  tion.  .**.**  (
201f0 31 37 29 20 20 49 66 20 74 68 65 20 73 75 62 71  17)  If the subq
20200 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
20210 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 0a  nd select, then.
20220 2a 2a 20 20 20 20 20 20 20 20 28 31 37 61 29 20  **        (17a) 
20230 61 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65  all compound ope
20240 72 61 74 6f 72 73 20 6d 75 73 74 20 62 65 20 61  rators must be a
20250 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e 64 0a   UNION ALL, and.
20260 2a 2a 20 20 20 20 20 20 20 20 28 31 37 62 29 20  **        (17b) 
20270 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 69 6e 20  no terms within 
20280 74 68 65 20 73 75 62 71 75 65 72 79 20 63 6f 6d  the subquery com
20290 70 6f 75 6e 64 20 6d 61 79 20 62 65 20 61 67 67  pound may be agg
202a0 72 65 67 61 74 65 0a 2a 2a 20 20 20 20 20 20 20  regate.**       
202b0 20 20 20 20 20 20 20 6f 72 20 44 49 53 54 49 4e         or DISTIN
202c0 43 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  CT, and.**      
202d0 20 20 28 31 37 63 29 20 65 76 65 72 79 20 74 65    (17c) every te
202e0 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 73 75  rm within the su
202f0 62 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e 64 20  bquery compound 
20300 6d 75 73 74 20 68 61 76 65 20 61 20 46 52 4f 4d  must have a FROM
20310 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20   clause.**      
20320 20 20 28 31 37 64 29 20 74 68 65 20 6f 75 74 65    (17d) the oute
20330 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
20340 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
20350 20 20 20 28 31 37 64 31 29 20 61 67 67 72 65 67     (17d1) aggreg
20360 61 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20 20 20  ate, or.**      
20370 20 20 20 20 20 20 20 20 28 31 37 64 32 29 20 44          (17d2) D
20380 49 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a 20 20  ISTINCT, or.**  
20390 20 20 20 20 20 20 20 20 20 20 20 20 28 31 37 64              (17d
203a0 33 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  3) a join..**.**
203b0 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72 65          The pare
203c0 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72 79  nt and sub-query
203d0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45   may contain WHE
203e0 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62 6a  RE clauses. Subj
203f0 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ect to.**       
20400 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31 33   rules (11), (13
20410 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65 79  ) and (14), they
20420 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
20430 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 20  n ORDER BY,.**  
20440 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64 20        LIMIT and 
20450 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
20460 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63 61   The subquery ca
20470 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f 6d  nnot use any com
20480 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  pound.**        
20490 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20 74  operator other t
204a0 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62 65  han UNION ALL be
204b0 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f 74  cause all the ot
204c0 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  her compound.** 
204d0 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 73         operators
204e0 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65 64   have an implied
204f0 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68 20   DISTINCT which 
20500 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62 79  is disallowed by
20510 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74 72  .**        restr
20520 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a  iction (4)..**.*
20530 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20 65  *        Also, e
20540 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ach component of
20550 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 6d   the sub-query m
20560 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20 73  ust return the s
20570 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  ame number.**   
20580 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20 63       of result c
20590 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73 20  olumns. This is 
205a0 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75 69  actually a requi
205b0 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20 63  rement for any c
205c0 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
205d0 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65    SELECT stateme
205e0 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20  nt, but all the 
205f0 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20 69  code here does i
20600 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
20610 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 75   no.**        su
20620 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75 62  ch (illegal) sub
20630 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74 65  -query is flatte
20640 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ned. The caller 
20650 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65 0a  will detect the.
20660 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61 78  **        syntax
20670 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75 72   error and retur
20680 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65 73  n a detailed mes
20690 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38  sage..**.**  (18
206a0 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
206b0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
206c0 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 61  d select, then a
206d0 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a  ll terms of the.
206e0 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20  **        ORDER 
206f0 42 59 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  BY clause of the
20700 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65 20   parent must be 
20710 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63 65  simple reference
20720 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20 20  s to .**        
20730 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 73  columns of the s
20740 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  ub-query..**.** 
20750 20 28 31 39 29 20 20 49 66 20 74 68 65 20 73 75   (19)  If the su
20760 62 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49  bquery uses LIMI
20770 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72  T then the outer
20780 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a   query may not.*
20790 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20  *        have a 
207a0 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
207b0 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68  .**  (20)  If th
207c0 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
207d0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
207e0 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e  , then it must n
207f0 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
20800 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
20810 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37  use.  Ticket #37
20820 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65  73.  We could re
20830 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61  lax this constra
20840 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f  int.**        so
20850 6d 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67  mewhat by saying
20860 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20   that the terms 
20870 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
20880 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20  clause must.**  
20890 20 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20        appear as 
208a0 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c  unmodified resul
208b0 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
208c0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
208d0 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20  ut we.**        
208e0 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d  have other optim
208f0 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64  izations in mind
20900 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68   to deal with th
20910 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  at case..**.**  
20920 28 32 31 29 20 20 49 66 20 74 68 65 20 73 75 62  (21)  If the sub
20930 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d 49 54  query uses LIMIT
20940 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
20950 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
20960 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49  .**        DISTI
20970 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65  NCT.  (See ticke
20980 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e  t [752e1646fc]).
20990 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68  .**.**  (22)  Th
209a0 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
209b0 6f 74 20 62 65 20 61 20 72 65 63 75 72 73 69 76  ot be a recursiv
209c0 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  e CTE..**.**  (*
209d0 2a 29 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74  *)  Subsumed int
209e0 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 31  o restriction (1
209f0 37 64 33 29 2e 20 20 57 61 73 3a 20 49 66 20 74  7d3).  Was: If t
20a00 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
20a10 73 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 72 65  s.**        a re
20a20 63 75 72 73 69 76 65 20 43 54 45 2c 20 74 68 65  cursive CTE, the
20a30 6e 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  n the sub-query 
20a40 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d  may not be a com
20a50 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 20  pound query..** 
20a60 20 20 20 20 20 20 20 54 68 69 73 20 72 65 73 74         This rest
20a70 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75  riction is becau
20a80 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20  se transforming 
20a90 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61  the.**        pa
20aa0 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75  rent to a compou
20ab0 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65  nd query confuse
20ac0 73 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  s the code that 
20ad0 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20  handles.**      
20ae0 20 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72    recursive quer
20af0 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65  ies in multiSele
20b00 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  ct()..**.**  (**
20b10 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  )  We no longer 
20b20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61 74 74  attempt to flatt
20b30 65 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  en aggregate sub
20b40 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a 0a 2a  queries.  Was:.*
20b50 2a 20 20 20 20 20 20 20 20 54 68 65 20 73 75 62  *        The sub
20b60 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
20b70 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 74 68   an aggregate th
20b80 61 74 20 75 73 65 73 20 74 68 65 20 62 75 69 6c  at uses the buil
20b90 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20 0a 2a  t-in min() or .*
20ba0 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61 78 28  *        or max(
20bb0 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 28 57  ) functions.  (W
20bc0 69 74 68 6f 75 74 20 74 68 69 73 20 72 65 73 74  ithout this rest
20bd0 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65 72 79  riction, a query
20be0 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20 20 20   like:.**       
20bf0 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20   "SELECT x FROM 
20c00 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29 2c 20  (SELECT max(y), 
20c10 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f 75 6c  x FROM t1)" woul
20c20 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  d not necessaril
20c30 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 74 75  y.**        retu
20c40 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58 20 66  rn the value X f
20c50 6f 72 20 77 68 69 63 68 20 59 20 77 61 73 20 6d  or which Y was m
20c60 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a 0a 2a  aximal.).**.**.*
20c70 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  * In this routin
20c80 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61 6d  e, the "p" param
20c90 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
20ca0 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71  r to the outer q
20cb0 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62  uery..** The sub
20cc0 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63  query is p->pSrc
20cd0 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41  ->a[iFrom].  isA
20ce0 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  gg is true if th
20cf0 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a  e outer query.**
20d00 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73   uses aggregates
20d10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74  ..**.** If flatt
20d20 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74  ening is not att
20d30 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75  empted, this rou
20d40 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
20d50 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  and returns 0..*
20d60 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * If flattening 
20d70 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69  is attempted thi
20d80 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
20d90 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  s 1..**.** All o
20da0 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
20db0 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f   analysis must o
20dc0 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65  ccur on both the
20dd0 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64   outer query and
20de0 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79  .** the subquery
20df0 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
20e00 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74  tine runs..*/.st
20e10 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e  atic int flatten
20e20 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73  Subquery(.  Pars
20e30 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
20e40 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
20e50 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
20e60 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
20e70 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f   The parent or o
20e80 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74  uter SELECT stat
20e90 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
20ea0 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
20eb0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70  /* Index in p->p
20ec0 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20  Src->a[] of the 
20ed0 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a  inner subquery *
20ee0 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 20 20 20  /.  int isAgg   
20ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20f00 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54   if outer SELECT
20f10 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
20f20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
20f30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
20f40 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
20f50 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  = pParse->zAuthC
20f60 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74  ontext;.  Select
20f70 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 2f 2a   *pParent;    /*
20f80 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e 20 41   Current UNION A
20f90 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f  LL term of the o
20fa0 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  ther query */.  
20fb0 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
20fc0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
20fd0 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
20fe0 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ery" */.  Select
20ff0 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a   *pSub1;      /*
21000 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
21010 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74  rightmost select
21020 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f   in sub-query */
21030 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
21040 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
21050 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
21060 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
21070 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53    SrcList *pSubS
21080 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
21090 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
210a0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
210b0 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20  t iParent;      
210c0 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72    /* VDBE cursor
210d0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
210e0 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20 74  Sub result set t
210f0 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  emp table */.  i
21100 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20  nt iNewParent = 
21110 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e  -1;/* Replacemen
21120 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50 61 72  t table for iPar
21130 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4c  ent */.  int isL
21140 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f 2a 20  eftJoin = 0; /* 
21150 54 72 75 65 20 69 66 20 70 53 75 62 20 69 73 20  True if pSub is 
21160 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f  the right side o
21170 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f  f a LEFT JOIN */
21180 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20 20 20      .  int i;   
21190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
211a0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
211b0 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20  Expr *pWhere;   
211c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211d0 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
211e0 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
211f0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
21200 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68  Subitem;   /* Th
21210 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
21220 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
21230 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20  arse->db;..  /* 
21240 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
21250 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65  flattening is pe
21260 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e  rmitted.  Return
21270 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a   0 if not..  */.
21280 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
21290 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
212a0 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 69 66  Prior==0 );.  if
212b0 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
212c0 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
212d0 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
212e0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
212f0 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
21300 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
21310 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
21320 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
21330 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26  ;.  pSubitem = &
21340 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a  pSrc->a[iFrom];.
21350 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62    iParent = pSub
21360 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  item->iCursor;. 
21370 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d   pSub = pSubitem
21380 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ->pSelect;.  ass
21390 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
213a0 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 6e 20 29  .  if( p->pWin )
213b0 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 70 53   return 0;..  pS
213c0 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
213d0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
213e0 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72  ubSrc );.  /* Pr
213f0 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33  ior to version 3
21400 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54  .1.2, when LIMIT
21410 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20   and OFFSET had 
21420 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e  to be simple con
21430 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74  stants,.  ** not
21440 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
21450 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77  ssions, we allow
21460 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e  ed some combinin
21470 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f  g of LIMIT and O
21480 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75  FFSET.  ** becau
21490 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65  se they could be
214a0 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d   computed at com
214b0 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20  pile-time.  But 
214c0 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f  when LIMIT and O
214d0 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d  FFSET.  ** becam
214e0 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  e arbitrary expr
214f0 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65  essions, we were
21500 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72   forced to add r
21510 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29  estrictions (13)
21520 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20  .  ** and (14). 
21530 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
21540 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d  Limit && p->pLim
21550 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  it ) return 0;  
21560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
21570 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20  estriction (13) 
21580 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
21590 4c 69 6d 69 74 20 26 26 20 70 53 75 62 2d 3e 70  Limit && pSub->p
215a0 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20 29 20  Limit->pRight ) 
215b0 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 52  return 0;   /* R
215c0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20  estriction (14) 
215d0 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  */.  if( (p->sel
215e0 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6f  Flags & SF_Compo
215f0 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62 2d  und)!=0 && pSub-
21600 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 72  >pLimit ){.    r
21610 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
21620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21640 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
21650 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20  on (15) */.  }. 
21660 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e 53   if( pSubSrc->nS
21670 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rc==0 ) return 0
21680 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21690 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
216a0 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20  iction (7)  */. 
216b0 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c   if( pSub->selFl
216c0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
216d0 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
216e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
216f0 69 63 74 69 6f 6e 20 28 34 29 20 20 2a 2f 0a 20  iction (4)  */. 
21700 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
21710 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72 63  t && (pSrc->nSrc
21720 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a  >1 || isAgg) ){.
21730 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
21740 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
21750 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f  ctions (8)(9) */
21760 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f  .  }.  if( p->pO
21770 72 64 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e  rderBy && pSub->
21780 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
21790 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
217a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217c0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
217d0 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a  ion (11) */.  }.
217e0 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 70    if( isAgg && p
217f0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20  Sub->pOrderBy ) 
21800 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
21810 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
21820 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a  riction (16) */.
21830 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
21840 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20  it && p->pWhere 
21850 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
21860 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
21870 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a  riction (19) */.
21880 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
21890 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61  it && (p->selFla
218a0 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
218b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74  )!=0 ){.     ret
218c0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f  urn 0;         /
218d0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
218e0 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  1) */.  }.  if( 
218f0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
21900 20 28 53 46 5f 52 65 63 75 72 73 69 76 65 29 20   (SF_Recursive) 
21910 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
21920 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 73   /* Restrictions
21930 20 28 32 32 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20   (22) */.  }..  
21940 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73  /*.  ** If the s
21950 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
21960 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
21970 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  a LEFT JOIN, the
21980 6e 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  n the.  ** subqu
21990 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  ery may not be a
219a0 20 6a 6f 69 6e 20 69 74 73 65 6c 66 20 28 33 61   join itself (3a
219b0 29 2e 20 45 78 61 6d 70 6c 65 20 6f 66 20 77 68  ). Example of wh
219c0 79 20 74 68 69 73 20 69 73 20 6e 6f 74 0a 20 20  y this is not.  
219d0 2a 2a 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ** allowed:.  **
219e0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
219f0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
21a00 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20   (t2 JOIN t3).  
21a10 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
21a20 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
21a30 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
21a40 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
21a50 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
21a60 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a  OIN t2) JOIN t3.
21a70 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20    **.  ** which 
21a80 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68  is not at all th
21a90 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20  e same thing..  
21aa0 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73  **.  ** If the s
21ab0 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
21ac0 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
21ad0 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  a LEFT JOIN, the
21ae0 6e 20 74 68 65 20 6f 75 74 65 72 0a 20 20 2a 2a  n the outer.  **
21af0 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65   query cannot be
21b00 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 28   an aggregate. (
21b10 33 63 29 20 20 54 68 69 73 20 69 73 20 61 6e 20  3c)  This is an 
21b20 61 72 74 69 66 61 63 74 20 6f 66 20 74 68 65 20  artifact of the 
21b30 77 61 79 0a 20 20 2a 2a 20 61 67 67 72 65 67 61  way.  ** aggrega
21b40 74 65 73 20 61 72 65 20 70 72 6f 63 65 73 73 65  tes are processe
21b50 64 20 2d 20 74 68 65 72 65 20 69 73 20 6e 6f 20  d - there is no 
21b60 6d 65 63 68 61 6e 69 73 6d 20 74 6f 20 64 65 74  mechanism to det
21b70 65 72 6d 69 6e 65 20 69 66 0a 20 20 2a 2a 20 74  ermine if.  ** t
21b80 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20 74 61 62  he LEFT JOIN tab
21b90 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 61 6c 6c  le should be all
21ba0 2d 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  -NULL..  **.  **
21bb0 20 53 65 65 20 61 6c 73 6f 20 74 69 63 6b 65 74   See also ticket
21bc0 73 20 23 33 30 36 2c 20 23 33 35 30 2c 20 61 6e  s #306, #350, an
21bd0 64 20 23 33 33 30 30 2e 0a 20 20 2a 2f 0a 20 20  d #3300..  */.  
21be0 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 66  if( (pSubitem->f
21bf0 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  g.jointype & JT_
21c00 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20  OUTER)!=0 ){.   
21c10 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 31 3b   isLeftJoin = 1;
21c20 0a 20 20 20 20 69 66 28 20 70 53 75 62 53 72 63  .    if( pSubSrc
21c30 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67  ->nSrc>1 || isAg
21c40 67 20 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70  g || IsVirtual(p
21c50 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  SubSrc->a[0].pTa
21c60 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 20  b) ){.      /*  
21c70 28 33 61 29 20 20 20 20 20 20 20 20 20 20 20 20  (3a)            
21c80 20 28 33 63 29 20 20 20 20 20 28 33 62 29 20 2a   (3c)     (3b) *
21c90 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
21ca0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64  ;.    }.  }.#ifd
21cb0 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
21cc0 49 46 4e 55 4c 4c 52 4f 57 0a 20 20 65 6c 73 65  IFNULLROW.  else
21cd0 20 69 66 28 20 69 46 72 6f 6d 3e 30 20 26 26 20   if( iFrom>0 && 
21ce0 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20 2f 2a  !isAgg ){.    /*
21cf0 20 53 65 74 74 69 6e 67 20 69 73 4c 65 66 74 4a   Setting isLeftJ
21d00 6f 69 6e 20 74 6f 20 2d 31 20 63 61 75 73 65 73  oin to -1 causes
21d10 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20 6f 70   OP_IfNullRow op
21d20 63 6f 64 65 73 20 74 6f 20 62 65 20 67 65 6e 65  codes to be gene
21d30 72 61 74 65 64 20 66 6f 72 0a 20 20 20 20 2a 2a  rated for.    **
21d40 20 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65   every reference
21d50 20 74 6f 20 61 6e 79 20 72 65 73 75 6c 74 20 63   to any result c
21d60 6f 6c 75 6d 6e 20 66 72 6f 6d 20 73 75 62 71 75  olumn from subqu
21d70 65 72 79 20 69 6e 20 61 20 6a 6f 69 6e 2c 20 65  ery in a join, e
21d80 76 65 6e 0a 20 20 20 20 2a 2a 20 74 68 6f 75 67  ven.    ** thoug
21d90 68 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6e  h they are not n
21da0 65 63 65 73 73 61 72 79 2e 20 20 54 68 69 73 20  ecessary.  This 
21db0 77 69 6c 6c 20 73 74 72 65 73 73 2d 74 65 73 74  will stress-test
21dc0 20 74 68 65 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f   the OP_IfNullRo
21dd0 77 20 0a 20 20 20 20 2a 2a 20 6f 70 63 6f 64 65  w .    ** opcode
21de0 2e 20 2a 2f 0a 20 20 20 20 69 73 4c 65 66 74 4a  . */.    isLeftJ
21df0 6f 69 6e 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65  oin = -1;.  }.#e
21e00 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 73 74 72  ndif..  /* Restr
21e10 69 63 74 69 6f 6e 20 28 31 37 29 3a 20 49 66 20  iction (17): If 
21e20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
21e30 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
21e40 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  CT, then it must
21e50 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74  .  ** use only t
21e60 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
21e70 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20  rator. And none 
21e80 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65  of the simple se
21e90 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a  lect queries.  *
21ea0 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  * that make up t
21eb0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
21ec0 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  CT are allowed t
21ed0 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20 6f  o be aggregate o
21ee0 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20  r distinct.  ** 
21ef0 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
21f00 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  if( pSub->pPrior
21f10 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62   ){.    if( pSub
21f20 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
21f30 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
21f40 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
21f50 30 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  0) */.    }.    
21f60 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d  if( isAgg || (p-
21f70 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
21f80 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70  istinct)!=0 || p
21f90 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a  Src->nSrc!=1 ){.
21fa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
21fb0 2f 2a 20 28 31 37 64 31 29 2c 20 28 31 37 64 32  /* (17d1), (17d2
21fc0 29 2c 20 6f 72 20 28 31 37 64 33 29 20 2a 2f 0a  ), or (17d3) */.
21fd0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53      }.    for(pS
21fe0 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b  ub1=pSub; pSub1;
21ff0 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50   pSub1=pSub1->pP
22000 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73  rior){.      tes
22010 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73  tcase( (pSub1->s
22020 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
22030 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
22040 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
22050 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ct );.      test
22060 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65  case( (pSub1->se
22070 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
22080 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
22090 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61  te))==SF_Aggrega
220a0 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  te );.      asse
220b0 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d  rt( pSub->pSrc!=
220c0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
220d0 74 28 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  t( pSub->pEList-
220e0 3e 6e 45 78 70 72 3d 3d 70 53 75 62 31 2d 3e 70  >nExpr==pSub1->p
220f0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a  EList->nExpr );.
22100 20 20 20 20 20 20 69 66 28 20 28 70 53 75 62 31        if( (pSub1
22110 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
22120 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
22130 72 65 67 61 74 65 29 29 21 3d 30 20 20 20 20 2f  regate))!=0    /
22140 2a 20 28 31 37 62 29 20 2a 2f 0a 20 20 20 20 20  * (17b) */.     
22150 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72    || (pSub1->pPr
22160 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70  ior && pSub1->op
22170 21 3d 54 4b 5f 41 4c 4c 29 20 20 20 20 20 20 20  !=TK_ALL)       
22180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 37            /* (17
22190 61 29 20 2a 2f 0a 20 20 20 20 20 20 20 7c 7c 20  a) */.       || 
221a0 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72  pSub1->pSrc->nSr
221b0 63 3c 31 20 20 20 20 20 20 20 20 20 20 20 20 20  c<1             
221c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221d0 20 20 20 20 20 2f 2a 20 28 31 37 63 29 20 2a 2f       /* (17c) */
221e0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
221f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
22200 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
22210 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d  se( pSub1->pSrc-
22220 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d  >nSrc>1 );.    }
22230 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63  ..    /* Restric
22240 74 69 6f 6e 20 28 31 38 29 2e 20 2a 2f 0a 20 20  tion (18). */.  
22250 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
22260 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  y ){.      int i
22270 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  i;.      for(ii=
22280 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42  0; ii<p->pOrderB
22290 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b  y->nExpr; ii++){
222a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
222b0 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e  pOrderBy->a[ii].
222c0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
222d0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
222e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
222f0 0a 0a 20 20 2f 2a 20 45 78 2d 72 65 73 74 72 69  ..  /* Ex-restri
22300 63 74 69 6f 6e 20 28 32 33 29 3a 0a 20 20 2a 2a  ction (23):.  **
22310 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68   The only way th
22320 61 74 20 74 68 65 20 72 65 63 75 72 73 69 76 65  at the recursive
22330 20 70 61 72 74 20 6f 66 20 61 20 43 54 45 20 63   part of a CTE c
22340 61 6e 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 6d  an contain a com
22350 70 6f 75 6e 64 0a 20 20 2a 2a 20 73 75 62 71 75  pound.  ** subqu
22360 65 72 79 20 69 73 20 66 6f 72 20 74 68 65 20 73  ery is for the s
22370 75 62 71 75 65 72 79 20 74 6f 20 62 65 20 6f 6e  ubquery to be on
22380 65 20 74 65 72 6d 20 6f 66 20 61 20 6a 6f 69 6e  e term of a join
22390 2e 20 20 42 75 74 20 69 66 20 74 68 65 0a 20 20  .  But if the.  
223a0 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 61  ** subquery is a
223b0 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20   join, then the 
223c0 66 6c 61 74 74 65 6e 69 6e 67 20 68 61 73 20 61  flattening has a
223d0 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74 6f 70  lready been stop
223e0 70 65 64 20 62 79 0a 20 20 2a 2a 20 72 65 73 74  ped by.  ** rest
223f0 72 69 63 74 69 6f 6e 20 28 31 37 64 33 29 0a 20  riction (17d3). 
22400 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
22410 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
22420 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20 7c 7c  Recursive)==0 ||
22430 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d 30   pSub->pPrior==0
22440 20 29 3b 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66   );..  /***** If
22450 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
22460 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67  oint, flattening
22470 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a   is permitted. *
22480 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54 54 52  ****/.  SELECTTR
22490 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28  ACE(1,pParse,p,(
224a0 22 66 6c 61 74 74 65 6e 20 25 73 2e 25 70 20 66  "flatten %s.%p f
224b0 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22 2c 0a  rom term %d\n",.
224c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224d0 20 20 20 70 53 75 62 2d 3e 7a 53 65 6c 4e 61 6d     pSub->zSelNam
224e0 65 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d 29 29  e, pSub, iFrom))
224f0 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a  ;..  /* Authoriz
22500 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  e the subquery *
22510 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  /.  pParse->zAut
22520 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69  hContext = pSubi
22530 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45  tem->zName;.  TE
22540 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69  STONLY(i =) sqli
22550 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
22560 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
22570 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  CT, 0, 0, 0);.  
22580 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c  testcase( i==SQL
22590 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50  ITE_DENY );.  pP
225a0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
225b0 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
225c0 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66  ontext;..  /* If
225d0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
225e0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
225f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
22600 68 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74  hen (by restrict
22610 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64  ions.  ** 17 and
22620 20 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75   18 above) it mu
22630 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c  st be a UNION AL
22640 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74  L and the parent
22650 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a   query must .  *
22660 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  * be of the form
22670 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
22680 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73  SELECT <expr-lis
22690 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75  t> FROM (<sub-qu
226a0 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61  ery>) <where-cla
226b0 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  use> .  **.  ** 
226c0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20  followed by any 
226d0 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
226e0 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c  and/or OFFSET cl
226f0 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63  auses. This bloc
22700 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e  k.  ** creates N
22710 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  -1 copies of the
22720 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69   parent query wi
22730 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20  thout any ORDER 
22740 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20  BY, LIMIT or .  
22750 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  ** OFFSET clause
22760 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d  s and joins them
22770 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e   to the left-han
22780 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72  d-side of the or
22790 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e  iginal.  ** usin
227a0 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  g UNION ALL oper
227b0 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ators. In this c
227c0 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ase N is the num
227d0 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20  ber of simple.  
227e0 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  ** select statem
227f0 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70  ents in the comp
22800 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a  ound sub-query..
22810 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c    **.  ** Exampl
22820 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
22830 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d   SELECT a+1 FROM
22840 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53   (.  **        S
22850 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
22860 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49  .  **        UNI
22870 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
22880 20 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d     SELECT y FROM
22890 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
228a0 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
228b0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62         SELECT ab
228c0 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32  s(z*2) FROM tab2
228d0 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52  .  **     ) WHER
228e0 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20  E a!=5 ORDER BY 
228f0 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e  1.  **.  ** Tran
22900 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20  sformed into:.  
22910 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
22920 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT x+1 FROM tab 
22930 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a  WHERE x+1!=5.  *
22940 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
22950 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
22960 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  y+1 FROM tab WHE
22970 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE y+1!=5.  **  
22980 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
22990 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73  *     SELECT abs
229a0 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62  (z*2)+1 FROM tab
229b0 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29  2 WHERE abs(z*2)
229c0 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f  +1!=5.  **     O
229d0 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20  RDER BY 1.  **. 
229e0 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73   ** We call this
229f0 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73   the "compound-s
22a00 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
22a10 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ng"..  */.  for(
22a20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
22a30 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53  r; pSub; pSub=pS
22a40 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
22a50 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
22a60 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
22a70 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
22a80 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  rBy;.    Expr *p
22a90 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
22aa0 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
22ab0 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
22ac0 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  r;.    p->pOrder
22ad0 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  By = 0;.    p->p
22ae0 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Src = 0;.    p->
22af0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
22b00 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
22b10 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
22b20 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
22b30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
22b40 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
22b50 4e 65 77 2c 20 70 53 75 62 2d 3e 7a 53 65 6c 4e  New, pSub->zSelN
22b60 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 4c 69  ame);.    p->pLi
22b70 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
22b80 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
22b90 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d  pOrderBy;.    p-
22ba0 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20  >pSrc = pSrc;.  
22bb0 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c    p->op = TK_ALL
22bc0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
22bd0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50  0 ){.      p->pP
22be0 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20  rior = pPrior;. 
22bf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22c00 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
22c10 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  Prior;.      if(
22c20 20 70 50 72 69 6f 72 20 29 20 70 50 72 69 6f 72   pPrior ) pPrior
22c30 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a  ->pNext = pNew;.
22c40 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78        pNew->pNex
22c50 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e  t = p;.      p->
22c60 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20  pPrior = pNew;. 
22c70 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
22c80 28 32 2c 70 50 61 72 73 65 2c 70 2c 28 22 63 6f  (2,pParse,p,("co
22c90 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20  mpound-subquery 
22ca0 66 6c 61 74 74 65 6e 65 72 22 0a 20 20 20 20 20  flattener".     
22cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cc0 20 20 20 20 20 20 20 20 20 22 20 63 72 65 61 74           " creat
22cd0 65 73 20 25 73 2e 25 70 20 61 73 20 70 65 65 72  es %s.%p as peer
22ce0 5c 6e 22 2c 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61  \n",pNew->zSelNa
22cf0 6d 65 2c 20 70 4e 65 77 29 29 3b 0a 20 20 20 20  me, pNew));.    
22d00 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
22d10 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
22d20 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
22d30 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e   Begin flattenin
22d40 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65  g the iFrom-th e
22d50 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
22d60 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e   clause .  ** in
22d70 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
22d80 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  ..  */.  pSub = 
22d90 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d  pSub1 = pSubitem
22da0 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a  ->pSelect;..  /*
22db0 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e   Delete the tran
22dc0 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
22dd0 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64  cture associated
22de0 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
22df0 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  ubquery.  */.  s
22e00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
22e10 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
22e20 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  base);.  sqlite3
22e30 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
22e40 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  tem->zName);.  s
22e50 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
22e60 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
22e70 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e  s);.  pSubitem->
22e80 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  zDatabase = 0;. 
22e90 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
22ea0 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
22eb0 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->zAlias = 0;.  
22ec0 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
22ed0 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66  t = 0;..  /* Def
22ee0 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  er deleting the 
22ef0 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73  Table object ass
22f00 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
22f10 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75  .  ** subquery u
22f20 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
22f30 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
22f40 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65  plete, since the
22f50 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69  re may still exi
22f60 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74  st Expr.pTab ent
22f70 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72  ries that.  ** r
22f80 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71  efer to the subq
22f90 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20  uery even after 
22fa0 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63  flattening.  Tic
22fb0 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a  ket #3346..  **.
22fc0 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70    ** pSubitem->p
22fd0 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f  Tab is always no
22fe0 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72  n-NULL by test r
22ff0 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20  estrictions and 
23000 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a  tests above..  *
23010 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
23020 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30  Subitem->pTab!=0
23030 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ) ){.    Table *
23040 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62  pTabToDel = pSub
23050 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  item->pTab;.    
23060 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e  if( pTabToDel->n
23070 54 61 62 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20  TabRef==1 ){.   
23080 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65     Parse *pTople
23090 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
230a0 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
230b0 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f  e);.      pTabTo
230c0 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65  Del->pNextZombie
230d0 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a   = pToplevel->pZ
230e0 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20  ombieTab;.      
230f0 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
23100 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65  ieTab = pTabToDe
23110 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
23120 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e      pTabToDel->n
23130 54 61 62 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a  TabRef--;.    }.
23140 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54      pSubitem->pT
23150 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ab = 0;.  }..  /
23160 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
23170 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66  loop runs once f
23180 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20  or each term in 
23190 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  a compound-subqu
231a0 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e  ery.  ** flatten
231b0 69 6e 67 20 28 61 73 20 64 65 73 63 72 69 62 65  ing (as describe
231c0 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65  d above).  If we
231d0 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66   are doing a dif
231e0 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a  ferent kind.  **
231f0 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d   of flattening -
23200 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74   a flattening ot
23210 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f  her than a compo
23220 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61  und-subquery fla
23230 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74  ttening -.  ** t
23240 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e  hen this loop on
23250 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20  ly runs once..  
23260 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
23270 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74  p moves all of t
23280 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73  he FROM elements
23290 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
232a0 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74   into the.  ** t
232b0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
232c0 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
232d0 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  y.  Before doing
232e0 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a   this, remember.
232f0 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20    ** the cursor 
23300 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f  number for the o
23310 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75  riginal outer qu
23320 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  ery FROM element
23330 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74   in.  ** iParent
23340 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63  .  The iParent c
23350 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72  ursor will never
23360 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65   be used.  Subse
23370 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20  quent code.  ** 
23380 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73  will scan expres
23390 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f  sions looking fo
233a0 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65  r iParent refere
233b0 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65  nces and replace
233c0 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65  .  ** those refe
233d0 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72  rences with expr
233e0 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73  essions that res
233f0 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71  olve to the subq
23400 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65  uery FROM.  ** e
23410 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e  lements we are n
23420 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20  ow copying in.. 
23430 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e   */.  for(pParen
23440 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50  t=p; pParent; pP
23450 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70  arent=pParent->p
23460 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62  Prior, pSub=pSub
23470 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69  ->pPrior){.    i
23480 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20  nt nSubSrc;.    
23490 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b  u8 jointype = 0;
234a0 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d 20 70  .    pSubSrc = p
234b0 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f  Sub->pSrc;     /
234c0 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  * FROM clause of
234d0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20   subquery */.   
234e0 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53   nSubSrc = pSubS
234f0 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75  rc->nSrc;  /* Nu
23500 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
23510 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63   subquery FROM c
23520 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72  lause */.    pSr
23530 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72  c = pParent->pSr
23540 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  c;     /* FROM c
23550 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
23560 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20  er query */..   
23570 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20   if( pSrc ){.   
23580 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
23590 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72  nt==p );  /* Fir
235a0 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20  st time through 
235b0 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  the loop */.    
235c0 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75    jointype = pSu
235d0 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  bitem->fg.jointy
235e0 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pe;.    }else{. 
235f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
23600 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32  rent!=p );  /* 2
23610 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
23620 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20  t times through 
23630 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  the loop */.    
23640 20 20 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74    pSrc = pParent
23650 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
23660 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62  SrcListAppend(db
23670 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
23680 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b    if( pSrc==0 ){
23690 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
236a0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
236b0 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  d );.        bre
236c0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
236d0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75  }..    /* The su
236e0 62 71 75 65 72 79 20 75 73 65 73 20 61 20 73 69  bquery uses a si
236f0 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65  ngle slot of the
23700 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
23710 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a  the outer.    **
23720 20 71 75 65 72 79 2e 20 20 49 66 20 74 68 65 20   query.  If the 
23730 73 75 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72  subquery has mor
23740 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65  e than one eleme
23750 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63  nt in its FROM c
23760 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68  lause,.    ** th
23770 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  en expand the ou
23780 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b  ter query to mak
23790 65 20 73 70 61 63 65 20 66 6f 72 20 69 74 20 74  e space for it t
237a0 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65  o hold all eleme
237b0 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nts.    ** of th
237c0 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  e subquery..    
237d0 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  **.    ** Exampl
237e0 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
237f0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
23800 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20  M tabA, (SELECT 
23810 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62  * FROM sub1, sub
23820 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a  2), tabB;.    **
23830 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65  .    ** The oute
23840 72 20 71 75 65 72 79 20 68 61 73 20 33 20 73 6c  r query has 3 sl
23850 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20  ots in its FROM 
23860 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f  clause.  One slo
23870 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  t of the.    ** 
23880 6f 75 74 65 72 20 71 75 65 72 79 20 28 74 68 65  outer query (the
23890 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73   middle slot) is
238a0 20 75 73 65 64 20 62 79 20 74 68 65 20 73 75 62   used by the sub
238b0 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74  query.  The next
238c0 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66  .    ** block of
238d0 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e   code will expan
238e0 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
238f0 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f  y FROM clause to
23900 20 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a   4 slots..    **
23910 20 54 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74   The middle slot
23920 20 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20   is expanded to 
23930 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64  two slots in ord
23940 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65  er to make space
23950 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  .    ** for the 
23960 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  two elements in 
23970 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
23980 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
23990 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
239a0 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20  nSubSrc>1 ){.   
239b0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63     pParent->pSrc
239c0 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65   = pSrc = sqlite
239d0 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
239e0 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72  db, pSrc, nSubSr
239f0 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20  c-1,iFrom+1);.  
23a00 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
23a10 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
23a20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
23a30 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
23a40 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 46 52   Transfer the FR
23a50 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  OM clause terms 
23a60 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72  from the subquer
23a70 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a  y into the.    *
23a80 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  * outer query.. 
23a90 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
23aa0 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b  0; i<nSubSrc; i+
23ab0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
23ac0 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
23ad0 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f  , pSrc->a[i+iFro
23ae0 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20  m].pUsing);.    
23af0 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e    assert( pSrc->
23b00 61 5b 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e 69 73  a[i+iFrom].fg.is
23b10 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a 20 20  TabFunc==0 );.  
23b20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46      pSrc->a[i+iF
23b30 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e  rom] = pSubSrc->
23b40 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 4e 65 77  a[i];.      iNew
23b50 50 61 72 65 6e 74 20 3d 20 70 53 75 62 53 72 63  Parent = pSubSrc
23b60 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a  ->a[i].iCursor;.
23b70 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53        memset(&pS
23b80 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20  ubSrc->a[i], 0, 
23b90 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e  sizeof(pSubSrc->
23ba0 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  a[i]));.    }.  
23bb0 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d    pSrc->a[iFrom]
23bc0 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a  .fg.jointype = j
23bd0 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20  ointype;.  .    
23be0 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62  /* Now begin sub
23bf0 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65  stituting subque
23c00 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78  ry result set ex
23c10 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20  pressions for . 
23c20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73     ** references
23c30 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20   to the iParent 
23c40 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
23c50 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20  ry..    ** .    
23c60 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20  ** Example:.    
23c70 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45  **.    **   SELE
23c80 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f  CT a+5, b*10 FRO
23c90 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53  M (SELECT x*3 AS
23ca0 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52   a, y+10 AS b FR
23cb0 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62  OM t1) WHERE a>b
23cc0 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20  ;.    **   \    
23cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ce0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20   \_____________ 
23cf0 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  subquery _______
23d00 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a  ___/          /.
23d10 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f      **    \_____
23d20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23d30 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
23d40 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23d50 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20  ___________/.   
23d60 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f   **.    ** We lo
23d70 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72  ok at every expr
23d80 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75  ession in the ou
23d90 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76  ter query and ev
23da0 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
23db0 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73  .    ** "a" we s
23dc0 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20  ubstitute "x*3" 
23dd0 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
23de0 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75  we see "b" we su
23df0 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e  bstitute "y+10".
23e00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
23e10 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
23e20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68  {.      /* At th
23e30 69 73 20 70 6f 69 6e 74 2c 20 61 6e 79 20 6e 6f  is point, any no
23e40 6e 2d 7a 65 72 6f 20 69 4f 72 64 65 72 42 79 43  n-zero iOrderByC
23e50 6f 6c 20 76 61 6c 75 65 73 20 69 6e 64 69 63 61  ol values indica
23e60 74 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  te that the.    
23e70 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 63 6f    ** ORDER BY co
23e80 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
23e90 69 73 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20  is identical to 
23ea0 74 68 65 20 69 4f 72 64 65 72 42 79 43 6f 6c 27  the iOrderByCol'
23eb0 74 68 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  th.      ** expr
23ec0 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  ession returned 
23ed0 62 79 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  by SELECT statem
23ee0 65 6e 74 20 70 53 75 62 2e 20 53 69 6e 63 65 20  ent pSub. Since 
23ef0 74 68 65 73 65 20 76 61 6c 75 65 73 0a 20 20 20  these values.   
23f00 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 63     ** do not nec
23f10 65 73 73 61 72 69 6c 79 20 63 6f 72 72 65 73 70  essarily corresp
23f20 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ond to columns i
23f30 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
23f40 6e 74 20 70 50 61 72 65 6e 74 2c 0a 20 20 20 20  nt pParent,.    
23f50 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 6d 20 62    ** zero them b
23f60 65 66 6f 72 65 20 74 72 61 6e 73 66 65 72 69 6e  efore transferin
23f70 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  g the ORDER BY c
23f80 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  lause..      **.
23f90 20 20 20 20 20 20 2a 2a 20 4e 6f 74 20 64 6f 69        ** Not doi
23fa0 6e 67 20 74 68 69 73 20 6d 61 79 20 63 61 75 73  ng this may caus
23fb0 65 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 20  e an error if a 
23fc0 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20  subsequent call 
23fd0 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a  to this.      **
23fe0 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
23ff0 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 20  ts to flatten a 
24000 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
24010 72 79 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 0a  ry into pParent.
24020 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20 6f 6e        ** (the on
24030 6c 79 20 77 61 79 20 74 68 69 73 20 63 61 6e 20  ly way this can 
24040 68 61 70 70 65 6e 20 69 73 20 69 66 20 74 68 65  happen is if the
24050 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75   compound sub-qu
24060 65 72 79 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ery is.      ** 
24070 63 75 72 72 65 6e 74 6c 79 20 70 61 72 74 20 6f  currently part o
24080 66 20 70 53 75 62 2d 3e 70 53 72 63 29 2e 20 53  f pSub->pSrc). S
24090 65 65 20 74 69 63 6b 65 74 20 5b 64 31 31 61 36  ee ticket [d11a6
240a0 65 39 30 38 66 5d 2e 20 20 2a 2f 0a 20 20 20 20  e908f].  */.    
240b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
240c0 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72  erBy = pSub->pOr
240d0 64 65 72 42 79 3b 0a 20 20 20 20 20 20 66 6f 72  derBy;.      for
240e0 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
240f0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
24100 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d         pOrderBy-
24110 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
24120 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  ByCol = 0;.     
24130 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
24140 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
24150 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  By==0 );.      p
24160 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
24170 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
24180 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42     pSub->pOrderB
24190 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 0;.    }.   
241a0 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   pWhere = sqlite
241b0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75  3ExprDup(db, pSu
241c0 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20  b->pWhere, 0);. 
241d0 20 20 20 69 66 28 20 69 73 4c 65 66 74 4a 6f 69     if( isLeftJoi
241e0 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 65 74  n>0 ){.      set
241f0 4a 6f 69 6e 45 78 70 72 28 70 57 68 65 72 65 2c  JoinExpr(pWhere,
24200 20 69 4e 65 77 50 61 72 65 6e 74 29 3b 0a 20 20   iNewParent);.  
24210 20 20 7d 0a 20 20 20 20 70 50 61 72 65 6e 74 2d    }.    pParent-
24220 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
24230 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 57 68  3ExprAnd(db, pWh
24240 65 72 65 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57  ere, pParent->pW
24250 68 65 72 65 29 3b 0a 20 20 20 20 69 66 28 20 64  here);.    if( d
24260 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
24270 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73  =0 ){.      Subs
24280 74 43 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20  tContext x;.    
24290 20 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61    x.pParse = pPa
242a0 72 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61  rse;.      x.iTa
242b0 62 6c 65 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20  ble = iParent;. 
242c0 20 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65       x.iNewTable
242d0 20 3d 20 69 4e 65 77 50 61 72 65 6e 74 3b 0a 20   = iNewParent;. 
242e0 20 20 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69       x.isLeftJoi
242f0 6e 20 3d 20 69 73 4c 65 66 74 4a 6f 69 6e 3b 0a  n = isLeftJoin;.
24300 20 20 20 20 20 20 78 2e 70 45 4c 69 73 74 20 3d        x.pEList =
24310 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 3b 0a 20   pSub->pEList;. 
24320 20 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74       substSelect
24330 28 26 78 2c 20 70 50 61 72 65 6e 74 2c 20 30 29  (&x, pParent, 0)
24340 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
24350 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65 64 20  * The flattened 
24360 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
24370 74 20 69 66 20 65 69 74 68 65 72 20 74 68 65 20  t if either the 
24380 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20 20 20  inner or the.   
24390 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
243a0 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a 20 20  is distinct. .  
243b0 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65 6e 74    */.    pParent
243c0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 70 53  ->selFlags |= pS
243d0 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
243e0 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 0a 20  F_Distinct;.  . 
243f0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 45 4c     /*.    ** SEL
24400 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28 53 45  ECT ... FROM (SE
24410 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54 20 61  LECT ... LIMIT a
24420 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d 49 54   OFFSET b) LIMIT
24430 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20 20 20   x OFFSET y;.   
24440 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65 20 69   **.    ** One i
24450 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74 72 79  s tempted to try
24460 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20 62 20   to add a and b 
24470 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 6c  to combine the l
24480 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68 69 73  imits.  But this
24490 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  .    ** does not
244a0 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65 72 20   work if either 
244b0 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
244c0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
244d0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  ( pSub->pLimit )
244e0 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  {.      pParent-
244f0 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62 2d 3e  >pLimit = pSub->
24500 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 53  pLimit;.      pS
24510 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ub->pLimit = 0;.
24520 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
24530 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65 74 65  Finially, delete
24540 20 77 68 61 74 20 69 73 20 6c 65 66 74 20 6f 66   what is left of
24550 20 74 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   the subquery an
24560 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 73 75  d return.  ** su
24570 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  ccess..  */.  sq
24580 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
24590 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a 0a 23  e(db, pSub1);..#
245a0 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
245b0 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c  NABLED.  if( sql
245c0 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
245d0 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 53  & 0x100 ){.    S
245e0 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30  ELECTTRACE(0x100
245f0 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65  ,pParse,p,("Afte
24600 72 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c 6e 22  r flattening:\n"
24610 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  ));.    sqlite3T
24620 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
24630 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   p, 0);.  }.#end
24640 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  if..  return 1;.
24650 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
24660 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
24670 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
24680 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
24690 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 0a 0a 23  IT_VIEW) */....#
246a0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
246b0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
246c0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
246d0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
246e0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65  /*.** Make copie
246f0 73 20 6f 66 20 72 65 6c 65 76 61 6e 74 20 57 48  s of relevant WH
24700 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
24710 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
24720 65 72 79 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20  ery into.** the 
24730 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
24740 73 75 62 71 75 65 72 79 2e 20 20 45 78 61 6d 70  subquery.  Examp
24750 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  le:.**.**    SEL
24760 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45  ECT * FROM (SELE
24770 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64 20 41  CT a AS x, c-d A
24780 53 20 79 20 46 52 4f 4d 20 74 31 29 20 57 48 45  S y FROM t1) WHE
24790 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30 3b  RE x=5 AND y=10;
247a0 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f 72 6d  .**.** Transform
247b0 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20  ed into:.**.**  
247c0 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
247d0 28 53 45 4c 45 43 54 20 61 20 41 53 20 78 2c 20  (SELECT a AS x, 
247e0 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31  c-d AS y FROM t1
247f0 20 57 48 45 52 45 20 61 3d 35 20 41 4e 44 20 63   WHERE a=5 AND c
24800 2d 64 3d 31 30 29 0a 2a 2a 20 20 20 20 20 57 48  -d=10).**     WH
24810 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31 30  ERE x=5 AND y=10
24820 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f 70 65  ;.**.** The hope
24830 20 69 73 20 74 68 61 74 20 74 68 65 20 74 65 72   is that the ter
24840 6d 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ms added to the 
24850 69 6e 6e 65 72 20 71 75 65 72 79 20 77 69 6c 6c  inner query will
24860 20 6d 61 6b 65 20 69 74 20 6d 6f 72 65 0a 2a 2a   make it more.**
24870 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
24880 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
24890 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
248a0 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  on if:.**.**   (
248b0 31 29 20 28 2a 2a 20 54 68 69 73 20 72 65 73 74  1) (** This rest
248c0 72 69 63 74 69 6f 6e 20 77 61 73 20 72 65 6d 6f  riction was remo
248d0 76 65 64 20 6f 6e 20 32 30 31 37 2d 30 39 2d 32  ved on 2017-09-2
248e0 39 2e 20 20 57 65 20 75 73 65 64 20 74 6f 0a 2a  9.  We used to.*
248f0 2a 20 20 20 20 20 20 20 20 20 20 20 64 69 73 61  *           disa
24900 6c 6c 6f 77 20 74 68 69 73 20 6f 70 74 69 6d 69  llow this optimi
24910 7a 61 74 69 6f 6e 20 66 6f 72 20 61 67 67 72 65  zation for aggre
24920 67 61 74 65 20 73 75 62 71 75 65 72 69 65 73 2c  gate subqueries,
24930 20 62 75 74 20 6e 6f 77 0a 2a 2a 20 20 20 20 20   but now.**     
24940 20 20 20 20 20 20 69 74 20 69 73 20 61 6c 6c 6f        it is allo
24950 77 65 64 20 62 79 20 70 75 74 74 69 6e 67 20 74  wed by putting t
24960 68 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  he extra terms o
24970 6e 20 74 68 65 20 48 41 56 49 4e 47 20 63 6c 61  n the HAVING cla
24980 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  use..**         
24990 20 20 54 68 65 20 61 64 64 65 64 20 48 41 56 49    The added HAVI
249a0 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70 6f 69  NG clause is poi
249b0 6e 74 6c 65 73 73 20 69 66 20 74 68 65 20 73 75  ntless if the su
249c0 62 71 75 65 72 79 20 6c 61 63 6b 73 0a 2a 2a 20  bquery lacks.** 
249d0 20 20 20 20 20 20 20 20 20 20 61 20 47 52 4f 55            a GROU
249e0 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 42 75  P BY clause.  Bu
249f0 74 20 73 75 63 68 20 61 20 48 41 56 49 4e 47 20  t such a HAVING 
24a00 63 6c 61 75 73 65 20 69 73 20 61 6c 73 6f 20 68  clause is also h
24a10 61 72 6d 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20  armless.**      
24a20 20 20 20 20 20 73 6f 20 74 68 65 72 65 20 64 6f       so there do
24a30 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20 74 6f  es not appear to
24a40 20 62 65 20 61 6e 79 20 72 65 61 73 6f 6e 20 74   be any reason t
24a50 6f 20 61 64 64 20 65 78 74 72 61 20 6c 6f 67 69  o add extra logi
24a60 63 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74  c.**           t
24a70 6f 20 73 75 70 70 72 65 73 73 20 69 74 2e 20 2a  o suppress it. *
24a80 2a 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 54  *).**.**   (2) T
24a90 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 69  he inner query i
24aa0 73 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  s the recursive 
24ab0 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d 6f 6e  part of a common
24ac0 20 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f   table expressio
24ad0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 54  n..**.**   (3) T
24ae0 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 68  he inner query h
24af0 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  as a LIMIT claus
24b00 65 20 28 73 69 6e 63 65 20 74 68 65 20 63 68 61  e (since the cha
24b10 6e 67 65 73 20 74 6f 20 74 68 65 20 57 48 45 52  nges to the WHER
24b20 45 0a 2a 2a 20 20 20 20 20 20 20 63 6c 6f 73 65  E.**       close
24b30 20 77 6f 75 6c 64 20 63 68 61 6e 67 65 20 74 68   would change th
24b40 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
24b50 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a 20 20   LIMIT)..**.**  
24b60 20 28 34 29 20 54 68 65 20 69 6e 6e 65 72 20 71   (4) The inner q
24b70 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68  uery is the righ
24b80 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 4c  t operand of a L
24b90 45 46 54 20 4a 4f 49 4e 20 61 6e 64 20 74 68 65  EFT JOIN and the
24ba0 0a 2a 2a 20 20 20 20 20 20 20 65 78 70 72 65 73  .**       expres
24bb0 73 69 6f 6e 20 74 6f 20 62 65 20 70 75 73 68 65  sion to be pushe
24bc0 64 20 64 6f 77 6e 20 64 6f 65 73 20 6e 6f 74 20  d down does not 
24bd0 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4f 4e  come from the ON
24be0 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20   clause.**      
24bf0 20 6f 6e 20 74 68 61 74 20 4c 45 46 54 20 4a 4f   on that LEFT JO
24c00 49 4e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35 29 20  IN..**.**   (5) 
24c10 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
24c20 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67   expression orig
24c30 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20 4f 4e  inates in the ON
24c40 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
24c50 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61 20 4c  .**       of a L
24c60 45 46 54 20 4a 4f 49 4e 20 77 68 65 72 65 20 69  EFT JOIN where i
24c70 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 74 68  Cursor is not th
24c80 65 20 72 69 67 68 74 2d 68 61 6e 64 20 74 61 62  e right-hand tab
24c90 6c 65 20 6f 66 20 74 68 61 74 0a 2a 2a 20 20 20  le of that.**   
24ca0 20 20 20 20 6c 65 66 74 20 6a 6f 69 6e 2e 20 20      left join.  
24cb0 41 6e 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  An example:.**.*
24cc0 2a 20 20 20 20 20 20 20 20 20 20 20 53 45 4c 45  *           SELE
24cd0 43 54 20 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  CT *.**         
24ce0 20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 31    FROM (SELECT 1
24cf0 20 41 53 20 61 31 20 55 4e 49 4f 4e 20 41 4c 4c   AS a1 UNION ALL
24d00 20 53 45 4c 45 43 54 20 32 29 20 41 53 20 61 61   SELECT 2) AS aa
24d10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 4a 4f  .**           JO
24d20 49 4e 20 28 53 45 4c 45 43 54 20 31 20 41 53 20  IN (SELECT 1 AS 
24d30 62 32 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  b2 UNION ALL SEL
24d40 45 43 54 20 32 29 20 41 53 20 62 62 20 4f 4e 20  ECT 2) AS bb ON 
24d50 28 61 31 3d 62 32 29 0a 2a 2a 20 20 20 20 20 20  (a1=b2).**      
24d60 20 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e 20 28       LEFT JOIN (
24d70 53 45 4c 45 43 54 20 38 20 41 53 20 63 33 20 55  SELECT 8 AS c3 U
24d80 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
24d90 39 29 20 41 53 20 63 63 20 4f 4e 20 28 62 32 3d  9) AS cc ON (b2=
24da0 32 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  2);.**.**       
24db0 54 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  The correct answ
24dc0 65 72 20 69 73 20 74 68 72 65 65 20 72 6f 77 73  er is three rows
24dd0 3a 20 20 28 31 2c 31 2c 4e 55 4c 4c 29 2c 28 32  :  (1,1,NULL),(2
24de0 2c 32 2c 38 29 2c 28 32 2c 32 2c 39 29 2e 0a 2a  ,2,8),(2,2,9)..*
24df0 2a 20 20 20 20 20 20 20 42 75 74 20 69 66 20 74  *       But if t
24e00 68 65 20 28 62 32 3d 32 29 20 74 65 72 6d 20 77  he (b2=2) term w
24e10 65 72 65 20 74 6f 20 62 65 20 70 75 73 68 65 64  ere to be pushed
24e20 20 64 6f 77 6e 20 69 6e 74 6f 20 74 68 65 20 62   down into the b
24e30 62 20 73 75 62 71 75 65 72 79 2c 0a 2a 2a 20 20  b subquery,.**  
24e40 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 28 31       then the (1
24e50 2c 31 2c 4e 55 4c 4c 29 20 72 6f 77 20 77 6f 75  ,1,NULL) row wou
24e60 6c 64 20 62 65 20 73 75 70 70 72 65 73 73 65 64  ld be suppressed
24e70 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
24e80 20 69 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 61   if no changes a
24e90 72 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f 6e 2d  re made and non-
24ea0 7a 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72 20 6d  zero if one or m
24eb0 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ore WHERE clause
24ec0 0a 2a 2a 20 74 65 72 6d 73 20 61 72 65 20 64 75  .** terms are du
24ed0 70 6c 69 63 61 74 65 64 20 69 6e 74 6f 20 74 68  plicated into th
24ee0 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
24ef0 74 61 74 69 63 20 69 6e 74 20 70 75 73 68 44 6f  tatic int pushDo
24f00 77 6e 57 68 65 72 65 54 65 72 6d 73 28 0a 20 20  wnWhereTerms(.  
24f10 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
24f20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
24f30 6f 6e 74 65 78 74 20 28 66 6f 72 20 6d 61 6c 6c  ontext (for mall
24f40 6f 63 28 29 20 61 6e 64 20 65 72 72 6f 72 20 72  oc() and error r
24f50 65 70 6f 72 74 69 6e 67 29 20 2a 2f 0a 20 20 53  eporting) */.  S
24f60 65 6c 65 63 74 20 2a 70 53 75 62 71 2c 20 20 20  elect *pSubq,   
24f70 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71       /* The subq
24f80 75 65 72 79 20 77 68 6f 73 65 20 57 48 45 52 45  uery whose WHERE
24f90 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20 62 65   clause is to be
24fa0 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a 20 20   augmented */.  
24fb0 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20  Expr *pWhere,   
24fc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
24fd0 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
24fe0 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
24ff0 20 20 69 6e 74 20 69 43 75 72 73 6f 72 2c 20 20    int iCursor,  
25000 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
25010 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
25020 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  subquery */.  in
25030 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 20 20 20  t isLeftJoin    
25040 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
25050 53 75 62 71 20 69 73 20 74 68 65 20 72 69 67 68  Subq is the righ
25060 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54  t term of a LEFT
25070 20 4a 4f 49 4e 20 2a 2f 0a 29 7b 0a 20 20 45 78   JOIN */.){.  Ex
25080 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  pr *pNew;.  int 
25090 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 69 66 28  nChng = 0;.  if(
250a0 20 70 57 68 65 72 65 3d 3d 30 20 29 20 72 65 74   pWhere==0 ) ret
250b0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 53 75  urn 0;.  if( pSu
250c0 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  bq->selFlags & S
250d0 46 5f 52 65 63 75 72 73 69 76 65 20 29 20 72 65  F_Recursive ) re
250e0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 72 65 73 74  turn 0;  /* rest
250f0 72 69 63 74 69 6f 6e 20 28 32 29 20 2a 2f 0a 0a  riction (2) */..
25100 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
25110 42 55 47 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68  BUG.  /* Only th
25120 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20  e first term of 
25130 61 20 63 6f 6d 70 6f 75 6e 64 20 63 61 6e 20 68  a compound can h
25140 61 76 65 20 61 20 57 49 54 48 20 63 6c 61 75 73  ave a WITH claus
25150 65 2e 20 20 42 75 74 20 6d 61 6b 65 0a 20 20 2a  e.  But make.  *
25160 2a 20 73 75 72 65 20 6e 6f 20 6f 74 68 65 72 20  * sure no other 
25170 74 65 72 6d 73 20 61 72 65 20 6d 61 72 6b 65 64  terms are marked
25180 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 69 6e   SF_Recursive in
25190 20 63 61 73 65 20 73 6f 6d 65 74 68 69 6e 67 20   case something 
251a0 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 69 6e 20  changes.  ** in 
251b0 74 68 65 20 66 75 74 75 72 65 2e 0a 20 20 2a 2f  the future..  */
251c0 0a 20 20 7b 0a 20 20 20 20 53 65 6c 65 63 74 20  .  {.    Select 
251d0 2a 70 58 3b 20 20 0a 20 20 20 20 66 6f 72 28 70  *pX;  .    for(p
251e0 58 3d 70 53 75 62 71 3b 20 70 58 3b 20 70 58 3d  X=pSubq; pX; pX=
251f0 70 58 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  pX->pPrior){.   
25200 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e     assert( (pX->
25210 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 52  selFlags & (SF_R
25220 65 63 75 72 73 69 76 65 29 29 3d 3d 30 20 29 3b  ecursive))==0 );
25230 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
25240 66 0a 0a 20 20 69 66 28 20 70 53 75 62 71 2d 3e  f..  if( pSubq->
25250 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20 20 20  pLimit!=0 ){.   
25260 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
25270 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20 2a 2f  striction (3) */
25280 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 57  .  }.  while( pW
25290 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44  here->op==TK_AND
252a0 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20 2b 3d   ){.    nChng +=
252b0 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
252c0 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53 75 62  rms(pParse, pSub
252d0 71 2c 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68  q, pWhere->pRigh
252e0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
252f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25300 20 20 20 69 43 75 72 73 6f 72 2c 20 69 73 4c 65     iCursor, isLe
25310 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 70 57 68  ftJoin);.    pWh
25320 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e 70 4c  ere = pWhere->pL
25330 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  eft;.  }.  if( i
25340 73 4c 65 66 74 4a 6f 69 6e 0a 20 20 20 26 26 20  sLeftJoin.   && 
25350 28 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  (ExprHasProperty
25360 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a  (pWhere,EP_FromJ
25370 6f 69 6e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  oin)==0.        
25380 20 7c 7c 20 70 57 68 65 72 65 2d 3e 69 52 69 67   || pWhere->iRig
25390 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 69 43 75  htJoinTable!=iCu
253a0 72 73 6f 72 29 0a 20 20 29 7b 0a 20 20 20 20 72  rsor).  ){.    r
253b0 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74  eturn 0; /* rest
253c0 72 69 63 74 69 6f 6e 20 28 34 29 20 2a 2f 0a 20  riction (4) */. 
253d0 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48 61 73   }.  if( ExprHas
253e0 50 72 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c  Property(pWhere,
253f0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 26 26 20  EP_FromJoin) && 
25400 70 57 68 65 72 65 2d 3e 69 52 69 67 68 74 4a 6f  pWhere->iRightJo
25410 69 6e 54 61 62 6c 65 21 3d 69 43 75 72 73 6f 72  inTable!=iCursor
25420 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
25430 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
25440 20 28 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66   (5) */.  }.  if
25450 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 54  ( sqlite3ExprIsT
25460 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 57 68  ableConstant(pWh
25470 65 72 65 2c 20 69 43 75 72 73 6f 72 29 20 29 7b  ere, iCursor) ){
25480 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a 20 20  .    nChng++;.  
25490 20 20 77 68 69 6c 65 28 20 70 53 75 62 71 20 29    while( pSubq )
254a0 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43 6f 6e  {.      SubstCon
254b0 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20 70 4e  text x;.      pN
254c0 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
254d0 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
254e0 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  pWhere, 0);.    
254f0 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28    unsetJoinExpr(
25500 70 4e 65 77 2c 20 2d 31 29 3b 0a 20 20 20 20 20  pNew, -1);.     
25510 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   x.pParse = pPar
25520 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54 61 62  se;.      x.iTab
25530 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20  le = iCursor;.  
25540 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c 65 20      x.iNewTable 
25550 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  = iCursor;.     
25560 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20   x.isLeftJoin = 
25570 30 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c 69 73  0;.      x.pELis
25580 74 20 3d 20 70 53 75 62 71 2d 3e 70 45 4c 69 73  t = pSubq->pELis
25590 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  t;.      pNew = 
255a0 73 75 62 73 74 45 78 70 72 28 26 78 2c 20 70 4e  substExpr(&x, pN
255b0 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ew);.      if( p
255c0 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Subq->selFlags &
255d0 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29 7b   SF_Aggregate ){
255e0 0a 20 20 20 20 20 20 20 20 70 53 75 62 71 2d 3e  .        pSubq->
255f0 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
25600 33 45 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d  3ExprAnd(pParse-
25610 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 48 61 76  >db, pSubq->pHav
25620 69 6e 67 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  ing, pNew);.    
25630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25640 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65 20 3d   pSubq->pWhere =
25650 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
25660 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 75 62  pParse->db, pSub
25670 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65 77 29  q->pWhere, pNew)
25680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25690 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d 3e 70  pSubq = pSubq->p
256a0 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Prior;.    }.  }
256b0 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e 67 3b  .  return nChng;
256c0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
256d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
256e0 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
256f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
25700 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a  MIT_VIEW) */../*
25710 0a 2a 2a 20 54 68 65 20 70 46 75 6e 63 20 69 73  .** The pFunc is
25720 20 74 68 65 20 6f 6e 6c 79 20 61 67 67 72 65 67   the only aggreg
25730 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20  ate function in 
25740 74 68 65 20 71 75 65 72 79 2e 20 20 43 68 65 63  the query.  Chec
25750 6b 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66 20 74  k to see.** if t
25760 68 65 20 71 75 65 72 79 20 69 73 20 61 20 63 61  he query is a ca
25770 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65 20  ndidate for the 
25780 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61  min/max optimiza
25790 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
257a0 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20 63  the query is a c
257b0 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68 65  andidate for the
257c0 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a   min/max optimiz
257d0 61 74 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 0a  ation, then set.
257e0 2a 2a 20 2a 70 70 4d 69 6e 4d 61 78 20 74 6f 20  ** *ppMinMax to 
257f0 62 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  be an ORDER BY c
25800 6c 61 75 73 65 20 74 6f 20 62 65 20 75 73 65 64  lause to be used
25810 20 66 6f 72 20 74 68 65 20 6f 70 74 69 6d 69 7a   for the optimiz
25820 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 74  ation.** and ret
25830 75 72 6e 20 65 69 74 68 65 72 20 57 48 45 52 45  urn either WHERE
25840 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20  _ORDERBY_MIN or 
25850 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
25860 58 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 0a 2a  X depending on.*
25870 2a 20 77 68 65 74 68 65 72 20 70 46 75 6e 63 20  * whether pFunc 
25880 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20 6d 61  is a min() or ma
25890 78 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  x() function..**
258a0 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
258b0 20 69 73 20 6e 6f 74 20 61 20 63 61 6e 64 69 64   is not a candid
258c0 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69 6e 2f  ate for the min/
258d0 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  max optimization
258e0 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 57 48 45 52  , return.** WHER
258f0 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
25900 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20   (which must be 
25910 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  zero)..**.** Thi
25920 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
25930 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  e called after a
25940 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
25950 6e 73 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  ns have been.** 
25960 6c 6f 63 61 74 65 64 20 62 75 74 20 62 65 66 6f  located but befo
25970 72 65 20 74 68 65 69 72 20 61 72 67 75 6d 65 6e  re their argumen
25980 74 73 20 68 61 76 65 20 62 65 65 6e 20 73 75 62  ts have been sub
25990 6a 65 63 74 65 64 20 74 6f 20 61 67 67 72 65 67  jected to aggreg
259a0 61 74 65 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 2e  ate.** analysis.
259b0 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69  .*/.static u8 mi
259c0 6e 4d 61 78 51 75 65 72 79 28 73 71 6c 69 74 65  nMaxQuery(sqlite
259d0 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 46 75  3 *db, Expr *pFu
259e0 6e 63 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  nc, ExprList **p
259f0 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20  pMinMax){.  int 
25a00 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
25a10 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20  ERBY_NORMAL;    
25a20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
25a30 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
25a40 2a 70 45 4c 69 73 74 20 3d 20 70 46 75 6e 63 2d  *pEList = pFunc-
25a50 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  >x.pList;    /* 
25a60 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67  Arguments to agg
25a70 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 63   function */.  c
25a80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
25a90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25aa0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
25ab0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
25ac0 6f 6e 20 70 46 75 6e 63 20 2a 2f 0a 20 20 45 78  on pFunc */.  Ex
25ad0 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
25ae0 3b 0a 20 20 75 38 20 73 6f 72 74 4f 72 64 65 72  ;.  u8 sortOrder
25af0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70  ;..  assert( *pp
25b00 4d 69 6e 4d 61 78 3d 3d 30 20 29 3b 0a 20 20 61  MinMax==0 );.  a
25b10 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e 6f 70  ssert( pFunc->op
25b20 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
25b30 4e 20 29 3b 0a 20 20 69 66 28 20 70 45 4c 69 73  N );.  if( pELis
25b40 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 2d 3e  t==0 || pEList->
25b50 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
25b60 6e 20 65 52 65 74 3b 0a 20 20 7a 46 75 6e 63 20  n eRet;.  zFunc 
25b70 3d 20 70 46 75 6e 63 2d 3e 75 2e 7a 54 6f 6b 65  = pFunc->u.zToke
25b80 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
25b90 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
25ba0 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  min")==0 ){.    
25bb0 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
25bc0 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 73 6f  ERBY_MIN;.    so
25bd0 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45  rtOrder = SQLITE
25be0 5f 53 4f 5f 41 53 43 3b 0a 20 20 7d 65 6c 73 65  _SO_ASC;.  }else
25bf0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
25c00 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78 22  Cmp(zFunc, "max"
25c10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52 65 74  )==0 ){.    eRet
25c20 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   = WHERE_ORDERBY
25c30 5f 4d 41 58 3b 0a 20 20 20 20 73 6f 72 74 4f 72  _MAX;.    sortOr
25c40 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f  der = SQLITE_SO_
25c50 44 45 53 43 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  DESC;.  }else{. 
25c60 20 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a     return eRet;.
25c70 20 20 7d 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20    }.  *ppMinMax 
25c80 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  = pOrderBy = sql
25c90 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
25ca0 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a  db, pEList, 0);.
25cb0 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
25cc0 42 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  By!=0 || db->mal
25cd0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
25ce0 66 28 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f  f( pOrderBy ) pO
25cf0 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72  rderBy->a[0].sor
25d00 74 4f 72 64 65 72 20 3d 20 73 6f 72 74 4f 72 64  tOrder = sortOrd
25d10 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65  er;.  return eRe
25d20 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
25d30 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
25d40 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
25d50 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
25d60 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75   an aggregate qu
25d70 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ery..** The seco
25d80 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nd argument is t
25d90 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67  he associated ag
25da0 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a  gregate-info obj
25db0 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ect. This .** fu
25dc0 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20  nction tests if 
25dd0 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66  the SELECT is of
25de0 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
25df0 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
25e00 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a  *) FROM <tbl>.**
25e10 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20  .** where table 
25e20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61  is a database ta
25e30 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73  ble, not a sub-s
25e40 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49  elect or view. I
25e50 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64  f the query.** d
25e60 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70  oes match this p
25e70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70  attern, then a p
25e80 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61  ointer to the Ta
25e90 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65  ble object repre
25ea0 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e  senting.** <tbl>
25eb0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
25ec0 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65  herwise, 0 is re
25ed0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
25ee0 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c  c Table *isSimpl
25ef0 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70  eCount(Select *p
25f00 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
25f10 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  nfo){.  Table *p
25f20 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78  Tab;.  Expr *pEx
25f30 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  pr;..  assert( !
25f40 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a  p->pGroupBy );..
25f50 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
25f60 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  || p->pEList->nE
25f70 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d  xpr!=1 .   || p-
25f80 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c  >pSrc->nSrc!=1 |
25f90 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  | p->pSrc->a[0].
25fa0 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20  pSelect.  ){.   
25fb0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
25fc0 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
25fd0 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45  >a[0].pTab;.  pE
25fe0 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
25ff0 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61  >a[0].pExpr;.  a
26000 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21  ssert( pTab && !
26010 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26  pTab->pSelect &&
26020 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28   pExpr );..  if(
26030 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
26040 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
26050 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
26060 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
26070 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
26080 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e  NEVER(pAggInfo->
26090 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75  nFunc==0) ) retu
260a0 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67  rn 0;.  if( (pAg
260b0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e  gInfo->aFunc[0].
260c0 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
260d0 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55  &SQLITE_FUNC_COU
260e0 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  NT)==0 ) return 
260f0 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
26100 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63  flags&EP_Distinc
26110 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  t ) return 0;.. 
26120 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
26130 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f  ./*.** If the so
26140 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70  urce-list item p
26150 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
26160 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74  ment was augment
26170 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e  ed with an.** IN
26180 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
26190 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63   then try to loc
261a0 61 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65  ate the specifie
261b0 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72  d index. If ther
261c0 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20  e.** was such a 
261d0 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e  clause and the n
261e0 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f  amed index canno
261f0 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  t be found, retu
26200 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  rn .** SQLITE_ER
26210 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e  ROR and leave an
26220 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
26230 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70  . Otherwise, pop
26240 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d  ulate .** pFrom-
26250 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75  >pIndex and retu
26260 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  rn SQLITE_OK..*/
26270 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
26280 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73  xedByLookup(Pars
26290 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
262a0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
262b0 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46  pFrom){.  if( pF
262c0 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72  rom->pTab && pFr
262d0 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64  om->fg.isIndexed
262e0 42 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  By ){.    Table 
262f0 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
26300 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Tab;.    char *z
26310 49 6e 64 65 78 65 64 42 79 20 3d 20 70 46 72 6f  IndexedBy = pFro
26320 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64 42 79  m->u1.zIndexedBy
26330 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  ;.    Index *pId
26340 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
26350 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20  pTab->pIndex; . 
26360 20 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73         pIdx && s
26370 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
26380 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65  dx->zName, zInde
26390 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20 20 20  xedBy); .       
263a0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
263b0 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  t.    );.    if(
263c0 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20   !pIdx ){.      
263d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
263e0 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
263f0 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49 6e   index: %s", zIn
26400 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20 20 20  dexedBy, 0);.   
26410 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
26420 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
26430 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26440 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
26450 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64 65 78   pFrom->pIBIndex
26460 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72   = pIdx;.  }.  r
26470 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26480 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20  .}./*.** Detect 
26490 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
264a0 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
264b0 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  use an ORDER BY 
264c0 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20  clause with .** 
264d0 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63  an alternative c
264e0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
264f0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  e..**.**    SELE
26500 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45  CT ... FROM t1 E
26510 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e  XCEPT SELECT ...
26520 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42   FROM t2 ORDER B
26530 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e  Y .. COLLATE ...
26540 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  .**.** These are
26550 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20   rewritten as a 
26560 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  subquery:.**.** 
26570 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
26580 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f   (SELECT ... FRO
26590 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45  M t1 EXCEPT SELE
265a0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a  CT ... FROM t2).
265b0 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20  **     ORDER BY 
265c0 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a  ... COLLATE ....
265d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73  **.** This trans
265e0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63  formation is nec
265f0 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20 74  essary because t
26600 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  he multiSelectOr
26610 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a  derBy() routine.
26620 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67 65  ** above that ge
26630 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
26640 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20   for a compound 
26650 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f  SELECT with an O
26660 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a  RDER BY clause.*
26670 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65 20 61  * uses a merge a
26680 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65  lgorithm that re
26690 71 75 69 72 65 73 20 74 68 65 20 73 61 6d 65 20  quires the same 
266a0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
266b0 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73  ce on the.** res
266c0 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f  ult columns as o
266d0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
266e0 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b  lause.  See tick
266f0 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77  et.** http://www
26700 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f  .sqlite.org/src/
26710 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a  info/6709574d2a.
26720 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73  **.** This trans
26730 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c  formation is onl
26740 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43  y needed for EXC
26750 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20  EPT, INTERSECT, 
26760 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68  and UNION..** Th
26770 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
26780 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20  ator works fine 
26790 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74  with multiSelect
267a0 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e 20 77  OrderBy() even w
267b0 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65  hen.** there are
267c0 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69   COLLATE terms i
267d0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a  n the ORDER BY..
267e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
267f0 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c  nvertCompoundSel
26800 65 63 74 54 6f 53 75 62 71 75 65 72 79 28 57 61  ectToSubquery(Wa
26810 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
26820 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
26830 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e   i;.  Select *pN
26840 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58  ew;.  Select *pX
26850 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
26860 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
26870 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72  st_item *a;.  Sr
26880 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a  cList *pNewSrc;.
26890 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
268a0 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a  .  Token dummy;.
268b0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
268c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
268d0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28  _Continue;.  if(
268e0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
268f0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
26900 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d  tinue;.  for(pX=
26910 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70  p; pX && (pX->op
26920 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e  ==TK_ALL || pX->
26930 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20  op==TK_SELECT); 
26940 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d  pX=pX->pPrior){}
26950 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72  .  if( pX==0 ) r
26960 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
26970 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72  ue;.  a = p->pOr
26980 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28  derBy->a;.  for(
26990 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i=p->pOrderBy->n
269a0 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Expr-1; i>=0; i-
269b0 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d  -){.    if( a[i]
269c0 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  .pExpr->flags & 
269d0 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65  EP_Collate ) bre
269e0 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c  ak;.  }.  if( i<
269f0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
26a00 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49  ontinue;..  /* I
26a10 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
26a20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e  point, that mean
26a30 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61  s the transforma
26a40 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
26a50 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d  . */..  pParse =
26a60 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
26a70 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
26a80 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  >db;.  pNew = sq
26a90 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
26aa0 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  o(db, sizeof(*pN
26ab0 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
26ac0 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  w==0 ) return WR
26ad0 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65  C_Abort;.  memse
26ae0 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a  t(&dummy, 0, siz
26af0 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70  eof(dummy));.  p
26b00 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33  NewSrc = sqlite3
26b10 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f  SrcListAppendFro
26b20 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30  mTerm(pParse,0,0
26b30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30  ,0,&dummy,pNew,0
26b40 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53  ,0);.  if( pNewS
26b50 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  rc==0 ) return W
26b60 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65  RC_Abort;.  *pNe
26b70 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72  w = *p;.  p->pSr
26b80 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70  c = pNewSrc;.  p
26b90 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
26ba0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
26bb0 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69  (pParse, 0, sqli
26bc0 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41  te3Expr(db, TK_A
26bd0 53 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a 20 20  STERISK, 0));.  
26be0 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43  p->op = TK_SELEC
26bf0 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  T;.  p->pWhere =
26c00 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f   0;.  pNew->pGro
26c10 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77  upBy = 0;.  pNew
26c20 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20  ->pHaving = 0;. 
26c30 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
26c40 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72  = 0;.  p->pPrior
26c50 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74   = 0;.  p->pNext
26c60 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69 74 68   = 0;.  p->pWith
26c70 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c   = 0;.  p->selFl
26c80 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f  ags &= ~SF_Compo
26c90 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28 20 28  und;.  assert( (
26ca0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
26cb0 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30 20 29  _Converted)==0 )
26cc0 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
26cd0 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 3b  |= SF_Converted;
26ce0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
26cf0 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20  >pPrior!=0 );.  
26d00 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e  pNew->pPrior->pN
26d10 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e  ext = pNew;.  pN
26d20 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->pLimit = 0;.
26d30 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
26d40 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
26d50 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
26d60 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
26d70 74 65 72 6d 20 70 46 72 6f 6d 20 68 61 73 20 74  term pFrom has t
26d80 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63  able-valued func
26d90 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  tion.** argument
26da0 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20  s.  If it does, 
26db0 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
26dc0 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
26dd0 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e   and return.** n
26de0 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65 20 70  on-zero, since p
26df0 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  From is not allo
26e00 77 65 64 20 74 6f 20 62 65 20 61 20 74 61 62 6c  wed to be a tabl
26e10 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74 69 6f  e-valued functio
26e20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
26e30 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f   cannotBeFunctio
26e40 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
26e50 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
26e60 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  item *pFrom){.  
26e70 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73  if( pFrom->fg.is
26e80 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20 20 73  TabFunc ){.    s
26e90 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
26ea0 50 61 72 73 65 2c 20 22 27 25 73 27 20 69 73 20  Parse, "'%s' is 
26eb0 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e 22 2c  not a function",
26ec0 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pFrom->zName);.
26ed0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
26ee0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
26ef0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26f00 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41  OMIT_CTE./*.** A
26f10 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77  rgument pWith (w
26f20 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c  hich may be NULL
26f30 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69  ) points to a li
26f40 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73  nked list of nes
26f50 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e  ted .** WITH con
26f60 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65  texts, from inne
26f70 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20  r to outermost. 
26f80 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 64 65  If the table ide
26f90 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46  ntified by .** F
26fa0 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
26fb0 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c  nt pItem is real
26fc0 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c  ly a common-tabl
26fd0 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54  e-expression (CT
26fe0 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  E) .** then retu
26ff0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
27000 74 68 65 20 43 54 45 20 64 65 66 69 6e 69 74 69  the CTE definiti
27010 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c  on for that tabl
27020 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  e. Otherwise.** 
27030 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
27040 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ** If a non-NULL
27050 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
27060 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65  ed, set *ppConte
27070 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  xt to point to t
27080 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63  he With.** objec
27090 74 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  t that the retur
270a0 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20  ned CTE belongs 
270b0 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  to..*/.static st
270c0 72 75 63 74 20 43 74 65 20 2a 73 65 61 72 63 68  ruct Cte *search
270d0 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57  With(.  With *pW
270e0 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ith,            
270f0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
27100 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57 49 54  nt innermost WIT
27110 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  H clause */.  st
27120 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
27130 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a  m *pItem,     /*
27140 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
27150 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20  ment to resolve 
27160 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f  */.  With **ppCo
27170 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 20 20  ntext           
27180 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54       /* OUT: WIT
27190 48 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20  H clause return 
271a0 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f  value belongs to
271b0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
271c0 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
271d0 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
271e0 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20  se==0 && (zName 
271f0 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21  = pItem->zName)!
27200 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a  =0 ){.    With *
27210 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69  p;.    for(p=pWi
27220 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74  th; p; p=p->pOut
27230 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  er){.      int i
27240 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
27250 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
27260 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
27270 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61  lite3StrICmp(zNa
27280 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  me, p->a[i].zNam
27290 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
272a0 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20     *ppContext = 
272b0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  p;.          ret
272c0 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  urn &p->a[i];.  
272d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
272e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
272f0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn 0;.}../* The 
27300 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d  code generator m
27310 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b  aintains a stack
27320 20 6f 66 20 61 63 74 69 76 65 20 57 49 54 48 20   of active WITH 
27330 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20  clauses.** with 
27340 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57  the inner-most W
27350 49 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67  ITH clause being
27360 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
27370 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  he stack..**.** 
27380 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73  This routine pus
27390 68 65 73 20 74 68 65 20 57 49 54 48 20 63 6c 61  hes the WITH cla
273a0 75 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  use passed as th
273b0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
273c0 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f  t.** onto the to
273d0 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20  p of the stack. 
273e0 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65  If argument bFre
273f0 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
27400 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61  this.** WITH cla
27410 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  use will never b
27420 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
27430 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73  e stack. In this
27440 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75   case it.** shou
27450 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e  ld be freed alon
27460 67 20 77 69 74 68 20 74 68 65 20 50 61 72 73 65  g with the Parse
27470 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65   object. In othe
27480 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a  r cases, when.**
27490 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57   bFree==0, the W
274a0 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  ith object will 
274b0 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77  be freed along w
274c0 69 74 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a  ith the SELECT .
274d0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  ** statement wit
274e0 68 20 77 68 69 63 68 20 69 74 20 69 73 20 61 73  h which it is as
274f0 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  sociated..*/.voi
27500 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73  d sqlite3WithPus
27510 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
27520 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38   With *pWith, u8
27530 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72   bFree){.  asser
27540 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 28  t( bFree==0 || (
27550 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30  pParse->pWith==0
27560 20 26 26 20 70 50 61 72 73 65 2d 3e 70 57 69 74   && pParse->pWit
27570 68 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b 0a 20  hToFree==0) );. 
27580 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
27590 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
275a0 2d 3e 70 57 69 74 68 21 3d 70 57 69 74 68 20 29  ->pWith!=pWith )
275b0 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75  ;.    pWith->pOu
275c0 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57  ter = pParse->pW
275d0 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ith;.    pParse-
275e0 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
275f0 20 20 20 20 69 66 28 20 62 46 72 65 65 20 29 20      if( bFree ) 
27600 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54 6f 46  pParse->pWithToF
27610 72 65 65 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d  ree = pWith;.  }
27620 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
27630 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  unction checks i
27640 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d  f argument pFrom
27650 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54 45   refers to a CTE
27660 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a   declared by .**
27670 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f   a WITH clause o
27680 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72 72  n the stack curr
27690 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64  ently maintained
276a0 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 20   by the parser. 
276b0 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65  And,.** if curre
276c0 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20  ntly processing 
276d0 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e  a CTE expression
276e0 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65 63  , if it is a rec
276f0 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65  ursive.** refere
27700 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72 65  nce to the curre
27710 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  nt CTE..**.** If
27720 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74   pFrom falls int
27730 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  o either of the 
27740 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61  two categories a
27750 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61  bove, pFrom->pTa
27760 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66  b.** and other f
27770 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61  ields are popula
27780 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
27790 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   The caller shou
277a0 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72  ld check.** (pFr
277b0 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20  om->pTab!=0) to 
277c0 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
277d0 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65  r or not a succe
277e0 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77  ssful match.** w
277f0 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  as found..**.** 
27800 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
27810 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c   match is found,
27820 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
27830 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
27840 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66  or.** occurs. If
27850 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f   an error does o
27860 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d  ccur, an error m
27870 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64  essage is stored
27880 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65   in the.** parse
27890 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72  r and some error
278a0 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e   code other than
278b0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
278c0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
278d0 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20  nt withExpand(. 
278e0 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72   Walker *pWalker
278f0 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  , .  struct SrcL
27900 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a  ist_item *pFrom.
27910 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
27920 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
27930 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  arse;.  sqlite3 
27940 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
27950 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20 2a  ;.  struct Cte *
27960 70 43 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  pCte;           
27970 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43      /* Matched C
27980 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  TE (or NULL if n
27990 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69  o match) */.  Wi
279a0 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20  th *pWith;      
279b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
279c0 20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68 61   WITH clause tha
279d0 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74  t pCte belongs t
279e0 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
279f0 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
27a00 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72  ;..  pCte = sear
27a10 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70  chWith(pParse->p
27a20 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57  With, pFrom, &pW
27a30 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65  ith);.  if( pCte
27a40 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
27a50 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Tab;.    ExprLis
27a60 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53  t *pEList;.    S
27a70 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20  elect *pSel;.   
27a80 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20   Select *pLeft; 
27a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27aa0 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45  * Left-most SELE
27ab0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
27ac0 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75      int bMayRecu
27ad0 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20 20  rsive;          
27ae0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d    /* True if com
27af0 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20  pound joined by 
27b00 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20  UNION [ALL] */. 
27b10 20 20 20 57 69 74 68 20 2a 70 53 61 76 65 64 57     With *pSavedW
27b20 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
27b30 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75   /* Initial valu
27b40 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69  e of pParse->pWi
27b50 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66  th */..    /* If
27b60 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69   pCte->zCteErr i
27b70 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68  s non-NULL at th
27b80 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74  is point, then t
27b90 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61  his is an illega
27ba0 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69  l.    ** recursi
27bb0 76 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ve reference to 
27bc0 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20  CTE pCte. Leave 
27bd0 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
27be0 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  se and return.  
27bf0 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70    ** early. If p
27c00 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69 73 20  Cte->zCteErr is 
27c10 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
27c20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69  is not a recursi
27c30 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20  ve reference..  
27c40 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
27c50 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a  e, proceed.  */.
27c60 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 43      if( pCte->zC
27c70 74 65 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73  teErr ){.      s
27c80 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
27c90 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 43 74  Parse, pCte->zCt
27ca0 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  eErr, pCte->zNam
27cb0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
27cc0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
27cd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 61 6e     }.    if( can
27ce0 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28 70 50  notBeFunction(pP
27cf0 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72  arse, pFrom) ) r
27d00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
27d10 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  OR;..    assert(
27d20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
27d30 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  );.    pFrom->pT
27d40 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
27d50 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
27d60 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
27d70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ));.    if( pTab
27d80 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
27d90 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62  _Abort;.    pTab
27da0 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20  ->nTabRef = 1;. 
27db0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
27dc0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
27dd0 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  (db, pCte->zName
27de0 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  );.    pTab->iPK
27df0 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61  ey = -1;.    pTa
27e00 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20  b->nRowLogEst = 
27e10 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30  200; assert( 200
27e20 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
27e30 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 20 20  1048576) );.    
27e40 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
27e50 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 20 7c  = TF_Ephemeral |
27e60 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f 77   TF_NoVisibleRow
27e70 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70  id;.    pFrom->p
27e80 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
27e90 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 43  SelectDup(db, pC
27ea0 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  te->pSelect, 0);
27eb0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
27ec0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
27ed0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
27ee0 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
27ef0 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
27f00 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63   );..    /* Chec
27f10 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72  k if this is a r
27f20 65 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f  ecursive CTE. */
27f30 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f  .    pSel = pFro
27f40 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
27f50 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d 20  bMayRecursive = 
27f60 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41  ( pSel->op==TK_A
27f70 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d  LL || pSel->op==
27f80 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
27f90 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76  if( bMayRecursiv
27fa0 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  e ){.      int i
27fb0 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74 20  ;.      SrcList 
27fc0 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSrc = pFrom->p
27fd0 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
27fe0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
27ff0 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
28000 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
28010 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
28020 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
28030 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
28040 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d  Item->zDatabase=
28050 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
28060 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20  pItem->zName!=0 
28070 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d  .         && 0==
28080 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
28090 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74  Item->zName, pCt
280a0 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20  e->zName).      
280b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
280c0 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70   pItem->pTab = p
280d0 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
280e0 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72  Item->fg.isRecur
280f0 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  sive = 1;.      
28100 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65      pTab->nTabRe
28110 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  f++;.          p
28120 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  Sel->selFlags |=
28130 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20   SF_Recursive;. 
28140 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28150 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
28160 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76  nly one recursiv
28170 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 70  e reference is p
28180 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20  ermitted. */ .  
28190 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 54 61 62    if( pTab->nTab
281a0 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73  Ref>2 ){.      s
281b0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a  qlite3ErrorMsg(.
281c0 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
281d0 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65  , "multiple refe
281e0 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73  rences to recurs
281f0 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20  ive table: %s", 
28200 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pCte->zName.    
28210 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72    );.      retur
28220 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
28230 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
28240 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 3d  ( pTab->nTabRef=
28250 3d 31 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  =1 || .         
28260 20 20 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c     ((pSel->selFl
28270 61 67 73 26 53 46 5f 52 65 63 75 72 73 69 76 65  ags&SF_Recursive
28280 29 20 26 26 20 70 54 61 62 2d 3e 6e 54 61 62 52  ) && pTab->nTabR
28290 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20 70  ef==2 ));..    p
282a0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
282b0 63 69 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e  circular referen
282c0 63 65 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61  ce: %s";.    pSa
282d0 76 65 64 57 69 74 68 20 3d 20 70 50 61 72 73 65  vedWith = pParse
282e0 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61  ->pWith;.    pPa
282f0 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
28300 74 68 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79  th;.    if( bMay
28310 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
28320 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f     Select *pPrio
28330 72 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  r = pSel->pPrior
28340 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
28350 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 3d 3d 30  pPrior->pWith==0
28360 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72   );.      pPrior
28370 2d 3e 70 57 69 74 68 20 3d 20 70 53 65 6c 2d 3e  ->pWith = pSel->
28380 70 57 69 74 68 3b 0a 20 20 20 20 20 20 73 71 6c  pWith;.      sql
28390 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
283a0 57 61 6c 6b 65 72 2c 20 70 50 72 69 6f 72 29 3b  Walker, pPrior);
283b0 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70  .      pPrior->p
283c0 57 69 74 68 20 3d 20 30 3b 0a 20 20 20 20 7d 65  With = 0;.    }e
283d0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
283e0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
283f0 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20  lker, pSel);.   
28400 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70   }.    pParse->p
28410 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 0a 20  With = pWith;.. 
28420 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65     for(pLeft=pSe
28430 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72  l; pLeft->pPrior
28440 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70  ; pLeft=pLeft->p
28450 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69  Prior);.    pELi
28460 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69  st = pLeft->pELi
28470 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65  st;.    if( pCte
28480 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20  ->pCols ){.     
28490 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20 70   if( pEList && p
284a0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43  EList->nExpr!=pC
284b0 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72  te->pCols->nExpr
284c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
284d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
284e0 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
284f0 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20  s %d values for 
28500 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20  %d columns",.   
28510 20 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a           pCte->z
28520 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Name, pEList->nE
28530 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73  xpr, pCte->pCols
28540 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20  ->nExpr.        
28550 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
28560 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65  e->pWith = pSave
28570 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72  dWith;.        r
28580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
28590 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
285a0 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d    pEList = pCte-
285b0 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20  >pCols;.    }.. 
285c0 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
285d0 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
285e0 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70  arse, pEList, &p
285f0 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62  Tab->nCol, &pTab
28600 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28  ->aCol);.    if(
28610 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29   bMayRecursive )
28620 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c  {.      if( pSel
28630 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
28640 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
28650 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45       pCte->zCteE
28660 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72  rr = "multiple r
28670 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
28680 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20  ces: %s";.      
28690 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
286a0 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22  Cte->zCteErr = "
286b0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
286c0 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75 65 72  nce in a subquer
286d0 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a  y: %s";.      }.
286e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
286f0 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
28700 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pSel);.    }.  
28710 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20    pCte->zCteErr 
28720 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  = 0;.    pParse-
28730 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57  >pWith = pSavedW
28740 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ith;.  }..  retu
28750 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
28760 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
28770 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
28780 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c  /*.** If the SEL
28790 45 43 54 20 70 61 73 73 65 64 20 61 73 20 74 68  ECT passed as th
287a0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
287b0 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61  t has an associa
287c0 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61  ted WITH .** cla
287d0 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d  use, pop it from
287e0 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65   the stack store
287f0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
28800 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a   Parse object..*
28810 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
28820 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68  on is used as th
28830 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  e xSelectCallbac
28840 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79  k2() callback by
28850 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
28860 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77  tExpand() when w
28870 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20  alking a SELECT 
28880 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  tree to resolve 
28890 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61  table.** names a
288a0 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c  nd other FROM cl
288b0 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a  ause elements. .
288c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
288d0 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c  electPopWith(Wal
288e0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
288f0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
28900 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
28910 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  ker->pParse;.  i
28920 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f  f( OK_IF_ALWAYS_
28930 54 52 55 45 28 70 50 61 72 73 65 2d 3e 70 57 69  TRUE(pParse->pWi
28940 74 68 29 20 26 26 20 70 2d 3e 70 50 72 69 6f 72  th) && p->pPrior
28950 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20  ==0 ){.    With 
28960 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69 67  *pWith = findRig
28970 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68  htmost(p)->pWith
28980 3b 0a 20 20 20 20 69 66 28 20 70 57 69 74 68 21  ;.    if( pWith!
28990 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
289a0 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57 69 74  rt( pParse->pWit
289b0 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20 20 20  h==pWith );.    
289c0 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
289d0 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b  = pWith->pOuter;
289e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
289f0 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63  se.#define selec
28a00 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69  tPopWith 0.#endi
28a10 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  f..static int se
28a20 6c 65 63 74 45 78 70 61 6e 64 53 75 62 71 75 65  lectExpandSubque
28a30 72 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ry(Parse *pParse
28a40 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
28a50 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
28a60 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20   Select *pSel = 
28a70 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
28a80 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 0a    Table *pTab;..
28a90 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
28aa0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
28ab0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
28ac0 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 54 61  e->db, sizeof(Ta
28ad0 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61  ble));.  if( pTa
28ae0 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
28af0 43 5f 41 62 6f 72 74 3b 0a 20 20 70 54 61 62 2d  C_Abort;.  pTab-
28b00 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 20 20  >nTabRef = 1;.  
28b10 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61  if( pFrom->zAlia
28b20 73 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 7a  s ){.    pTab->z
28b30 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
28b40 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  StrDup(pParse->d
28b50 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73  b, pFrom->zAlias
28b60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
28b70 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pTab->zName = sq
28b80 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
28b90 72 73 65 2d 3e 64 62 2c 20 22 73 75 62 71 75 65  rse->db, "subque
28ba0 72 79 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29 70  ry_%p", (void*)p
28bb0 54 61 62 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  Tab);.  }.  whil
28bc0 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20  e( pSel->pPrior 
28bd0 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e  ){ pSel = pSel->
28be0 70 50 72 69 6f 72 3b 20 7d 0a 20 20 73 71 6c 69  pPrior; }.  sqli
28bf0 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
28c00 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
28c10 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61  Sel->pEList,&pTa
28c20 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61  b->nCol,&pTab->a
28c30 43 6f 6c 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50  Col);.  pTab->iP
28c40 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62  Key = -1;.  pTab
28c50 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32  ->nRowLogEst = 2
28c60 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d  00; assert( 200=
28c70 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
28c80 30 34 38 35 37 36 29 20 29 3b 0a 20 20 70 54 61  048576) );.  pTa
28c90 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
28ca0 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 0a 20 20  F_Ephemeral;..  
28cb0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
28cc0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nue;.}../*.** Th
28cd0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
28ce0 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20  Walker callback 
28cf0 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20  for "expanding" 
28d00 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
28d10 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e  nt..** "Expandin
28d20 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74  g" means to do t
28d30 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
28d40 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65  .**    (1)  Make
28d50 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f   sure VDBE curso
28d60 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
28d70 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
28d80 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  every.**        
28d90 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
28da0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
28db0 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20  **    (2)  Fill 
28dc0 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d  in the pTabList-
28dd0 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73  >a[].pTab fields
28de0 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
28df0 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20  that .**        
28e00 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c   defines FROM cl
28e10 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77  ause.  When view
28e20 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  s appear in the 
28e30 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20  FROM clause,.** 
28e40 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61          fill pTa
28e50 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65  bList->a[].pSele
28e60 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  ct with a copy o
28e70 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
28e80 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
28e90 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74    that implement
28ea0 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63  s the view.  A c
28eb0 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
28ec0 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54  he view's SELECT
28ed0 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74  .**         stat
28ee0 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65  ement so that we
28ef0 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69   can freely modi
28f00 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61  fy or delete tha
28f10 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  t statement.**  
28f20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77         without w
28f30 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65  orrying about me
28f40 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 65 72  ssing up the per
28f50 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e  sistent represen
28f60 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  tation.**       
28f70 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a    of the view..*
28f80 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64  *.**    (3)  Add
28f90 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48   terms to the WH
28fa0 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63  ERE clause to ac
28fb0 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20 4e 41  commodate the NA
28fc0 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a  TURAL keyword.**
28fd0 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e           on join
28fe0 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64  s and the ON and
28ff0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
29000 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   joins..**.**   
29010 20 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c   (4)  Scan the l
29020 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ist of columns i
29030 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
29040 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e   (pEList) lookin
29050 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72  g.**         for
29060 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
29070 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f  e "*" operator o
29080 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70  r the TABLE.* op
29090 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20  erator..**      
290a0 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70     If found, exp
290b0 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20  and each "*" to 
290c0 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  be every column 
290d0 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a  in every table.*
290e0 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41  *         and TA
290f0 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72  BLE.* to be ever
29100 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c  y column in TABL
29110 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  E..**.*/.static 
29120 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64  int selectExpand
29130 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  er(Walker *pWalk
29140 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
29150 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
29160 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
29170 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  e;.  int i, j, k
29180 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
29190 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73  bList;.  ExprLis
291a0 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72  t *pEList;.  str
291b0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
291c0 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74   *pFrom;.  sqlit
291d0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
291e0 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c  >db;.  Expr *pE,
291f0 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72   *pRight, *pExpr
29200 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73  ;.  u16 selFlags
29210 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a   = p->selFlags;.
29220 20 20 75 33 32 20 65 6c 69 73 74 46 6c 61 67 73    u32 elistFlags
29230 20 3d 20 30 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46   = 0;..  p->selF
29240 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e  lags |= SF_Expan
29250 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ded;.  if( db->m
29260 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a  allocFailed  ){.
29270 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
29280 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  bort;.  }.  asse
29290 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29  rt( p->pSrc!=0 )
292a0 3b 0a 20 20 69 66 28 20 28 73 65 6c 46 6c 61 67  ;.  if( (selFlag
292b0 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29  s & SF_Expanded)
292c0 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
292d0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
292e0 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d  .  pTabList = p-
292f0 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20  >pSrc;.  pEList 
29300 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 73  = p->pEList;.  s
29310 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 70  qlite3WithPush(p
29320 50 61 72 73 65 2c 20 70 2d 3e 70 57 69 74 68 2c  Parse, p->pWith,
29330 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20   0);..  /* Make 
29340 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  sure cursor numb
29350 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
29360 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e  signed to all en
29370 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68  tries in.  ** th
29380 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
29390 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
293a0 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  ement..  */.  sq
293b0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
293c0 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
293d0 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20  , pTabList);..  
293e0 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79  /* Look up every
293f0 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20   table named in 
29400 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
29410 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20  of the select.  
29420 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79  If.  ** an entry
29430 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
29440 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72  use is a subquer
29450 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74  y instead of a t
29460 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20  able or view,.  
29470 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  ** then create a
29480 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
29490 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65   structure to de
294a0 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75  scribe the subqu
294b0 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
294c0 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
294d0 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
294e0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
294f0 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62  From++){.    Tab
29500 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73  le *pTab;.    as
29510 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66 67 2e  sert( pFrom->fg.
29520 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c  isRecursive==0 |
29530 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30  | pFrom->pTab!=0
29540 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f   );.    if( pFro
29550 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76  m->fg.isRecursiv
29560 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
29570 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
29580 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69 66 6e  >pTab==0 );.#ifn
29590 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
295a0 43 54 45 0a 20 20 20 20 69 66 28 20 77 69 74 68  CTE.    if( with
295b0 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20  Expand(pWalker, 
295c0 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72 6e 20  pFrom) ) return 
295d0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69  WRC_Abort;.    i
295e0 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29  f( pFrom->pTab )
295f0 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a   {} else.#endif.
29600 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a      if( pFrom->z
29610 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Name==0 ){.#ifnd
29620 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
29630 55 42 51 55 45 52 59 0a 20 20 20 20 20 20 53 65  UBQUERY.      Se
29640 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72  lect *pSel = pFr
29650 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  om->pSelect;.   
29660 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65 72     /* A sub-quer
29670 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  y in the FROM cl
29680 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
29690 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
296a0 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20  ( pSel!=0 );.   
296b0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
296c0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
296d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 61     if( sqlite3Wa
296e0 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
296f0 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75 72 6e  , pSel) ) return
29700 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
29710 20 20 69 66 28 20 73 65 6c 65 63 74 45 78 70 61    if( selectExpa
29720 6e 64 53 75 62 71 75 65 72 79 28 70 50 61 72 73  ndSubquery(pPars
29730 65 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75  e, pFrom) ) retu
29740 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 23 65  rn WRC_Abort;.#e
29750 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
29760 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69        /* An ordi
29770 6e 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69  nary table or vi
29780 65 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46  ew name in the F
29790 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
297a0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
297b0 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  m->pTab==0 );.  
297c0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
297d0 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
297e0 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28  LocateTableItem(
297f0 70 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d  pParse, 0, pFrom
29800 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  );.      if( pTa
29810 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  b==0 ) return WR
29820 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69  C_Abort;.      i
29830 66 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66  f( pTab->nTabRef
29840 3e 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20  >=0xffff ){.    
29850 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
29860 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
29870 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65 73   many references
29880 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78 20   to \"%s\": max 
29890 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20 20  65535",.        
298a0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b     pTab->zName);
298b0 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
298c0 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
298d0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
298e0 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
298f0 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66 2b    pTab->nTabRef+
29900 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73  +;.      if( !Is
29910 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26  Virtual(pTab) &&
29920 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f   cannotBeFunctio
29930 6e 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29  n(pParse, pFrom)
29940 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
29950 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
29960 20 20 20 20 7d 0a 23 69 66 20 21 64 65 66 69 6e      }.#if !defin
29970 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
29980 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
29990 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49   (SQLITE_OMIT_VI
299a0 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20  RTUALTABLE).    
299b0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
299c0 70 54 61 62 29 20 7c 7c 20 70 54 61 62 2d 3e 70  pTab) || pTab->p
299d0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
299e0 20 20 69 31 36 20 6e 43 6f 6c 3b 0a 20 20 20 20    i16 nCol;.    
299f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
29a00 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
29a10 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
29a20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
29a30 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
29a40 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  rt( pFrom->pSele
29a50 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct==0 );.       
29a60 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
29a70 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
29a80 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65  up(db, pTab->pSe
29a90 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lect, 0);.      
29aa0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53    sqlite3SelectS
29ab0 65 74 4e 61 6d 65 28 70 46 72 6f 6d 2d 3e 70 53  etName(pFrom->pS
29ac0 65 6c 65 63 74 2c 20 70 54 61 62 2d 3e 7a 4e 61  elect, pTab->zNa
29ad0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  me);.        nCo
29ae0 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a  l = pTab->nCol;.
29af0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43          pTab->nC
29b00 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ol = -1;.       
29b10 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
29b20 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f  ct(pWalker, pFro
29b30 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
29b40 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20       pTab->nCol 
29b50 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a  = nCol;.      }.
29b60 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
29b70 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
29b80 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20 74  index named by t
29b90 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  he INDEXED BY cl
29ba0 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a 2f  ause, if any. */
29bb0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
29bc0 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28  IndexedByLookup(
29bd0 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29  pParse, pFrom) )
29be0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
29bf0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
29c00 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73    }..  /* Proces
29c10 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  s NATURAL keywor
29c20 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20 55  ds, and ON and U
29c30 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66 20  SING clauses of 
29c40 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  joins..  */.  if
29c50 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
29c60 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f 63  ed || sqliteProc
29c70 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c 20  essJoin(pParse, 
29c80 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
29c90 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
29ca0 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20  .  /* For every 
29cb0 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73 20  "*" that occurs 
29cc0 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69  in the column li
29cd0 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20 6e  st, insert the n
29ce0 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c  ames of.  ** all
29cf0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20   columns in all 
29d00 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f 72  tables.  And for
29d10 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20 69   every TABLE.* i
29d20 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73 0a  nsert the names.
29d30 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c 75    ** of all colu
29d40 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20 54  mns in TABLE.  T
29d50 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72 74  he parser insert
29d60 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  ed a special exp
29d70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69 74  ression.  ** wit
29d80 68 20 74 68 65 20 54 4b 5f 41 53 54 45 52 49 53  h the TK_ASTERIS
29d90 4b 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 65  K operator for e
29da0 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74 20  ach "*" that it 
29db0 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c  found in the col
29dc0 75 6d 6e 0a 20 20 2a 2a 20 6c 69 73 74 2e 20 20  umn.  ** list.  
29dd0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
29de0 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c  de just has to l
29df0 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 53 54  ocate the TK_AST
29e00 45 52 49 53 4b 0a 20 20 2a 2a 20 65 78 70 72 65  ERISK.  ** expre
29e10 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61 6e  ssions and expan
29e20 64 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74 68  d each one to th
29e30 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f  e list of all co
29e40 6c 75 6d 6e 73 20 69 6e 0a 20 20 2a 2a 20 61 6c  lumns in.  ** al
29e50 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20  l tables..  **. 
29e60 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c 6f   ** The first lo
29e70 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20 74  op just checks t
29e80 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
29e90 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72 61  re any "*" opera
29ea0 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20 6e  tors.  ** that n
29eb0 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a 20  eed expanding.. 
29ec0 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b   */.  for(k=0; k
29ed0 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
29ee0 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20 70  k++){.    pE = p
29ef0 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70  EList->a[k].pExp
29f00 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f  r;.    if( pE->o
29f10 70 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29  p==TK_ASTERISK )
29f20 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
29f30 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
29f40 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74  OT || pE->pRight
29f50 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
29f60 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f  t( pE->op!=TK_DO
29f70 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21  T || (pE->pLeft!
29f80 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d  =0 && pE->pLeft-
29f90 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20  >op==TK_ID) );. 
29fa0 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
29fb0 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52 69  K_DOT && pE->pRi
29fc0 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 54 45  ght->op==TK_ASTE
29fd0 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20  RISK ) break;.  
29fe0 20 20 65 6c 69 73 74 46 6c 61 67 73 20 7c 3d 20    elistFlags |= 
29ff0 70 45 2d 3e 66 6c 61 67 73 3b 0a 20 20 7d 0a 20  pE->flags;.  }. 
2a000 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e   if( k<pEList->n
2a010 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  Expr ){.    /*. 
2a020 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20     ** If we get 
2a030 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68  here it means th
2a040 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e  e result set con
2a050 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
2a060 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65  e "*".    ** ope
2a070 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  rators that need
2a080 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
2a090 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65    Loop through e
2a0a0 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ach expression. 
2a0b0 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73     ** in the res
2a0c0 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61  ult set and expa
2a0d0 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f  nd them one by o
2a0e0 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ne..    */.    s
2a0f0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
2a100 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d  tem *a = pEList-
2a110 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  >a;.    ExprList
2a120 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
2a130 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72  int flags = pPar
2a140 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  se->db->flags;. 
2a150 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73     int longNames
2a160 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
2a170 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
2a180 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
2a190 20 20 20 20 20 20 20 20 20 20 26 26 20 28 66 6c            && (fl
2a1a0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
2a1b0 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a  rtColNames)==0;.
2a1c0 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  .    for(k=0; k<
2a1d0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
2a1e0 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20  ++){.      pE = 
2a1f0 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
2a200 20 20 65 6c 69 73 74 46 6c 61 67 73 20 7c 3d 20    elistFlags |= 
2a210 70 45 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20  pE->flags;.     
2a220 20 70 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52   pRight = pE->pR
2a230 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65  ight;.      asse
2a240 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
2a250 4f 54 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20  OT || pRight!=0 
2a260 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
2a270 3e 6f 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b  >op!=TK_ASTERISK
2a280 0a 20 20 20 20 20 20 20 26 26 20 28 70 45 2d 3e  .       && (pE->
2a290 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52  op!=TK_DOT || pR
2a2a0 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 53 54  ight->op!=TK_AST
2a2b0 45 52 49 53 4b 29 0a 20 20 20 20 20 20 29 7b 0a  ERISK).      ){.
2a2c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
2a2d0 70 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65  particular expre
2a2e0 73 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e  ssion does not n
2a2f0 65 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64  eed to be expand
2a300 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
2a310 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71         pNew = sq
2a320 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
2a330 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77  end(pParse, pNew
2a340 2c 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20  , a[k].pExpr);. 
2a350 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
2a360 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  ){.          pNe
2a370 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
2a380 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d  -1].zName = a[k]
2a390 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
2a3a0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
2a3b0 6e 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d  nExpr-1].zSpan =
2a3c0 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20   a[k].zSpan;.   
2a3d0 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d         a[k].zNam
2a3e0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
2a3f0 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b   a[k].zSpan = 0;
2a400 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a410 20 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20     a[k].pExpr = 
2a420 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
2a430 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
2a440 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
2a450 22 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e  "*" or a "TABLE.
2a460 2a 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  *" and needs to 
2a470 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78  be.        ** ex
2a480 70 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20  panded. */.     
2a490 20 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e     int tableSeen
2a4a0 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65   = 0;      /* Se
2a4b0 74 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c  t to 1 when TABL
2a4c0 45 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20  E matches */.   
2a4d0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d       char *zTNam
2a4e0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
2a4f0 74 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20  text of name of 
2a500 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20  TABLE */.       
2a510 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f   if( pE->op==TK_
2a520 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  DOT ){.         
2a530 20 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65   assert( pE->pLe
2a540 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ft!=0 );.       
2a550 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2a560 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e  HasProperty(pE->
2a570 70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c  pLeft, EP_IntVal
2a580 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ue) );.         
2a590 20 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c   zTName = pE->pL
2a5a0 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  eft->u.zToken;. 
2a5b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a5c0 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
2a5d0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
2a5e0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
2a5f0 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
2a600 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
2a610 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
2a620 62 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c  b;.          Sel
2a630 65 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f  ect *pSub = pFro
2a640 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
2a650 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
2a660 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41  Name = pFrom->zA
2a670 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
2a680 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68  const char *zSch
2a690 65 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  emaName = 0;.   
2a6a0 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
2a6b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
2a6c0 61 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  abName==0 ){.   
2a6d0 20 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d           zTabNam
2a6e0 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
2a6f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2a700 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d         if( db->m
2a710 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72  allocFailed ) br
2a720 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eak;.          i
2a730 66 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70  f( pSub==0 || (p
2a740 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
2a750 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d  SF_NestedFrom)==
2a760 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2a770 20 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20   pSub = 0;.     
2a780 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d         if( zTNam
2a790 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
2a7a0 43 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62  Cmp(zTName, zTab
2a7b0 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
2a7c0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2a7d0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
2a7e0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 44  }.            iD
2a7f0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
2a800 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
2a810 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
2a820 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61           zSchema
2a830 4e 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20  Name = iDb>=0 ? 
2a840 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62  db->aDb[iDb].zDb
2a850 53 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20 20  SName : "*";.   
2a860 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a870 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54     for(j=0; j<pT
2a880 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a  ab->nCol; j++){.
2a890 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
2a8a0 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e   *zName = pTab->
2a8b0 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  aCol[j].zName;. 
2a8c0 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
2a8d0 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54  *zColname;  /* T
2a8e0 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75  he computed colu
2a8f0 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  mn name */.     
2a900 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f         char *zTo
2a910 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  Free;   /* Mallo
2a920 63 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20  ced string that 
2a930 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65  needs to be free
2a940 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  d */.           
2a950 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b   Token sColname;
2a960 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f    /* Computed co
2a970 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74  lumn name as a t
2a980 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20  oken */..       
2a990 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61       assert( zNa
2a9a0 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me );.          
2a9b0 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20    if( zTName && 
2a9c0 70 53 75 62 0a 20 20 20 20 20 20 20 20 20 20 20  pSub.           
2a9d0 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74 63    && sqlite3Matc
2a9e0 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d 3e  hSpanName(pSub->
2a9f0 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70  pEList->a[j].zSp
2aa00 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20 30  an, 0, zTName, 0
2aa10 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
2aa20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2aa30 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2aa40 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2aa50 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 63         /* If a c
2aa60 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20  olumn is marked 
2aa70 61 73 20 27 68 69 64 64 65 6e 27 2c 20 6f 6d 69  as 'hidden', omi
2aa80 74 20 69 74 20 66 72 6f 6d 20 74 68 65 20 65 78  t it from the ex
2aa90 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20  panded.         
2aaa0 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74     ** result-set
2aab0 20 6c 69 73 74 20 75 6e 6c 65 73 73 20 74 68 65   list unless the
2aac0 20 53 45 4c 45 43 54 20 68 61 73 20 74 68 65 20   SELECT has the 
2aad0 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e  SF_IncludeHidden
2aae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2aaf0 62 69 74 20 73 65 74 2e 0a 20 20 20 20 20 20 20  bit set..       
2ab00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2ab10 20 20 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46      if( (p->selF
2ab20 6c 61 67 73 20 26 20 53 46 5f 49 6e 63 6c 75 64  lags & SF_Includ
2ab30 65 48 69 64 64 65 6e 29 3d 3d 30 0a 20 20 20 20  eHidden)==0.    
2ab40 20 20 20 20 20 20 20 20 20 26 26 20 49 73 48 69           && IsHi
2ab50 64 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62  ddenColumn(&pTab
2ab60 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 0a 20 20 20 20  ->aCol[j]) .    
2ab70 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2ab80 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2ab90 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
2aba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62  .            tab
2abb0 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20  leSeen = 1;..   
2abc0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
2abd0 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b   && zTName==0 ){
2abe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2abf0 66 28 20 28 70 46 72 6f 6d 2d 3e 66 67 2e 6a 6f  f( (pFrom->fg.jo
2ac00 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
2ac10 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20  RAL)!=0.        
2ac20 20 20 20 20 20 20 20 20 26 26 20 74 61 62 6c 65          && table
2ac30 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
2ac40 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d  TabList, i, zNam
2ac50 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20  e, 0, 0).       
2ac60 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
2ac70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
2ac80 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20  a NATURAL join, 
2ac90 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f  omit the join co
2aca0 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a  lumns from the .
2acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acc0 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  ** table to the 
2acd0 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69  right of the joi
2ace0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
2acf0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2ad00 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2ad10 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2ad20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
2ad30 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e  dex(pFrom->pUsin
2ad40 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
2ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad60 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74  /* In a join wit
2ad70 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  h a USING clause
2ad80 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69  , omit columns i
2ad90 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
2ada0 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
2adb0 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
2adc0 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
2add0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
2ade0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2ae00 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2ae10 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
2ae20 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
2ae30 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29  b, TK_ID, zName)
2ae40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43  ;.            zC
2ae50 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  olname = zName;.
2ae60 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46              zToF
2ae70 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ree = 0;.       
2ae80 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
2ae90 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e  es || pTabList->
2aea0 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSrc>1 ){.      
2aeb0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
2aec0 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eft;.           
2aed0 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
2aee0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
2aef0 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20  , zTabName);.   
2af00 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2af10 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2af20 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
2af30 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
2af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2af50 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b  ( zSchemaName ){
2af60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2af70 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   pLeft = sqlite3
2af80 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
2af90 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20  zSchemaName);.  
2afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
2afb0 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
2afc0 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f  pr(pParse, TK_DO
2afd0 54 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 29  T, pLeft, pExpr)
2afe0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2aff0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
2b000 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b  if( longNames ){
2b010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b020 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c 69   zColname = sqli
2b030 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
2b040 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d 65  %s.%s", zTabName
2b050 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
2b060 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65            zToFre
2b070 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20  e = zColname;.  
2b080 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2b090 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2b0a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2b0b0 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a 20  Expr = pRight;. 
2b0c0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2b0d0 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
2b0e0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
2b0f0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4e  ppend(pParse, pN
2b100 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  ew, pExpr);.    
2b110 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
2b120 6f 6b 65 6e 49 6e 69 74 28 26 73 43 6f 6c 6e 61  okenInit(&sColna
2b130 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20  me, zColname);. 
2b140 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2b150 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
2b160 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  e(pParse, pNew, 
2b170 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20  &sColname, 0);. 
2b180 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2b190 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  New && (p->selFl
2b1a0 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46  ags & SF_NestedF
2b1b0 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rom)!=0 ){.     
2b1c0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
2b1d0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
2b1e0 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65  X = &pNew->a[pNe
2b1f0 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  w->nExpr-1];.   
2b200 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2b210 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sub ){.         
2b220 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e         pX->zSpan
2b230 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
2b240 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c  up(db, pSub->pEL
2b250 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29  ist->a[j].zSpan)
2b260 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2b270 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
2b280 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  zSpan==0 );.    
2b290 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2b2a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b2b0 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c   pX->zSpan = sql
2b2c0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
2b2d0 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20  "%s.%s.%s",.    
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b300 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61         zSchemaNa
2b310 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43  me, zTabName, zC
2b320 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  olname);.       
2b330 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2b340 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20  e( pX->zSpan==0 
2b350 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2b360 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
2b370 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20   pX->bSpanIsTab 
2b380 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
2b390 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
2b3a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2b3b0 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20   zToFree);.     
2b3c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2b3d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61  .        if( !ta
2b3e0 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20  bleSeen ){.     
2b3f0 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
2b400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2b410 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2b420 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
2b430 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61  table: %s", zTNa
2b440 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  me);.          }
2b450 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2b460 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2b470 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61  g(pParse, "no ta
2b480 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29  bles specified")
2b490 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2b4a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2b4b0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2b4c0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
2b4d0 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  db, pEList);.   
2b4e0 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
2b4f0 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  w;.  }.  if( p->
2b500 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66  pEList ){.    if
2b510 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ( p->pEList->nEx
2b520 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  pr>db->aLimit[SQ
2b530 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
2b540 4e 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  N] ){.      sqli
2b550 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2b560 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f  se, "too many co
2b570 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20  lumns in result 
2b580 73 65 74 22 29 3b 0a 20 20 20 20 20 20 72 65 74  set");.      ret
2b590 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
2b5a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 65 6c     }.    if( (el
2b5b0 69 73 74 46 6c 61 67 73 20 26 20 28 45 50 5f 48  istFlags & (EP_H
2b5c0 61 73 46 75 6e 63 7c 45 50 5f 53 75 62 71 75 65  asFunc|EP_Subque
2b5d0 72 79 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ry))!=0 ){.     
2b5e0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
2b5f0 53 46 5f 43 6f 6d 70 6c 65 78 52 65 73 75 6c 74  SF_ComplexResult
2b600 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2b610 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2b620 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f  e;.}../*.** No-o
2b630 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68  p routine for th
2b640 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c  e parse-tree wal
2b650 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ker..**.** When 
2b660 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
2b670 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72  the Walker.xExpr
2b680 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78  Callback then ex
2b690 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a  pression trees.*
2b6a0 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74  * are walked wit
2b6b0 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73  hout any actions
2b6c0 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20   being taken at 
2b6d0 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73  each node.  Pres
2b6e0 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20  umably,.** when 
2b6f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
2b700 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e  used for Walker.
2b710 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68  xExprCallback th
2b720 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53  en .** Walker.xS
2b730 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73  electCallback is
2b740 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74   set to do somet
2b750 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20  hing useful for 
2b760 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65  every .** subque
2b770 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  ry in the parser
2b780 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   tree..*/.int sq
2b790 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f  lite3ExprWalkNoo
2b7a0 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65  p(Walker *NotUse
2b7b0 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64  d, Expr *NotUsed
2b7c0 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
2b7d0 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
2b7e0 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
2b7f0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2b800 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f  e;.}../*.** No-o
2b810 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68  p routine for th
2b820 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c  e parse-tree wal
2b830 6b 65 72 20 66 6f 72 20 53 45 4c 45 43 54 20 73  ker for SELECT s
2b840 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 20 73 75  tatements..** su
2b850 62 71 75 65 72 79 20 69 6e 20 74 68 65 20 70 61  bquery in the pa
2b860 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 69 6e  rser tree..*/.in
2b870 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57  t sqlite3SelectW
2b880 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20 2a  alkNoop(Walker *
2b890 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65 63 74 20  NotUsed, Select 
2b8a0 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e  *NotUsed2){.  UN
2b8b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
2b8c0 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
2b8d0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43  2);.  return WRC
2b8e0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69  _Continue;.}..#i
2b8f0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
2b900 2a 0a 2a 2a 20 41 6c 77 61 79 73 20 61 73 73 65  *.** Always asse
2b910 72 74 2e 20 20 54 68 69 73 20 78 53 65 6c 65 63  rt.  This xSelec
2b920 74 43 61 6c 6c 62 61 63 6b 32 20 69 6d 70 6c 65  tCallback2 imple
2b930 6d 65 6e 74 61 74 69 6f 6e 20 70 72 6f 76 65 73  mentation proves
2b940 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 78 53 65   that the.** xSe
2b950 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 69 73  lectCallback2 is
2b960 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65 64 2e 0a   never invoked..
2b970 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
2b980 65 6c 65 63 74 57 61 6c 6b 41 73 73 65 72 74 32  electWalkAssert2
2b990 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64  (Walker *NotUsed
2b9a0 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65  , Select *NotUse
2b9b0 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
2b9c0 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
2b9d0 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 61  , NotUsed2);.  a
2b9e0 73 73 65 72 74 28 20 30 20 29 3b 0a 7d 0a 23 65  ssert( 0 );.}.#e
2b9f0 6e 64 69 66 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ndif./*.** This 
2ba00 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73  routine "expands
2ba10 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
2ba20 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20  ment and all of 
2ba30 69 74 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a  its subqueries..
2ba40 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61  ** For additiona
2ba50 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  l information on
2ba60 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74   what it means t
2ba70 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c  o "expand" a SEL
2ba80 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
2ba90 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  , see the commen
2baa0 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45  t on the selectE
2bab0 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c  xpand worker cal
2bac0 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a  lback above..**.
2bad0 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53  ** Expanding a S
2bae0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2baf0 69 73 20 74 68 65 20 66 69 72 73 74 20 73 74 65  is the first ste
2bb00 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  p in processing 
2bb10 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
2bb20 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45  ement.  The SELE
2bb30 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73  CT statement mus
2bb40 74 20 62 65 20 65 78 70 61 6e 64 65 64 20 62 65  t be expanded be
2bb50 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73  fore.** name res
2bb60 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f  olution is perfo
2bb70 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rmed..**.** If a
2bb80 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
2bb90 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ng, an error mes
2bba0 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  sage is written 
2bbb0 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20  into pParse..** 
2bbc0 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
2bbd0 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20  tion can detect 
2bbe0 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c  the problem by l
2bbf0 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65  ooking at pParse
2bc00 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72  ->nErr.** and/or
2bc10 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
2bc20 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74  locFailed..*/.st
2bc30 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
2bc40 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61  3SelectExpand(Pa
2bc50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
2bc60 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
2bc70 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78   Walker w;.  w.x
2bc80 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 73  ExprCallback = s
2bc90 71 6c 69 74 65 33 45 78 70 72 57 61 6c 6b 4e 6f  qlite3ExprWalkNo
2bca0 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  op;.  w.pParse =
2bcb0 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 4f   pParse;.  if( O
2bcc0 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52 55 45  K_IF_ALWAYS_TRUE
2bcd0 28 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70  (pParse->hasComp
2bce0 6f 75 6e 64 29 20 29 7b 0a 20 20 20 20 77 2e 78  ound) ){.    w.x
2bcf0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
2bd00 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64   convertCompound
2bd10 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79  SelectToSubquery
2bd20 3b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43  ;.    w.xSelectC
2bd30 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20  allback2 = 0;.  
2bd40 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
2bd50 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
2bd60 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63  ;.  }.  w.xSelec
2bd70 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65  tCallback = sele
2bd80 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e  ctExpander;.  w.
2bd90 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
2bda0 20 3d 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68   = selectPopWith
2bdb0 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  ;.  sqlite3WalkS
2bdc0 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
2bdd0 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  t);.}...#ifndef 
2bde0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
2bdf0 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  UERY./*.** This 
2be00 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c  is a Walker.xSel
2be10 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c  ectCallback call
2be20 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c  back for the sql
2be30 69 74 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e  ite3SelectTypeIn
2be40 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63  fo().** interfac
2be50 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63  e..**.** For eac
2be60 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  h FROM-clause su
2be70 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75  bquery, add Colu
2be80 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c  mn.zType and Col
2be90 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66  umn.zColl.** inf
2bea0 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  ormation to the 
2beb0 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
2bec0 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20  that represents 
2bed0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a  the result set.*
2bee0 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71 75 65  * of that subque
2bef0 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61  ry..**.** The Ta
2bf00 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
2bf10 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  at represents th
2bf20 65 20 72 65 73 75 6c 74 20 73 65 74 20 77 61 73  e result set was
2bf30 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20   constructed.** 
2bf40 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65  by selectExpande
2bf50 72 28 29 20 62 75 74 20 74 68 65 20 74 79 70 65  r() but the type
2bf60 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69   and collation i
2bf70 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f  nformation was o
2bf80 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61  mitted.** at tha
2bf90 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20  t point because 
2bfa0 69 64 65 6e 74 69 66 69 65 72 73 20 68 61 64 20  identifiers had 
2bfb0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65 73  not yet been res
2bfc0 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20  olved.  This.** 
2bfd0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2bfe0 64 20 61 66 74 65 72 20 69 64 65 6e 74 69 66 69  d after identifi
2bff0 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  er resolution..*
2c000 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
2c010 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
2c020 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a  ypeInfo(Walker *
2c030 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
2c040 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
2c050 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  arse;.  int i;. 
2c060 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
2c070 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
2c080 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
2c090 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
2c0a0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
2c0b0 73 6f 6c 76 65 64 20 29 3b 0a 20 20 61 73 73 65  solved );.  asse
2c0c0 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  rt( (p->selFlags
2c0d0 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66   & SF_HasTypeInf
2c0e0 6f 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65  o)==0 );.  p->se
2c0f0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73  lFlags |= SF_Has
2c100 54 79 70 65 49 6e 66 6f 3b 0a 20 20 70 50 61 72  TypeInfo;.  pPar
2c110 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
2c120 61 72 73 65 3b 0a 20 20 70 54 61 62 4c 69 73 74  arse;.  pTabList
2c130 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 66 6f   = p->pSrc;.  fo
2c140 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
2c150 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
2c160 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
2c170 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
2c180 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
2c190 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73  om->pTab;.    as
2c1a0 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
2c1b0 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
2c1c0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
2c1d0 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20  hemeral)!=0 ){. 
2c1e0 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
2c1f0 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
2c200 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
2c210 43 54 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65  CT */.      Sele
2c220 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d  ct *pSel = pFrom
2c230 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
2c240 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20   if( pSel ){.   
2c250 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c       while( pSel
2c260 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20  ->pPrior ) pSel 
2c270 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a  = pSel->pPrior;.
2c280 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
2c290 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
2c2a0 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
2c2b0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65  Parse, pTab, pSe
2c2c0 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
2c2d0 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
2c2e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2c2f0 69 6e 65 20 61 64 64 73 20 64 61 74 61 74 79 70  ine adds datatyp
2c300 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  e and collating 
2c310 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61  sequence informa
2c320 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54  tion to.** the T
2c330 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 73 20  able structures 
2c340 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  of all FROM-clau
2c350 73 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  se subqueries in
2c360 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
2c370 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73  tement..**.** Us
2c380 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  e this routine a
2c390 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75  fter name resolu
2c3a0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2c3b0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
2c3c0 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61  ctAddTypeInfo(Pa
2c3d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
2c3e0 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23  ect *pSelect){.#
2c3f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c400 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61  IT_SUBQUERY.  Wa
2c410 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c  lker w;.  w.xSel
2c420 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71  ectCallback = sq
2c430 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e  lite3SelectWalkN
2c440 6f 6f 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  oop;.  w.xSelect
2c450 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65  Callback2 = sele
2c460 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
2c470 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72  eInfo;.  w.xExpr
2c480 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
2c490 65 33 45 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a  e3ExprWalkNoop;.
2c4a0 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
2c4b0 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  rse;.  sqlite3Wa
2c4c0 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
2c4d0 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  lect);.#endif.}.
2c4e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2c4f0 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 53  tine sets up a S
2c500 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
2c510 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 2e 20  for processing. 
2c520 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   The.** followin
2c530 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73 68 65  g is accomplishe
2c540 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20  d:.**.**     *  
2c550 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75 6d 62  VDBE Cursor numb
2c560 65 72 73 20 61 72 65 20 61 73 73 69 67 6e 65 64  ers are assigned
2c570 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61   to all FROM-cla
2c580 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20  use terms..**   
2c590 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c 20 54    *  Ephemeral T
2c5a0 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61 72 65  able objects are
2c5b0 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c 6c   created for all
2c5c0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
2c5d0 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20  queries..**     
2c5e0 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  *  ON and USING 
2c5f0 63 6c 61 75 73 65 73 20 61 72 65 20 73 68 69 66  clauses are shif
2c600 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45 20 73  ted into WHERE s
2c610 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20  tatements.**    
2c620 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20 22 2a   *  Wildcards "*
2c630 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20  " and "TABLE.*" 
2c640 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73 20 61  in result sets a
2c650 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20  re expanded..** 
2c660 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66 69 65      *  Identifie
2c670 72 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  rs in expression
2c680 20 61 72 65 20 6d 61 74 63 68 65 64 20 74 6f 20   are matched to 
2c690 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  tables..**.** Th
2c6a0 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20  is routine acts 
2c6b0 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 61  recursively on a
2c6c0 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20 77 69  ll subqueries wi
2c6d0 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43 54 2e  thin the SELECT.
2c6e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2c6f0 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20 50 61  SelectPrep(.  Pa
2c700 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2c710 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
2c720 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
2c730 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
2c740 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
2c750 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
2c760 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
2c770 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f   NameContext *pO
2c780 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20  uterNC  /* Name 
2c790 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f 6e 74  context for cont
2c7a0 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20 61 73  ainer */.){.  as
2c7b0 73 65 72 74 28 20 70 21 3d 30 20 7c 7c 20 70 50  sert( p!=0 || pP
2c7c0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
2c7d0 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
2c7e0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
2c7f0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
2c800 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  n;.  if( p->selF
2c810 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70  lags & SF_HasTyp
2c820 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a  eInfo ) return;.
2c830 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45    sqlite3SelectE
2c840 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29  xpand(pParse, p)
2c850 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
2c860 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e  nErr || pParse->
2c870 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2c880 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
2c890 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63  ite3ResolveSelec
2c8a0 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  tNames(pParse, p
2c8b0 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69  , pOuterNC);.  i
2c8c0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
2c8d0 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
2c8e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
2c8f0 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53  turn;.  sqlite3S
2c900 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f  electAddTypeInfo
2c910 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a  (pParse, p);.}..
2c920 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
2c930 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
2c940 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lator..**.** The
2c950 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
2c960 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20  ulator is a set 
2c970 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  of memory cells 
2c980 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74  that hold.** int
2c990 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
2c9a0 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74  s while calculat
2c9b0 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65  ing an aggregate
2c9c0 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
2c9d0 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
2c9e0 65 20 74 68 61 74 20 73 74 6f 72 65 73 20 4e 55  e that stores NU
2c9f0 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  LLs in all of th
2ca00 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65  ose memory.** ce
2ca10 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lls..*/.static v
2ca20 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c  oid resetAccumul
2ca30 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
2ca40 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
2ca50 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
2ca60 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
2ca70 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
2ca80 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
2ca90 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20  c *pFunc;.  int 
2caa0 6e 52 65 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d  nReg = pAggInfo-
2cab0 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67 49 6e 66  >nFunc + pAggInf
2cac0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66  o->nColumn;.  if
2cad0 28 20 6e 52 65 67 3d 3d 30 20 29 20 72 65 74 75  ( nReg==0 ) retu
2cae0 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rn;.#ifdef SQLIT
2caf0 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72  E_DEBUG.  /* Ver
2cb00 69 66 79 20 74 68 61 74 20 61 6c 6c 20 41 67 67  ify that all Agg
2cb10 49 6e 66 6f 20 72 65 67 69 73 74 65 72 73 20 61  Info registers a
2cb20 72 65 20 77 69 74 68 69 6e 20 74 68 65 20 72 61  re within the ra
2cb30 6e 67 65 20 73 70 65 63 69 66 69 65 64 20 62 79  nge specified by
2cb40 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e  .  ** AggInfo.mn
2cb50 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52  Reg..AggInfo.mxR
2cb60 65 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  eg */.  assert( 
2cb70 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e  nReg==pAggInfo->
2cb80 6d 78 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e  mxReg-pAggInfo->
2cb90 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72  mnReg+1 );.  for
2cba0 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
2cbb0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
2cbc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67  .    assert( pAg
2cbd0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
2cbe0 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem>=pAggInfo->m
2cbf0 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26  nReg.         &&
2cc00 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
2cc10 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66  i].iMem<=pAggInf
2cc20 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a  o->mxReg );.  }.
2cc30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
2cc40 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
2cc50 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
2cc60 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
2cc70 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66  i].iMem>=pAggInf
2cc80 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20  o->mnReg.       
2cc90 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61    && pAggInfo->a
2cca0 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41  Func[i].iMem<=pA
2ccb0 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b  ggInfo->mxReg );
2ccc0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
2ccd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2cce0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
2ccf0 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20  AggInfo->mnReg, 
2cd00 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29  pAggInfo->mxReg)
2cd10 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41  ;.  for(pFunc=pA
2cd20 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69  ggInfo->aFunc, i
2cd30 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
2cd40 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e  nFunc; i++, pFun
2cd50 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46  c++){.    if( pF
2cd60 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d  unc->iDistinct>=
2cd70 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
2cd80 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78  *pE = pFunc->pEx
2cd90 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
2cda0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2cdb0 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pE, EP_xIsSel
2cdc0 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ect) );.      if
2cdd0 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30  ( pE->x.pList==0
2cde0 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d   || pE->x.pList-
2cdf0 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
2ce00 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2ce10 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49  rMsg(pParse, "DI
2ce20 53 54 49 4e 43 54 20 61 67 67 72 65 67 61 74 65  STINCT aggregate
2ce30 73 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63  s must have exac
2ce40 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20  tly one ".      
2ce50 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29       "argument")
2ce60 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d  ;.        pFunc-
2ce70 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
2ce80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2ce90 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
2cea0 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
2ceb0 33 4b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  3KeyInfoFromExpr
2cec0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d  List(pParse, pE-
2ced0 3e 78 2e 70 4c 69 73 74 2c 30 2c 30 29 3b 0a 20  >x.pList,0,0);. 
2cee0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2cef0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
2cf00 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 46  penEphemeral, pF
2cf10 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20  unc->iDistinct, 
2cf20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  0, 0,.          
2cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf40 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
2cf50 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
2cf60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2cf70 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
2cf80 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69  the OP_AggFinali
2cf90 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76  ze opcode for ev
2cfa0 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75  ery aggregate fu
2cfb0 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  nction.** in the
2cfc0 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75   AggInfo structu
2cfd0 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
2cfe0 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75  id finalizeAggFu
2cff0 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70  nctions(Parse *p
2d000 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
2d010 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
2d020 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
2d030 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
2d040 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
2d050 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28  func *pF;.  for(
2d060 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
2d070 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
2d080 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
2d090 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72   pF++){.    Expr
2d0a0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
2d0b0 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ->pExpr->x.pList
2d0c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2d0d0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2d0e0 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  F->pExpr, EP_xIs
2d0f0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73  Select) );.    s
2d100 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2d110 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c  (v, OP_AggFinal,
2d120 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74   pF->iMem, pList
2d130 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
2d140 3a 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  : 0);.    sqlite
2d150 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76 2c  3VdbeAppendP4(v,
2d160 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46   pF->pFunc, P4_F
2d170 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a  UNCDEF);.  }.}..
2d180 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
2d190 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d   accumulator mem
2d1a0 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e  ory cells for an
2d1b0 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64   aggregate based
2d1c0 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65   on.** the curre
2d1d0 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
2d1e0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
2d1f0 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c  id updateAccumul
2d200 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
2d210 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
2d220 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
2d230 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
2d240 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
2d250 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20  t regHit = 0;.  
2d260 69 6e 74 20 61 64 64 72 48 69 74 54 65 73 74 20  int addrHitTest 
2d270 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67  = 0;.  struct Ag
2d280 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
2d290 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
2d2a0 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67  _col *pC;..  pAg
2d2b0 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
2d2c0 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30  e = 1;.  for(i=0
2d2d0 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
2d2e0 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
2d2f0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
2d300 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72  ++){.    int nAr
2d310 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e  g;.    int addrN
2d320 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ext = 0;.    int
2d330 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70   regAgg;.    Exp
2d340 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
2d350 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  F->pExpr->x.pLis
2d360 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  t;.    assert( !
2d370 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
2d380 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  pF->pExpr, EP_xI
2d390 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
2d3a0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
2d3b0 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d     nArg = pList-
2d3c0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65  >nExpr;.      re
2d3d0 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65  gAgg = sqlite3Ge
2d3e0 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
2d3f0 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  e, nArg);.      
2d400 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
2d410 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
2d420 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20 30  pList, regAgg, 0
2d430 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  , SQLITE_ECEL_DU
2d440 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  P);.    }else{. 
2d450 20 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20       nArg = 0;. 
2d460 20 20 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b       regAgg = 0;
2d470 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2d480 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20  F->iDistinct>=0 
2d490 29 7b 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78  ){.      addrNex
2d4a0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
2d4b0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
2d4c0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 41 72     testcase( nAr
2d4d0 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45 72 72 6f  g==0 );  /* Erro
2d4e0 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a 2f 0a 20  r condition */. 
2d4f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2d500 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a 20 41 6c  Arg>1 );   /* Al
2d510 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  so an error */. 
2d520 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63       codeDistinc
2d530 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44  t(pParse, pF->iD
2d540 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78  istinct, addrNex
2d550 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20  t, 1, regAgg);. 
2d560 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
2d570 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67  >pFunc->funcFlag
2d580 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
2d590 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20  NEEDCOLL ){.    
2d5a0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
2d5b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75   = 0;.      stru
2d5c0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
2d5d0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69   *pItem;.      i
2d5e0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65  nt j;.      asse
2d5f0 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20  rt( pList!=0 ); 
2d600 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20   /* pList!=0 if 
2d610 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45  pF->pFunc has NE
2d620 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  EDCOLL */.      
2d630 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
2d640 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20  List->a; !pColl 
2d650 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20  && j<nArg; j++, 
2d660 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
2d670 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
2d680 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
2d690 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
2d6a0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
2d6b0 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
2d6c0 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
2d6d0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
2d6e0 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  tColl;.      }. 
2d6f0 20 20 20 20 20 69 66 28 20 72 65 67 48 69 74 3d       if( regHit=
2d700 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e  =0 && pAggInfo->
2d710 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72  nAccumulator ) r
2d720 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65  egHit = ++pParse
2d730 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
2d740 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2d750 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72  v, OP_CollSeq, r
2d760 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68  egHit, 0, 0, (ch
2d770 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
2d780 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20  OLLSEQ);.    }. 
2d790 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2d7a0 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67 67 53 74  dOp3(v, OP_AggSt
2d7b0 65 70 30 2c 20 30 2c 20 72 65 67 41 67 67 2c 20  ep0, 0, regAgg, 
2d7c0 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 73  pF->iMem);.    s
2d7d0 71 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64  qlite3VdbeAppend
2d7e0 50 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c  P4(v, pF->pFunc,
2d7f0 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P4_FUNCDEF);.  
2d800 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2d810 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72  ngeP5(v, (u8)nAr
2d820 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  g);.    sqlite3E
2d830 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
2d840 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
2d850 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20  egAgg, nArg);.  
2d860 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
2d870 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
2d880 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
2d890 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78  .    if( addrNex
2d8a0 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
2d8b0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2d8c0 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b  el(v, addrNext);
2d8d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2d8e0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2d8f0 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rse);.    }.  }.
2d900 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70  .  /* Before pop
2d910 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75  ulating the accu
2d920 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
2d930 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c  s, clear the col
2d940 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20  umn cache..  ** 
2d950 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e  Otherwise, if an
2d960 79 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65  y of the require
2d970 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20  d column values 
2d980 61 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73  are already pres
2d990 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67  ent .  ** in reg
2d9a0 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45  isters, sqlite3E
2d9b0 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73  xprCode() may us
2d9c0 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f  e OP_SCopy to co
2d9d0 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a  py the value.  *
2d9e0 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42  * to pC->iMem. B
2d9f0 75 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74  ut by the time t
2da00 68 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  he value is used
2da10 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72  , the original r
2da20 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79  egister.  ** may
2da30 20 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c   have been used,
2da40 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68   invalidating th
2da50 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66  e underlying buf
2da60 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a  fer holding the.
2da70 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f    ** text or blo
2da80 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63  b value. See tic
2da90 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d  ket [883034dcb5]
2daa0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74  ..  **.  ** Anot
2dab0 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75  her solution wou
2dac0 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20  ld be to change 
2dad0 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65  the OP_SCopy use
2dae0 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64  d to copy cached
2daf0 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20  .  ** values to 
2db00 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f  an OP_Copy..  */
2db10 0a 20 20 69 66 28 20 72 65 67 48 69 74 20 29 7b  .  if( regHit ){
2db20 0a 20 20 20 20 61 64 64 72 48 69 74 54 65 73 74  .    addrHitTest
2db30 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2db40 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp1(v, OP_If, r
2db50 65 67 48 69 74 29 3b 20 56 64 62 65 43 6f 76 65  egHit); VdbeCove
2db60 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73  rage(v);.  }.  s
2db70 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
2db80 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
2db90 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67  for(i=0, pC=pAgg
2dba0 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41  Info->aCol; i<pA
2dbb0 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
2dbc0 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29  ator; i++, pC++)
2dbd0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2dbe0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43  rCode(pParse, pC
2dbf0 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65  ->pExpr, pC->iMe
2dc00 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e  m);.  }.  pAggIn
2dc10 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
2dc20 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
2dc30 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2dc40 73 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48  se);.  if( addrH
2dc50 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71  itTest ){.    sq
2dc60 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2dc70 65 28 76 2c 20 61 64 64 72 48 69 74 54 65 73 74  e(v, addrHitTest
2dc80 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2dc90 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f  Add a single OP_
2dca0 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74  Explain instruct
2dcb0 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20  ion to the VDBE 
2dcc0 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d  to explain a sim
2dcd0 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20  ple.** count(*) 
2dce0 71 75 65 72 79 20 28 22 53 45 4c 45 43 54 20 63  query ("SELECT c
2dcf0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61  ount(*) FROM pTa
2dd00 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  b")..*/.#ifndef 
2dd10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
2dd20 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20  AIN.static void 
2dd30 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
2dd40 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
2dd50 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
2dd60 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
2dd70 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
2dd80 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
2dd90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2dda0 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69  able being queri
2ddb0 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
2ddc0 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20  Idx             
2ddd0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2dde0 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a   used to optimiz
2ddf0 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20  e scan, or NULL 
2de00 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72  */.){.  if( pPar
2de10 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
2de20 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f 76 65 72  {.    int bCover
2de30 20 3d 20 28 70 49 64 78 21 3d 30 20 26 26 20 28   = (pIdx!=0 && (
2de40 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c  HasRowid(pTab) |
2de50 7c 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49  | !IsPrimaryKeyI
2de60 6e 64 65 78 28 70 49 64 78 29 29 29 3b 0a 20 20  ndex(pIdx)));.  
2de70 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70    sqlite3VdbeExp
2de80 6c 61 69 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  lain(pParse, 0, 
2de90 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73  "SCAN TABLE %s%s
2dea0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
2deb0 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
2dec0 20 20 62 43 6f 76 65 72 20 3f 20 22 20 55 53 49    bCover ? " USI
2ded0 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
2dee0 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20  X " : "",.      
2def0 20 20 62 43 6f 76 65 72 20 3f 20 70 49 64 78 2d    bCover ? pIdx-
2df00 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20  >zName : "".    
2df10 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
2df20 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
2df30 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63  impleCount(a,b,c
2df40 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
2df50 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
2df60 29 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  ) callback used 
2df70 62 79 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65  by havingToWhere
2df80 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ()..**.** If the
2df90 20 6e 6f 64 65 20 70 61 73 73 65 64 20 74 6f 20   node passed to 
2dfa0 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  the callback is 
2dfb0 61 20 54 4b 5f 41 4e 44 20 6e 6f 64 65 2c 20 72  a TK_AND node, r
2dfc0 65 74 75 72 6e 20 0a 2a 2a 20 57 52 43 5f 43 6f  eturn .** WRC_Co
2dfd0 6e 74 69 6e 75 65 20 74 6f 20 74 65 6c 6c 20 73  ntinue to tell s
2dfe0 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29  qlite3WalkExpr()
2dff0 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
2e000 75 67 68 20 63 68 69 6c 64 20 6e 6f 64 65 73 2e  ugh child nodes.
2e010 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
2e020 2c 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75  , return WRC_Pru
2e030 6e 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ne. In this case
2e040 2c 20 61 6c 73 6f 20 63 68 65 63 6b 20 69 66 20  , also check if 
2e050 74 68 65 20 0a 2a 2a 20 73 75 62 2d 65 78 70 72  the .** sub-expr
2e060 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20 74  ession matches t
2e070 68 65 20 63 72 69 74 65 72 69 61 20 66 6f 72 20  he criteria for 
2e080 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74  being moved to t
2e090 68 65 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75  he WHERE.** clau
2e0a0 73 65 2e 20 49 66 20 73 6f 2c 20 61 64 64 20 69  se. If so, add i
2e0b0 74 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  t to the WHERE c
2e0c0 6c 61 75 73 65 20 61 6e 64 20 72 65 70 6c 61 63  lause and replac
2e0d0 65 20 74 68 65 20 73 75 62 2d 65 78 70 72 65 73  e the sub-expres
2e0e0 73 69 6f 6e 0a 2a 2a 20 77 69 74 68 69 6e 20 74  sion.** within t
2e0f0 68 65 20 48 41 56 49 4e 47 20 65 78 70 72 65 73  he HAVING expres
2e100 73 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 73  sion with a cons
2e110 74 61 6e 74 20 22 31 22 2e 0a 2a 2f 0a 73 74 61  tant "1"..*/.sta
2e120 74 69 63 20 69 6e 74 20 68 61 76 69 6e 67 54 6f  tic int havingTo
2e130 57 68 65 72 65 45 78 70 72 43 62 28 57 61 6c 6b  WhereExprCb(Walk
2e140 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
2e150 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28  r *pExpr){.  if(
2e160 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
2e170 4e 44 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74  ND ){.    Select
2e180 20 2a 70 53 20 3d 20 70 57 61 6c 6b 65 72 2d 3e   *pS = pWalker->
2e190 75 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  u.pSelect;.    i
2e1a0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
2e1b0 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f 75 70 42  ConstantOrGroupB
2e1c0 79 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  y(pWalker->pPars
2e1d0 65 2c 20 70 45 78 70 72 2c 20 70 53 2d 3e 70 47  e, pExpr, pS->pG
2e1e0 72 6f 75 70 42 79 29 20 29 7b 0a 20 20 20 20 20  roupBy) ){.     
2e1f0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2e200 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2d 3e  Walker->pParse->
2e210 64 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  db;.      Expr *
2e220 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
2e230 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49  prAlloc(db, TK_I
2e240 4e 54 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33  NTEGER, &sqlite3
2e250 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c 20 30 29  IntTokens[1], 0)
2e260 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
2e270 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
2e280 20 2a 70 57 68 65 72 65 20 3d 20 70 53 2d 3e 70   *pWhere = pS->p
2e290 57 68 65 72 65 3b 0a 20 20 20 20 20 20 20 20 53  Where;.        S
2e2a0 57 41 50 28 45 78 70 72 2c 20 2a 70 4e 65 77 2c  WAP(Expr, *pNew,
2e2b0 20 2a 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20   *pExpr);.      
2e2c0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
2e2d0 45 78 70 72 41 6e 64 28 64 62 2c 20 70 57 68 65  ExprAnd(db, pWhe
2e2e0 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20  re, pNew);.     
2e2f0 20 20 20 70 53 2d 3e 70 57 68 65 72 65 20 3d 20     pS->pWhere = 
2e300 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 57  pNew;.        pW
2e310 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 31  alker->eCode = 1
2e320 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2e330 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
2e340 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rune;.  }.  retu
2e350 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
2e360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66  .}../*.** Transf
2e370 65 72 20 65 6c 69 67 69 62 6c 65 20 74 65 72 6d  er eligible term
2e380 73 20 66 72 6f 6d 20 74 68 65 20 48 41 56 49 4e  s from the HAVIN
2e390 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 71 75  G clause of a qu
2e3a0 65 72 79 2c 20 77 68 69 63 68 20 69 73 0a 2a 2a  ery, which is.**
2e3b0 20 70 72 6f 63 65 73 73 65 64 20 61 66 74 65 72   processed after
2e3c0 20 67 72 6f 75 70 69 6e 67 2c 20 74 6f 20 74 68   grouping, to th
2e3d0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
2e3e0 77 68 69 63 68 20 69 73 20 70 72 6f 63 65 73 73  which is process
2e3f0 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 67 72 6f  ed before.** gro
2e400 75 70 69 6e 67 2e 20 46 6f 72 20 65 78 61 6d 70  uping. For examp
2e410 6c 65 2c 20 74 68 65 20 71 75 65 72 79 3a 0a 2a  le, the query:.*
2e420 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20  *.**   SELECT * 
2e430 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20 57 48  FROM <tables> WH
2e440 45 52 45 20 61 3d 3f 20 47 52 4f 55 50 20 42 59  ERE a=? GROUP BY
2e450 20 62 20 48 41 56 49 4e 47 20 62 3d 3f 20 41 4e   b HAVING b=? AN
2e460 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20  D c=?.**.** can 
2e470 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 3a  be rewritten as:
2e480 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
2e490 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e 20  * FROM <tables> 
2e4a0 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20 62 3d  WHERE a=? AND b=
2e4b0 3f 20 47 52 4f 55 50 20 42 59 20 62 20 48 41 56  ? GROUP BY b HAV
2e4c0 49 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 41 20  ING c=?.**.** A 
2e4d0 74 65 72 6d 20 6f 66 20 74 68 65 20 48 41 56 49  term of the HAVI
2e4e0 4e 47 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  NG expression is
2e4f0 20 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 74 72   eligible for tr
2e500 61 6e 73 66 65 72 20 69 66 20 69 74 20 63 6f 6e  ansfer if it con
2e510 73 69 73 74 73 0a 2a 2a 20 65 6e 74 69 72 65 6c  sists.** entirel
2e520 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74 73 20 61  y of constants a
2e530 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  nd expressions t
2e540 68 61 74 20 61 72 65 20 61 6c 73 6f 20 47 52 4f  hat are also GRO
2e550 55 50 20 42 59 20 74 65 72 6d 73 20 74 68 61 74  UP BY terms that
2e560 0a 2a 2a 20 75 73 65 20 74 68 65 20 22 42 49 4e  .** use the "BIN
2e570 41 52 59 22 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ARY" collation s
2e580 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  equence..*/.stat
2e590 69 63 20 76 6f 69 64 20 68 61 76 69 6e 67 54 6f  ic void havingTo
2e5a0 57 68 65 72 65 28 50 61 72 73 65 20 2a 70 50 61  Where(Parse *pPa
2e5b0 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
2e5c0 0a 20 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b 65  .  Walker sWalke
2e5d0 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57 61  r;.  memset(&sWa
2e5e0 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  lker, 0, sizeof(
2e5f0 73 57 61 6c 6b 65 72 29 29 3b 0a 20 20 73 57 61  sWalker));.  sWa
2e600 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 70 50  lker.pParse = pP
2e610 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b 65 72 2e  arse;.  sWalker.
2e620 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
2e630 68 61 76 69 6e 67 54 6f 57 68 65 72 65 45 78 70  havingToWhereExp
2e640 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 75  rCb;.  sWalker.u
2e650 2e 70 53 65 6c 65 63 74 20 3d 20 70 3b 0a 20 20  .pSelect = p;.  
2e660 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
2e670 26 73 57 61 6c 6b 65 72 2c 20 70 2d 3e 70 48 61  &sWalker, p->pHa
2e680 76 69 6e 67 29 3b 0a 23 69 66 20 53 45 4c 45 43  ving);.#if SELEC
2e690 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
2e6a0 20 69 66 28 20 73 57 61 6c 6b 65 72 2e 65 43 6f   if( sWalker.eCo
2e6b0 64 65 20 26 26 20 28 73 71 6c 69 74 65 33 53 65  de && (sqlite3Se
2e6c0 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 31 30  lectTrace & 0x10
2e6d0 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 53 45 4c  0)!=0 ){.    SEL
2e6e0 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70  ECTTRACE(0x100,p
2e6f0 50 61 72 73 65 2c 70 2c 28 22 4d 6f 76 65 20 48  Parse,p,("Move H
2e700 41 56 49 4e 47 20 74 65 72 6d 73 20 69 6e 74 6f  AVING terms into
2e710 20 57 48 45 52 45 3a 5c 6e 22 29 29 3b 0a 20 20   WHERE:\n"));.  
2e720 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
2e730 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
2e740 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
2e750 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
2e760 65 65 20 69 66 20 74 68 65 20 70 54 68 69 73 20  ee if the pThis 
2e770 65 6e 74 72 79 20 6f 66 20 70 54 61 62 4c 69 73  entry of pTabLis
2e780 74 20 69 73 20 61 20 73 65 6c 66 2d 6a 6f 69 6e  t is a self-join
2e790 20 6f 66 20 61 20 70 72 69 6f 72 20 76 69 65 77   of a prior view
2e7a0 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74  ..** If it is, t
2e7b0 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 53  hen return the S
2e7c0 72 63 4c 69 73 74 5f 69 74 65 6d 20 66 6f 72 20  rcList_item for 
2e7d0 74 68 65 20 70 72 69 6f 72 20 76 69 65 77 2e 20  the prior view. 
2e7e0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 0a 2a   If it is not,.*
2e7f0 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 30 2e  * then return 0.
2e800 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
2e810 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2e820 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 0a  isSelfJoinView(.
2e830 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
2e840 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ist,           /
2e850 2a 20 53 65 61 72 63 68 20 66 6f 72 20 73 65 6c  * Search for sel
2e860 66 2d 6a 6f 69 6e 73 20 69 6e 20 74 68 69 73 20  f-joins in this 
2e870 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
2e880 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2e890 69 74 65 6d 20 2a 70 54 68 69 73 20 20 20 2f 2a  item *pThis   /*
2e8a0 20 53 65 61 72 63 68 20 66 6f 72 20 70 72 69 6f   Search for prio
2e8b0 72 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  r reference to t
2e8c0 68 69 73 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  his subquery */.
2e8d0 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  ){.  struct SrcL
2e8e0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
2e8f0 0a 20 20 66 6f 72 28 70 49 74 65 6d 20 3d 20 70  .  for(pItem = p
2e900 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65  TabList->a; pIte
2e910 6d 3c 70 54 68 69 73 3b 20 70 49 74 65 6d 2b 2b  m<pThis; pItem++
2e920 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  ){.    if( pItem
2e930 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 20 63  ->pSelect==0 ) c
2e940 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2e950 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f   pItem->fg.viaCo
2e960 72 6f 75 74 69 6e 65 20 29 20 63 6f 6e 74 69 6e  routine ) contin
2e970 75 65 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ue;.    if( pIte
2e980 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 20 63 6f  m->zName==0 ) co
2e990 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2e9a0 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
2e9b0 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
2e9c0 2c 20 70 54 68 69 73 2d 3e 7a 44 61 74 61 62 61  , pThis->zDataba
2e9d0 73 65 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  se)!=0 ) continu
2e9e0 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
2e9f0 65 33 5f 73 74 72 69 63 6d 70 28 70 49 74 65 6d  e3_stricmp(pItem
2ea00 2d 3e 7a 4e 61 6d 65 2c 20 70 54 68 69 73 2d 3e  ->zName, pThis->
2ea10 7a 4e 61 6d 65 29 21 3d 30 20 29 20 63 6f 6e 74  zName)!=0 ) cont
2ea20 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71  inue;.    if( sq
2ea30 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
2ea40 28 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  (0, .          p
2ea50 54 68 69 73 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  This->pSelect->p
2ea60 57 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Where, pItem->pS
2ea70 65 6c 65 63 74 2d 3e 70 57 68 65 72 65 2c 20 2d  elect->pWhere, -
2ea80 31 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  1) .    ){.     
2ea90 20 2f 2a 20 54 68 65 20 76 69 65 77 20 77 61 73   /* The view was
2eaa0 20 6d 6f 64 69 66 69 65 64 20 62 79 20 73 6f 6d   modified by som
2eab0 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61  e other optimiza
2eac0 74 69 6f 6e 20 73 75 63 68 20 61 73 0a 20 20 20  tion such as.   
2ead0 20 20 20 2a 2a 20 70 75 73 68 44 6f 77 6e 57 68     ** pushDownWh
2eae0 65 72 65 54 65 72 6d 73 28 29 20 2a 2f 0a 20 20  ereTerms() */.  
2eaf0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2eb00 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
2eb10 49 74 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Item;.  }.  retu
2eb20 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  rn 0;.}..#ifdef 
2eb30 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49  SQLITE_COUNTOFVI
2eb40 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  EW_OPTIMIZATION.
2eb50 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
2eb60 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 71 75 65   transform a que
2eb70 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  ry of the form.*
2eb80 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 63  *.**    SELECT c
2eb90 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 28 53 45  ount(*) FROM (SE
2eba0 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 55  LECT x FROM t1 U
2ebb0 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
2ebc0 79 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 0a 2a 2a  y FROM t2).**.**
2ebd0 20 49 6e 74 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Into this:.**.*
2ebe0 2a 20 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  *    SELECT (SEL
2ebf0 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
2ec00 4d 20 74 31 29 2b 28 53 45 4c 45 43 54 20 63 6f  M t1)+(SELECT co
2ec10 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 29 0a  unt(*) FROM t2).
2ec20 2a 2a 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 66  **.** The transf
2ec30 6f 72 6d 61 74 69 6f 6e 20 6f 6e 6c 79 20 77 6f  ormation only wo
2ec40 72 6b 73 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  rks if all of th
2ec50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
2ec60 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  true:.**.**   * 
2ec70 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
2ec80 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 66 20   a UNION ALL of 
2ec90 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  two or more term
2eca0 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65 72 65 20  s.**   *  There 
2ecb0 69 73 20 6e 6f 20 57 48 45 52 45 20 6f 72 20 47  is no WHERE or G
2ecc0 52 4f 55 50 20 42 59 20 6f 72 20 48 41 56 49 4e  ROUP BY or HAVIN
2ecd0 47 20 63 6c 61 75 73 65 73 20 6f 6e 20 74 68 65  G clauses on the
2ece0 20 73 75 62 71 75 65 72 69 65 73 0a 2a 2a 20 20   subqueries.**  
2ecf0 20 2a 20 20 54 68 65 20 6f 75 74 65 72 20 71 75   *  The outer qu
2ed00 65 72 79 20 69 73 20 61 20 73 69 6d 70 6c 65 20  ery is a simple 
2ed10 63 6f 75 6e 74 28 2a 29 0a 2a 2a 0a 2a 2a 20 52  count(*).**.** R
2ed20 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
2ed30 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
2ed40 73 20 75 6e 64 65 72 74 61 6b 65 6e 2e 0a 2a 2f  s undertaken..*/
2ed50 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e  .static int coun
2ed60 74 4f 66 56 69 65 77 4f 70 74 69 6d 69 7a 61 74  tOfViewOptimizat
2ed70 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
2ed80 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
2ed90 20 53 65 6c 65 63 74 20 2a 70 53 75 62 2c 20 2a   Select *pSub, *
2eda0 70 50 72 69 6f 72 3b 0a 20 20 45 78 70 72 20 2a  pPrior;.  Expr *
2edb0 70 45 78 70 72 3b 0a 20 20 45 78 70 72 20 2a 70  pExpr;.  Expr *p
2edc0 43 6f 75 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33  Count;.  sqlite3
2edd0 20 2a 64 62 3b 0a 20 20 69 66 28 20 28 70 2d 3e   *db;.  if( (p->
2ede0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
2edf0 67 72 65 67 61 74 65 29 3d 3d 30 20 29 20 72 65  gregate)==0 ) re
2ee00 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 54 68 69  turn 0;   /* Thi
2ee10 73 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  s is an aggregat
2ee20 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 45  e */.  if( p->pE
2ee30 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
2ee40 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
2ee50 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67           /* Sing
2ee60 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  le result column
2ee70 20 2a 2f 0a 20 20 70 45 78 70 72 20 3d 20 70 2d   */.  pExpr = p-
2ee80 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
2ee90 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70 72  xpr;.  if( pExpr
2eea0 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
2eeb0 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30  CTION ) return 0
2eec0 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  ;        /* Resu
2eed0 6c 74 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  lt is an aggrega
2eee0 74 65 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  te */.  if( sqli
2eef0 74 65 33 5f 73 74 72 69 63 6d 70 28 70 45 78 70  te3_stricmp(pExp
2ef00 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 63 6f 75  r->u.zToken,"cou
2ef10 6e 74 22 29 20 29 20 72 65 74 75 72 6e 20 30 3b  nt") ) return 0;
2ef20 20 20 2f 2a 20 49 73 20 63 6f 75 6e 74 28 29 20    /* Is count() 
2ef30 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
2ef40 78 2e 70 4c 69 73 74 21 3d 30 20 29 20 72 65 74  x.pList!=0 ) ret
2ef50 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
2ef60 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
2ef70 65 20 63 6f 75 6e 74 28 2a 29 20 2a 2f 0a 20 20  e count(*) */.  
2ef80 69 66 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  if( p->pSrc->nSr
2ef90 63 21 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  c!=1 ) return 0;
2efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efb0 20 20 2f 2a 20 4f 6e 65 20 74 61 62 6c 65 20 69    /* One table i
2efc0 6e 20 46 52 4f 4d 20 20 2a 2f 0a 20 20 70 53 75  n FROM  */.  pSu
2efd0 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
2efe0 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 69 66 28  ].pSelect;.  if(
2eff0 20 70 53 75 62 3d 3d 30 20 29 20 72 65 74 75 72   pSub==0 ) retur
2f000 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
2f010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f020 2a 20 54 68 65 20 46 52 4f 4d 20 69 73 20 61 20  * The FROM is a 
2f030 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 66  subquery */.  if
2f040 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d 3d  ( pSub->pPrior==
2f050 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
2f060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f070 2f 2a 20 4d 75 73 74 20 62 65 20 61 20 63 6f 6d  /* Must be a com
2f080 70 6f 75 6e 64 20 72 79 20 2a 2f 0a 20 20 64 6f  pound ry */.  do
2f090 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  {.    if( pSub->
2f0a0 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 70 53  op!=TK_ALL && pS
2f0b0 75 62 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74  ub->pPrior ) ret
2f0c0 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 75 73 74 20  urn 0;  /* Must 
2f0d0 62 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 2a 2f 0a  be UNION ALL */.
2f0e0 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57      if( pSub->pW
2f0f0 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
2f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f110 20 20 20 20 20 20 2f 2a 20 4e 6f 20 57 48 45 52        /* No WHER
2f120 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  E clause */.    
2f130 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61  if( pSub->selFla
2f140 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
2f150 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
2f160 20 20 2f 2a 20 4e 6f 74 20 61 6e 20 61 67 67 72    /* Not an aggr
2f170 65 67 61 74 65 20 2a 2f 0a 20 20 20 20 70 53 75  egate */.    pSu
2f180 62 20 3d 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  b = pSub->pPrior
2f190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f1b0 2a 20 52 65 70 65 61 74 20 6f 76 65 72 20 63 6f  * Repeat over co
2f1c0 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 7d 77 68 69  mpound */.  }whi
2f1d0 6c 65 28 20 70 53 75 62 20 29 3b 0a 0a 20 20 2f  le( pSub );..  /
2f1e0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
2f1f0 69 73 20 70 6f 69 6e 74 20 74 68 65 6e 20 69 74  is point then it
2f200 20 69 73 20 4f 4b 20 74 6f 20 70 65 72 66 6f 72   is OK to perfor
2f210 6d 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61  m the transforma
2f220 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62 20 3d 20  tion */..  db = 
2f230 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 43  pParse->db;.  pC
2f240 6f 75 6e 74 20 3d 20 70 45 78 70 72 3b 0a 20 20  ount = pExpr;.  
2f250 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 70 53 75  pExpr = 0;.  pSu
2f260 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
2f270 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 70 2d 3e  ].pSelect;.  p->
2f280 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
2f290 63 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ct = 0;.  sqlite
2f2a0 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
2f2b0 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70  b, p->pSrc);.  p
2f2c0 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
2f2d0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
2f2e0 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
2f2f0 2a 70 2d 3e 70 53 72 63 29 29 3b 0a 20 20 77 68  *p->pSrc));.  wh
2f300 69 6c 65 28 20 70 53 75 62 20 29 7b 0a 20 20 20  ile( pSub ){.   
2f310 20 45 78 70 72 20 2a 70 54 65 72 6d 3b 0a 20 20   Expr *pTerm;.  
2f320 20 20 70 50 72 69 6f 72 20 3d 20 70 53 75 62 2d    pPrior = pSub-
2f330 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 53 75  >pPrior;.    pSu
2f340 62 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  b->pPrior = 0;. 
2f350 20 20 20 70 53 75 62 2d 3e 70 4e 65 78 74 20 3d     pSub->pNext =
2f360 20 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 73 65   0;.    pSub->se
2f370 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67  lFlags |= SF_Agg
2f380 72 65 67 61 74 65 3b 0a 20 20 20 20 70 53 75 62  regate;.    pSub
2f390 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
2f3a0 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 20 20  F_Compound;.    
2f3b0 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
2f3c0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
2f3d0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
2f3e0 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  db, pSub->pEList
2f3f0 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70  );.    pTerm = p
2f400 50 72 69 6f 72 20 3f 20 73 71 6c 69 74 65 33 45  Prior ? sqlite3E
2f410 78 70 72 44 75 70 28 64 62 2c 20 70 43 6f 75 6e  xprDup(db, pCoun
2f420 74 2c 20 30 29 20 3a 20 70 43 6f 75 6e 74 3b 0a  t, 0) : pCount;.
2f430 20 20 20 20 70 53 75 62 2d 3e 70 45 4c 69 73 74      pSub->pEList
2f440 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
2f450 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
2f460 20 30 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20   0, pTerm);.    
2f470 70 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 50  pTerm = sqlite3P
2f480 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
2f490 53 45 4c 45 43 54 2c 20 30 2c 20 30 29 3b 0a 20  SELECT, 0, 0);. 
2f4a0 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 41     sqlite3PExprA
2f4b0 64 64 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ddSelect(pParse,
2f4c0 20 70 54 65 72 6d 2c 20 70 53 75 62 29 3b 0a 20   pTerm, pSub);. 
2f4d0 20 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20     if( pExpr==0 
2f4e0 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d  ){.      pExpr =
2f4f0 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 65 6c 73   pTerm;.    }els
2f500 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d  e{.      pExpr =
2f510 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
2f520 61 72 73 65 2c 20 54 4b 5f 50 4c 55 53 2c 20 70  arse, TK_PLUS, p
2f530 54 65 72 6d 2c 20 70 45 78 70 72 29 3b 0a 20 20  Term, pExpr);.  
2f540 20 20 7d 0a 20 20 20 20 70 53 75 62 20 3d 20 70    }.    pSub = p
2f550 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Prior;.  }.  p->
2f560 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
2f570 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 70 2d  pr = pExpr;.  p-
2f580 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
2f590 5f 41 67 67 72 65 67 61 74 65 3b 0a 0a 23 69 66  _Aggregate;..#if
2f5a0 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
2f5b0 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
2f5c0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
2f5d0 30 78 34 30 30 20 29 7b 0a 20 20 20 20 53 45 4c  0x400 ){.    SEL
2f5e0 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70  ECTTRACE(0x400,p
2f5f0 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20  Parse,p,("After 
2f600 63 6f 75 6e 74 2d 6f 66 2d 76 69 65 77 20 6f 70  count-of-view op
2f610 74 69 6d 69 7a 61 74 69 6f 6e 3a 5c 6e 22 29 29  timization:\n"))
2f620 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
2f630 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
2f640 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
2f650 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
2f660 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2f670 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49  COUNTOFVIEW_OPTI
2f680 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 74 79 70  MIZATION */..typ
2f690 65 64 65 66 20 73 74 72 75 63 74 20 57 69 6e 64  edef struct Wind
2f6a0 6f 77 52 65 77 72 69 74 65 20 57 69 6e 64 6f 77  owRewrite Window
2f6b0 52 65 77 72 69 74 65 3b 0a 73 74 72 75 63 74 20  Rewrite;.struct 
2f6c0 57 69 6e 64 6f 77 52 65 77 72 69 74 65 20 7b 0a  WindowRewrite {.
2f6d0 20 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a    Window *pWin;.
2f6e0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53 75 62    ExprList *pSub
2f6f0 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74  ;.};..static int
2f700 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
2f710 72 69 74 65 53 65 6c 65 63 74 43 62 28 57 61 6c  riteSelectCb(Wal
2f720 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
2f730 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
2f740 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
2f750 6e 65 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  ne;.}..static in
2f760 74 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65  t selectWindowRe
2f770 77 72 69 74 65 45 78 70 72 43 62 28 57 61 6c 6b  writeExprCb(Walk
2f780 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
2f790 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 74 72  r *pExpr){.  str
2f7a0 75 63 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74  uct WindowRewrit
2f7b0 65 20 2a 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  e *p = pWalker->
2f7c0 75 2e 70 52 65 77 72 69 74 65 3b 0a 20 20 50 61  u.pRewrite;.  Pa
2f7d0 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
2f7e0 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 0a  alker->pParse;..
2f7f0 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
2f800 3e 6f 70 20 29 7b 0a 0a 20 20 20 20 63 61 73 65  >op ){..    case
2f810 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20   TK_FUNCTION:.  
2f820 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
2f830 57 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Win==0 ){.      
2f840 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2f850 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 57 69  else{.        Wi
2f860 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 20 20  ndow *pWin;.    
2f870 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70 2d 3e      for(pWin=p->
2f880 70 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e  pWin; pWin; pWin
2f890 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29  =pWin->pNextWin)
2f8a0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2f8b0 70 45 78 70 72 2d 3e 70 57 69 6e 3d 3d 70 57 69  pExpr->pWin==pWi
2f8c0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
2f8d0 20 70 45 78 70 72 2d 3e 70 57 69 6e 2d 3e 70 4f   pExpr->pWin->pO
2f8e0 77 6e 65 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  wner = pExpr;.  
2f8f0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2f900 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
2f910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f920 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2f930 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 2e  /* Fall through.
2f940 20 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 54    */..    case T
2f950 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
2f960 20 20 45 78 70 72 20 2a 70 44 75 70 20 3d 20 73    Expr *pDup = s
2f970 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50  qlite3ExprDup(pP
2f980 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
2f990 20 30 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 53   0);.      p->pS
2f9a0 75 62 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ub = sqlite3Expr
2f9b0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
2f9c0 65 2c 20 70 2d 3e 70 53 75 62 2c 20 70 44 75 70  e, p->pSub, pDup
2f9d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
2f9e0 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pSub ){.        
2f9f0 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
2fa00 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2fa10 50 5f 53 74 61 74 69 63 29 3d 3d 30 20 29 3b 0a  P_Static)==0 );.
2fa20 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50          ExprSetP
2fa30 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
2fa40 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 20  P_Static);.     
2fa50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
2fa60 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
2fa70 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20   pExpr);.       
2fa80 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72   ExprClearProper
2fa90 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61  ty(pExpr, EP_Sta
2faa0 74 69 63 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  tic);.        me
2fab0 6d 73 65 74 28 70 45 78 70 72 2c 20 30 2c 20 73  mset(pExpr, 0, s
2fac0 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 0a 20  izeof(Expr));.. 
2fad0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
2fae0 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
2faf0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
2fb00 6c 75 6d 6e 20 3d 20 70 2d 3e 70 53 75 62 2d 3e  lumn = p->pSub->
2fb10 6e 45 78 70 72 2d 31 3b 0a 20 20 20 20 20 20 20  nExpr-1;.       
2fb20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
2fb30 20 70 2d 3e 70 57 69 6e 2d 3e 69 45 70 68 43 73   p->pWin->iEphCs
2fb40 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  r;.      }..    
2fb50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
2fb60 20 20 20 20 64 65 66 61 75 6c 74 3a 20 2f 2a 20      default: /* 
2fb70 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62  no-op */.      b
2fb80 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  reak;.  }..  ret
2fb90 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
2fba0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
2fbb0 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
2fbc0 69 74 65 45 4c 69 73 74 28 0a 20 20 50 61 72 73  iteEList(.  Pars
2fbd0 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 57 69  e *pParse, .  Wi
2fbe0 6e 64 6f 77 20 2a 70 57 69 6e 2c 0a 20 20 45 78  ndow *pWin,.  Ex
2fbf0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
2fc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fc10 20 52 65 77 72 69 74 65 20 65 78 70 72 65 73 73   Rewrite express
2fc20 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 6c 69 73  ions in this lis
2fc30 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
2fc40 2a 2a 70 70 53 75 62 20 20 20 20 20 20 20 20 20  **ppSub         
2fc50 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
2fc60 3a 20 53 75 62 2d 73 65 6c 65 63 74 20 65 78 70  : Sub-select exp
2fc70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 2a 2f 0a  ression-list */.
2fc80 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61 6c  ){.  Walker sWal
2fc90 6b 65 72 3b 0a 20 20 57 69 6e 64 6f 77 52 65 77  ker;.  WindowRew
2fca0 72 69 74 65 20 73 52 65 77 72 69 74 65 3b 0a 20  rite sRewrite;. 
2fcb0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 6d 65 6d 73   int rc;..  mems
2fcc0 65 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20  et(&sWalker, 0, 
2fcd0 73 69 7a 65 6f 66 28 57 61 6c 6b 65 72 29 29 3b  sizeof(Walker));
2fce0 0a 20 20 6d 65 6d 73 65 74 28 26 73 52 65 77 72  .  memset(&sRewr
2fcf0 69 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57  ite, 0, sizeof(W
2fd00 69 6e 64 6f 77 52 65 77 72 69 74 65 29 29 3b 0a  indowRewrite));.
2fd10 0a 20 20 73 52 65 77 72 69 74 65 2e 70 53 75 62  .  sRewrite.pSub
2fd20 20 3d 20 2a 70 70 53 75 62 3b 0a 20 20 73 52 65   = *ppSub;.  sRe
2fd30 77 72 69 74 65 2e 70 57 69 6e 20 3d 20 70 57 69  write.pWin = pWi
2fd40 6e 3b 0a 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50  n;..  sWalker.pP
2fd50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
2fd60 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61   sWalker.xExprCa
2fd70 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74 57  llback = selectW
2fd80 69 6e 64 6f 77 52 65 77 72 69 74 65 45 78 70 72  indowRewriteExpr
2fd90 43 62 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 53  Cb;.  sWalker.xS
2fda0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
2fdb0 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72  selectWindowRewr
2fdc0 69 74 65 53 65 6c 65 63 74 43 62 3b 0a 20 20 73  iteSelectCb;.  s
2fdd0 57 61 6c 6b 65 72 2e 75 2e 70 52 65 77 72 69 74  Walker.u.pRewrit
2fde0 65 20 3d 20 26 73 52 65 77 72 69 74 65 3b 0a 0a  e = &sRewrite;..
2fdf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
2fe00 6c 6b 45 78 70 72 4c 69 73 74 28 26 73 57 61 6c  lkExprList(&sWal
2fe10 6b 65 72 2c 20 70 45 4c 69 73 74 29 3b 0a 0a 20  ker, pEList);.. 
2fe20 20 2a 70 70 53 75 62 20 3d 20 73 52 65 77 72 69   *ppSub = sRewri
2fe30 74 65 2e 70 53 75 62 3b 0a 20 20 72 65 74 75 72  te.pSub;.  retur
2fe40 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
2fe50 45 78 70 72 4c 69 73 74 20 2a 65 78 70 72 4c 69  ExprList *exprLi
2fe60 73 74 41 70 70 65 6e 64 4c 69 73 74 28 0a 20 20  stAppendList(.  
2fe70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2fe80 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
2fe90 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
2fea0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
2feb0 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
2fec0 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70 70 65  to which to appe
2fed0 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  nd. Might be NUL
2fee0 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
2fef0 2a 70 41 70 70 65 6e 64 20 20 20 20 20 20 20 2f  *pAppend       /
2ff00 2a 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73  * List of values
2ff10 20 74 6f 20 61 70 70 65 6e 64 2e 20 4d 69 67 68   to append. Migh
2ff20 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
2ff30 20 20 69 66 28 20 70 41 70 70 65 6e 64 20 29 7b    if( pAppend ){
2ff40 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2ff50 69 6e 74 20 6e 49 6e 69 74 20 3d 20 70 4c 69 73  int nInit = pLis
2ff60 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
2ff70 20 3a 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   : 0;.    for(i=
2ff80 30 3b 20 69 3c 70 41 70 70 65 6e 64 2d 3e 6e 45  0; i<pAppend->nE
2ff90 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
2ffa0 20 45 78 70 72 20 2a 70 44 75 70 20 3d 20 73 71   Expr *pDup = sq
2ffb0 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61  lite3ExprDup(pPa
2ffc0 72 73 65 2d 3e 64 62 2c 20 70 41 70 70 65 6e 64  rse->db, pAppend
2ffd0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29  ->a[i].pExpr, 0)
2ffe0 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  ;.      pList = 
2fff0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
30000 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4c  ppend(pParse, pL
30010 69 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  ist, pDup);.    
30020 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 70 4c    if( pList ) pL
30030 69 73 74 2d 3e 61 5b 6e 49 6e 69 74 2b 69 5d 2e  ist->a[nInit+i].
30040 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 41 70 70  sortOrder = pApp
30050 65 6e 64 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  end->a[i].sortOr
30060 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  der;.    }.  }. 
30070 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
30080 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ../*.** If the S
30090 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
300a0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
300b0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 64 6f  cond argument do
300c0 65 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 0a 2a 2a  es not invoke.**
300d0 20 61 6e 79 20 53 51 4c 20 77 69 6e 64 6f 77 20   any SQL window 
300e0 66 75 6e 63 74 69 6f 6e 73 2c 20 74 68 69 73 20  functions, this 
300f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
30100 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
30110 69 74 20 0a 2a 2a 20 72 65 77 72 69 74 65 73 20  it .** rewrites 
30120 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
30130 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 69 6e  ment so that win
30140 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 78 53 74  dow function xSt
30150 65 70 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20  ep functions.** 
30160 61 72 65 20 69 6e 76 6f 6b 65 64 20 69 6e 20 74  are invoked in t
30170 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  he correct order
30180 2e 20 54 68 65 20 73 69 6d 70 6c 65 73 74 20 76  . The simplest v
30190 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a  ersion of the .*
301a0 2a 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  * transformation
301b0 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c   is:.**.**   SEL
301c0 45 43 54 20 77 69 6e 28 61 72 67 73 2e 2e 2e 29  ECT win(args...)
301d0 20 4f 56 45 52 20 28 3c 6c 69 73 74 31 3e 29 20   OVER (<list1>) 
301e0 46 52 4f 4d 20 3c 73 72 63 3e 20 4f 52 44 45 52  FROM <src> ORDER
301f0 20 42 59 20 3c 6c 69 73 74 32 3e 0a 2a 2a 0a 2a   BY <list2>.**.*
30200 2a 20 74 6f 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  * to.**.**   SEL
30210 45 43 54 20 77 69 6e 28 61 72 67 73 2e 2e 2e 29  ECT win(args...)
30220 20 46 52 4f 4d 20 28 0a 2a 2a 20 20 20 20 20 53   FROM (.**     S
30230 45 4c 45 43 54 20 61 72 67 73 2e 2e 2e 20 46 52  ELECT args... FR
30240 4f 4d 20 3c 73 72 63 3e 20 4f 52 44 45 52 20 42  OM <src> ORDER B
30250 59 20 3c 6c 69 73 74 31 3e 0a 2a 2a 20 20 20 29  Y <list1>.**   )
30260 20 4f 52 44 45 52 20 42 59 20 3c 6c 69 73 74 32   ORDER BY <list2
30270 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 3c 73  >.**.** where <s
30280 72 63 3e 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  rc> may contain 
30290 57 48 45 52 45 2c 20 47 52 4f 55 50 20 42 59 20  WHERE, GROUP BY 
302a0 61 6e 64 20 48 41 56 49 4e 47 20 63 6c 61 75 73  and HAVING claus
302b0 65 73 2c 20 61 6e 64 20 3c 6c 69 73 74 31 3e 0a  es, and <list1>.
302c0 2a 2a 20 69 73 20 74 68 65 20 63 6f 6e 63 61 74  ** is the concat
302d0 65 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50  enation of the P
302e0 41 52 54 49 54 49 4f 4e 20 42 59 20 61 6e 64 20  ARTITION BY and 
302f0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 73  ORDER BY clauses
30300 20 69 6e 20 74 68 65 0a 2a 2a 20 4f 56 45 52 20   in the.** OVER 
30310 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74  clause..**.*/.st
30320 61 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 57  atic int selectW
30330 69 6e 64 6f 77 52 65 77 72 69 74 65 28 50 61 72  indowRewrite(Par
30340 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
30350 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ct *p){.  int rc
30360 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
30370 69 66 28 20 70 2d 3e 70 57 69 6e 20 29 7b 0a 20  if( p->pWin ){. 
30380 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
30390 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
303a0 73 65 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  se);.    int i;.
303b0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
303c0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
303d0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
303e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
303f0 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
30400 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  */.    SrcList *
30410 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
30420 20 20 20 20 45 78 70 72 20 2a 70 57 68 65 72 65      Expr *pWhere
30430 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20   = p->pWhere;.  
30440 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
30450 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
30460 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 48  By;.    Expr *pH
30470 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69  aving = p->pHavi
30480 6e 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  ng;.    ExprList
30490 20 2a 70 53 6f 72 74 20 3d 20 30 3b 0a 0a 20 20   *pSort = 0;..  
304a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 53 75 62    ExprList *pSub
304b0 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  list = 0;       
304c0 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69  /* Expression li
304d0 73 74 20 66 6f 72 20 73 75 62 2d 71 75 65 72 79  st for sub-query
304e0 20 2a 2f 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a   */.    Window *
304f0 70 4d 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b  pMWin = p->pWin;
30500 20 20 20 20 20 20 2f 2a 20 4d 61 73 74 65 72 20        /* Master 
30510 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 2a 2f  window object */
30520 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69  .    Window *pWi
30530 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
30540 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20 6f 62 6a     /* Window obj
30550 65 63 74 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a  ect iterator */.
30560 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30  .    p->pSrc = 0
30570 3b 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20  ;.    p->pWhere 
30580 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f  = 0;.    p->pGro
30590 75 70 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  upBy = 0;.    p-
305a0 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 0a 20  >pHaving = 0;.. 
305b0 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 63     /* Assign a c
305c0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
305d0 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
305e0 61 62 6c 65 20 75 73 65 64 20 74 6f 20 62 75 66  able used to buf
305f0 66 65 72 20 72 6f 77 73 2e 0a 20 20 20 20 2a 2a  fer rows..    **
30600 20 54 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72   The OpenEphemer
30610 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  al instruction i
30620 73 20 63 6f 64 65 64 20 6c 61 74 65 72 2c 20 61  s coded later, a
30630 66 74 65 72 20 69 74 20 69 73 20 6b 6e 6f 77 6e  fter it is known
30640 20 68 6f 77 0a 20 20 20 20 2a 2a 20 6d 61 6e 79   how.    ** many
30650 20 63 6f 6c 75 6d 6e 73 20 74 68 65 20 74 61 62   columns the tab
30660 6c 65 20 77 69 6c 6c 20 68 61 76 65 2e 20 20 2a  le will have.  *
30670 2f 0a 20 20 20 20 70 4d 57 69 6e 2d 3e 69 45 70  /.    pMWin->iEp
30680 68 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  hCsr = pParse->n
30690 54 61 62 2b 2b 3b 0a 0a 20 20 20 20 72 63 20 3d  Tab++;..    rc =
306a0 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
306b0 72 69 74 65 45 4c 69 73 74 28 70 50 61 72 73 65  riteEList(pParse
306c0 2c 20 70 4d 57 69 6e 2c 20 70 2d 3e 70 45 4c 69  , pMWin, p->pELi
306d0 73 74 2c 20 26 70 53 75 62 6c 69 73 74 29 3b 0a  st, &pSublist);.
306e0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
306f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
30700 20 73 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77   selectWindowRew
30710 72 69 74 65 45 4c 69 73 74 28 70 50 61 72 73 65  riteEList(pParse
30720 2c 20 70 4d 57 69 6e 2c 20 70 2d 3e 70 4f 72 64  , pMWin, p->pOrd
30730 65 72 42 79 2c 20 26 70 53 75 62 6c 69 73 74 29  erBy, &pSublist)
30740 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
30750 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 4d  eturn rc;.    pM
30760 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20  Win->nBufferCol 
30770 3d 20 28 70 53 75 62 6c 69 73 74 20 3f 20 70 53  = (pSublist ? pS
30780 75 62 6c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  ublist->nExpr : 
30790 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  0);..    /* Crea
307a0 74 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  te the ORDER BY 
307b0 63 6c 61 75 73 65 20 66 6f 72 20 74 68 65 20 73  clause for the s
307c0 75 62 2d 73 65 6c 65 63 74 2e 20 54 68 69 73 20  ub-select. This 
307d0 69 73 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61  is the concatena
307e0 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 66 20 74  tion.    ** of t
307f0 68 65 20 77 69 6e 64 6f 77 20 50 41 52 54 49 54  he window PARTIT
30800 49 4f 4e 20 61 6e 64 20 4f 52 44 45 52 20 42 59  ION and ORDER BY
30810 20 63 6c 61 75 73 65 73 2e 20 41 70 70 65 6e 64   clauses. Append
30820 20 74 68 65 20 73 61 6d 65 20 0a 20 20 20 20 2a   the same .    *
30830 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f  * expressions to
30840 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
30850 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
30860 20 54 68 65 79 20 61 72 65 20 72 65 71 75 69 72   They are requir
30870 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 66 69 67  ed to.    ** fig
30880 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 62 6f  ure out where bo
30890 75 6e 64 61 72 69 65 73 20 66 6f 72 20 70 61 72  undaries for par
308a0 74 69 74 69 6f 6e 73 20 61 6e 64 20 73 65 74 73  titions and sets
308b0 20 6f 66 20 70 65 65 72 20 72 6f 77 73 2e 20 20   of peer rows.  
308c0 2a 2f 0a 20 20 20 20 70 53 6f 72 74 20 3d 20 73  */.    pSort = s
308d0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
308e0 70 28 64 62 2c 20 70 4d 57 69 6e 2d 3e 70 50 61  p(db, pMWin->pPa
308f0 72 74 69 74 69 6f 6e 2c 20 30 29 3b 0a 20 20 20  rtition, 0);.   
30900 20 69 66 28 20 70 4d 57 69 6e 2d 3e 70 4f 72 64   if( pMWin->pOrd
30910 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 70 53  erBy ){.      pS
30920 6f 72 74 20 3d 20 65 78 70 72 4c 69 73 74 41 70  ort = exprListAp
30930 70 65 6e 64 4c 69 73 74 28 70 50 61 72 73 65 2c  pendList(pParse,
30940 20 70 53 6f 72 74 2c 20 70 4d 57 69 6e 2d 3e 70   pSort, pMWin->p
30950 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a  OrderBy);.    }.
30960 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20 65      pSublist = e
30970 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69 73  xprListAppendLis
30980 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c 69  t(pParse, pSubli
30990 73 74 2c 20 70 53 6f 72 74 29 3b 0a 0a 20 20 20  st, pSort);..   
309a0 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 61   /* Append the a
309b0 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
309c0 74 6f 20 65 61 63 68 20 77 69 6e 64 6f 77 20 66  to each window f
309d0 75 6e 63 74 69 6f 6e 20 74 6f 20 74 68 65 0a 20  unction to the. 
309e0 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74     ** sub-select
309f0 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
30a00 2e 20 41 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20  . Also allocate 
30a10 74 77 6f 20 72 65 67 69 73 74 65 72 73 20 66 6f  two registers fo
30a20 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 77 69  r each.    ** wi
30a30 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 2d 20  ndow function - 
30a40 6f 6e 65 20 66 6f 72 20 74 68 65 20 61 63 63 75  one for the accu
30a50 6d 75 6c 61 74 6f 72 2c 20 61 6e 6f 74 68 65 72  mulator, another
30a60 20 66 6f 72 20 69 6e 74 65 72 69 6d 0a 20 20 20   for interim.   
30a70 20 2a 2a 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f   ** results.  */
30a80 0a 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70 4d  .    for(pWin=pM
30a90 57 69 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d  Win; pWin; pWin=
30aa0 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b  pWin->pNextWin){
30ab0 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 69 41 72  .      pWin->iAr
30ac0 67 43 6f 6c 20 3d 20 28 70 53 75 62 6c 69 73 74  gCol = (pSublist
30ad0 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78   ? pSublist->nEx
30ae0 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 70  pr : 0);.      p
30af0 53 75 62 6c 69 73 74 20 3d 20 65 78 70 72 4c 69  Sublist = exprLi
30b00 73 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61  stAppendList(pPa
30b10 72 73 65 2c 20 70 53 75 62 6c 69 73 74 2c 20 70  rse, pSublist, p
30b20 57 69 6e 2d 3e 70 4f 77 6e 65 72 2d 3e 78 2e 70  Win->pOwner->x.p
30b30 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 57 69  List);.      pWi
30b40 6e 2d 3e 72 65 67 41 63 63 75 6d 20 3d 20 2b 2b  n->regAccum = ++
30b50 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
30b60 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 52 65 73      pWin->regRes
30b70 75 6c 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ult = ++pParse->
30b80 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  nMem;.      sqli
30b90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
30ba0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 57 69   OP_Null, 0, pWi
30bb0 6e 2d 3e 72 65 67 41 63 63 75 6d 29 3b 0a 20 20  n->regAccum);.  
30bc0 20 20 7d 0a 0a 20 20 20 20 70 53 75 62 20 3d 20    }..    pSub = 
30bd0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77  sqlite3SelectNew
30be0 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
30bf0 2c 20 70 53 75 62 6c 69 73 74 2c 20 70 53 72 63  , pSublist, pSrc
30c00 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70  , pWhere, pGroup
30c10 42 79 2c 20 70 48 61 76 69 6e 67 2c 20 70 53 6f  By, pHaving, pSo
30c20 72 74 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a  rt, 0, 0.    );.
30c30 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71      p->pSrc = sq
30c40 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
30c50 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  nd(db, 0, 0, 0);
30c60 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 72 63  .    if( p->pSrc
30c70 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54   ){.      int iT
30c80 61 62 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  ab;.      ExprLi
30c90 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20  st *pList = 0;. 
30ca0 20 20 20 20 20 70 2d 3e 70 53 72 63 2d 3e 61 5b       p->pSrc->a[
30cb0 30 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 75  0].pSelect = pSu
30cc0 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
30cd0 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
30ce0 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 2d 3e  sors(pParse, p->
30cf0 70 53 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28  pSrc);.      if(
30d00 20 73 65 6c 65 63 74 45 78 70 61 6e 64 53 75 62   selectExpandSub
30d10 71 75 65 72 79 28 70 50 61 72 73 65 2c 20 26 70  query(pParse, &p
30d20 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 7b  ->pSrc->a[0]) ){
30d30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
30d40 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
30d50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30d60 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
30d70 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a  |= SF_Expanded;.
30d80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23        }.    }..#
30d90 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
30da0 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73  NABLED.    if( s
30db0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
30dc0 65 20 26 20 30 78 31 30 38 20 29 7b 0a 20 20 20  e & 0x108 ){.   
30dd0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
30de0 78 31 30 34 2c 70 50 61 72 73 65 2c 70 2c 20 28  x104,pParse,p, (
30df0 22 61 66 74 65 72 20 77 69 6e 64 6f 77 20 72 65  "after window re
30e00 77 72 69 74 65 3a 5c 6e 22 29 29 3b 0a 20 20 20  write:\n"));.   
30e10 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
30e20 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
30e30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
30e40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
30e50 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65  AddOp2(v, OP_Ope
30e60 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 4d 57 69  nEphemeral, pMWi
30e70 6e 2d 3e 69 45 70 68 43 73 72 2c 20 70 53 75 62  n->iEphCsr, pSub
30e80 6c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  list->nExpr);.  
30e90 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
30ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
30eb0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53  e code for the S
30ec0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
30ed0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61  given in the p a
30ee0 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  rgument.  .**.**
30ef0 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
30f00 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64   returned accord
30f10 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63  ing to the Selec
30f20 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e  tDest structure.
30f30 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  .** See comments
30f40 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
30f50 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f  for further info
30f60 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  rmation..**.** T
30f70 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
30f80 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
30f90 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
30fa0 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20  y errors are.** 
30fb0 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
30fc0 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
30fd0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
30fe0 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61  s left in.** pPa
30ff0 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
31000 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
31010 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74   does NOT free t
31020 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
31030 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20  ure passed in.  
31040 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66  The.** calling f
31050 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  unction needs to
31060 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74   do that..*/.int
31070 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a   sqlite3Select(.
31080 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
31090 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
310a0 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
310b0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
310c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
310d0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
310e0 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
310f0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
31100 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57  *pDest      /* W
31110 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
31120 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  he query results
31130 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
31140 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
31150 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
31160 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
31170 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  *pWInfo;     /* 
31180 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69  Return from sqli
31190 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
311a0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
311b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
311c0 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
311d0 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ne under constru
311e0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
311f0 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20  sAgg;           
31200 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65    /* True for se
31210 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20  lect lists like 
31220 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20  "count(*)" */.  
31230 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
31240 20 3d 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f   = 0;  /* List o
31250 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74  f columns to ext
31260 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69  ract. */.  SrcLi
31270 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
31280 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
31290 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72  les to select fr
312a0 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  om */.  Expr *pW
312b0 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f  here;          /
312c0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
312d0 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
312e0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
312f0 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20  pGroupBy;    /* 
31300 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
31310 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
31320 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61  L */.  Expr *pHa
31330 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  ving;         /*
31340 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75   The HAVING clau
31350 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
31360 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31   */.  int rc = 1
31370 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
31380 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
31390 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
313a0 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74  on */.  Distinct
313b0 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f  Ctx sDistinct; /
313c0 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  * Info on how to
313d0 20 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e   code the DISTIN
313e0 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20  CT keyword */.  
313f0 53 6f 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20  SortCtx sSort;  
31400 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f         /* Info o
31410 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68  n how to code th
31420 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
31430 65 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73  e */.  AggInfo s
31440 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a  AggInfo;      /*
31450 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   Information use
31460 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71  d by aggregate q
31470 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ueries */.  int 
31480 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  iEnd;           
31490 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
314a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
314b0 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
314c0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
314d0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
314e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
314f0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e    ExprList *pMin
31500 4d 61 78 4f 72 64 65 72 42 79 20 3d 20 30 3b 20  MaxOrderBy = 0; 
31510 20 2f 2a 20 41 64 64 65 64 20 4f 52 44 45 52 20   /* Added ORDER 
31520 42 59 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71  BY for min/max q
31530 75 65 72 69 65 73 20 2a 2f 0a 20 20 75 38 20 6d  ueries */.  u8 m
31540 69 6e 4d 61 78 46 6c 61 67 3b 20 20 20 20 20 20  inMaxFlag;      
31550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
31560 61 67 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71  ag for min/max q
31570 75 65 72 69 65 73 20 2a 2f 0a 0a 20 20 64 62 20  ueries */..  db 
31580 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
31590 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
315a0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
315b0 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ( p==0 || db->ma
315c0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
315d0 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
315e0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
315f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
31600 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
31610 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
31620 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
31630 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67  1;.  memset(&sAg
31640 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  gInfo, 0, sizeof
31650 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66  (sAggInfo));.#if
31660 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
31670 42 4c 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41  BLED.  SELECTTRA
31680 43 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28  CE(1,pParse,p, (
31690 22 62 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e  "begin processin
316a0 67 3a 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 61  g:\n", pParse->a
316b0 64 64 72 45 78 70 6c 61 69 6e 29 29 3b 0a 20 20  ddrExplain));.  
316c0 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
316d0 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
316e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  {.    sqlite3Tre
316f0 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
31700 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
31710 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
31720 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
31730 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
31740 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73  DistFifo );.  as
31750 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42  sert( p->pOrderB
31760 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65  y==0 || pDest->e
31770 44 65 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29  Dest!=SRT_Fifo )
31780 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
31790 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44  OrderBy==0 || pD
317a0 65 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f  est->eDest!=SRT_
317b0 44 69 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61  DistQueue );.  a
317c0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
317d0 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e  By==0 || pDest->
317e0 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65  eDest!=SRT_Queue
317f0 20 29 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61   );.  if( Ignora
31800 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
31810 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
31820 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
31830 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73  T_Exists || pDes
31840 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e  t->eDest==SRT_Un
31850 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ion || .        
31860 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
31870 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70  =SRT_Except || p
31880 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
31890 5f 44 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20  _Discard ||.    
318a0 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44         pDest->eD
318b0 65 73 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20  est==SRT_Queue  
318c0 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  || pDest->eDest=
318d0 3d 53 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c  =SRT_DistFifo ||
318e0 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
318f0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
31900 73 74 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74  stQueue || pDest
31910 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66  ->eDest==SRT_Fif
31920 6f 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52  o);.    /* If OR
31930 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20  DER BY makes no 
31940 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68  difference in th
31950 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65  e output then ne
31960 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a  ither does.    *
31970 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74  * DISTINCT so it
31980 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20   can be removed 
31990 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  too. */.    sqli
319a0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
319b0 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42  e(db, p->pOrderB
319c0 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  y);.    p->pOrde
319d0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  rBy = 0;.    p->
319e0 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
319f0 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20  Distinct;.  }.  
31a00 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
31a10 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b  p(pParse, p, 0);
31a20 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74  .  memset(&sSort
31a30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72  , 0, sizeof(sSor
31a40 74 29 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72  t));.  sSort.pOr
31a50 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
31a60 72 42 79 3b 0a 20 20 69 66 28 20 70 50 61 72 73  rBy;.  if( pPars
31a70 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
31a80 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
31a90 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
31aa0 6e 64 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  nd;.  }.  assert
31ab0 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20 29  ( p->pEList!=0 )
31ac0 3b 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e  ;.  isAgg = (p->
31ad0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
31ae0 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 23 69 66  gregate)!=0;.#if
31af0 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
31b00 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74  BLED.  if( sqlit
31b10 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
31b20 30 78 31 30 34 20 29 7b 0a 20 20 20 20 53 45 4c  0x104 ){.    SEL
31b30 45 43 54 54 52 41 43 45 28 30 78 31 30 34 2c 70  ECTTRACE(0x104,p
31b40 50 61 72 73 65 2c 70 2c 20 28 22 61 66 74 65 72  Parse,p, ("after
31b50 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
31b60 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  :\n"));.    sqli
31b70 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
31b80 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
31b90 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 44  #endif..  if( pD
31ba0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
31bb0 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65  Output ){.    ge
31bc0 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
31bd0 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
31be0 7d 0a 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73  }..  if( (rc = s
31bf0 65 6c 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69  electWindowRewri
31c00 74 65 28 70 50 61 72 73 65 2c 20 70 29 29 20 29  te(pParse, p)) )
31c10 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
31c20 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 54 61  t_end;.  }.  pTa
31c30 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
31c40 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 76 61  ..  /* Try to va
31c50 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69  rious optimizati
31c60 6f 6e 73 20 28 66 6c 61 74 74 65 6e 69 6e 67 20  ons (flattening 
31c70 73 75 62 71 75 65 72 69 65 73 2c 20 61 6e 64 20  subqueries, and 
31c80 73 74 72 65 6e 67 74 68 0a 20 20 2a 2a 20 72 65  strength.  ** re
31c90 64 75 63 74 69 6f 6e 20 6f 66 20 6a 6f 69 6e 20  duction of join 
31ca0 6f 70 65 72 61 74 6f 72 73 29 20 69 6e 20 74 68  operators) in th
31cb0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 75 70  e FROM clause up
31cc0 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 71   into the main q
31cd0 75 65 72 79 0a 20 20 2a 2f 0a 23 69 66 20 21 64  uery.  */.#if !d
31ce0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
31cf0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
31d00 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
31d10 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f 72  OMIT_VIEW).  for
31d20 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72  (i=0; !p->pPrior
31d30 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e   && i<pTabList->
31d40 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
31d50 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
31d60 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54  tem *pItem = &pT
31d70 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20  abList->a[i];.  
31d80 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
31d90 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b   pItem->pSelect;
31da0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
31db0 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
31dc0 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
31dd0 4c 45 46 54 20 4a 4f 49 4e 20 69 6e 74 6f 20 4a  LEFT JOIN into J
31de0 4f 49 4e 20 69 66 20 74 68 65 72 65 20 61 72 65  OIN if there are
31df0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 72 69   terms of the ri
31e00 67 68 74 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  ght table.    **
31e10 20 6f 66 20 74 68 65 20 4c 45 46 54 20 4a 4f 49   of the LEFT JOI
31e20 4e 20 75 73 65 64 20 69 6e 20 74 68 65 20 57 48  N used in the WH
31e30 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 20 20  ERE clause..    
31e40 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 74 65  */.    if( (pIte
31e50 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
31e60 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20 20   JT_LEFT)!=0.   
31e70 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
31e80 49 6d 70 6c 69 65 73 4e 6f 6e 4e 75 6c 6c 52 6f  ImpliesNonNullRo
31e90 77 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74  w(p->pWhere, pIt
31ea0 65 6d 2d 3e 69 43 75 72 73 6f 72 29 0a 20 20 20  em->iCursor).   
31eb0 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
31ec0 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
31ed0 49 54 45 5f 53 69 6d 70 6c 69 66 79 4a 6f 69 6e  ITE_SimplifyJoin
31ee0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 53  ).    ){.      S
31ef0 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30  ELECTTRACE(0x100
31f00 2c 70 50 61 72 73 65 2c 70 2c 0a 20 20 20 20 20  ,pParse,p,.     
31f10 20 20 20 20 20 20 20 20 20 20 20 28 22 4c 45 46             ("LEF
31f20 54 2d 4a 4f 49 4e 20 73 69 6d 70 6c 69 66 69 65  T-JOIN simplifie
31f30 73 20 74 6f 20 4a 4f 49 4e 20 6f 6e 20 74 65 72  s to JOIN on ter
31f40 6d 20 25 64 5c 6e 22 2c 69 29 29 3b 0a 20 20 20  m %d\n",i));.   
31f50 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69     pItem->fg.joi
31f60 6e 74 79 70 65 20 26 3d 20 7e 28 4a 54 5f 4c 45  ntype &= ~(JT_LE
31f70 46 54 7c 4a 54 5f 4f 55 54 45 52 29 3b 0a 20 20  FT|JT_OUTER);.  
31f80 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70      unsetJoinExp
31f90 72 28 70 2d 3e 70 57 68 65 72 65 2c 20 70 49 74  r(p->pWhere, pIt
31fa0 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
31fb0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 66    }..    /* No f
31fc0 75 74 68 65 72 20 61 63 74 69 6f 6e 20 69 66 20  uther action if 
31fd0 74 68 69 73 20 74 65 72 6d 20 6f 66 20 74 68 65  this term of the
31fe0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
31ff0 6e 6f 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f  no a subquery */
32000 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
32010 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
32020 20 20 2f 2a 20 43 61 74 63 68 20 6d 69 73 6d 61    /* Catch misma
32030 74 63 68 20 69 6e 20 74 68 65 20 64 65 63 6c 61  tch in the decla
32040 72 65 64 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 61  red columns of a
32050 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 6e 75   view and the nu
32060 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 63  mber of.    ** c
32070 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 53 45  olumns in the SE
32080 4c 45 43 54 20 6f 6e 20 74 68 65 20 52 48 53 20  LECT on the RHS 
32090 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  */.    if( pTab-
320a0 3e 6e 43 6f 6c 21 3d 70 53 75 62 2d 3e 70 45 4c  >nCol!=pSub->pEL
320b0 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
320c0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
320d0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65 78 70  Msg(pParse, "exp
320e0 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73  ected %d columns
320f0 20 66 6f 72 20 27 25 73 27 20 62 75 74 20 67 6f   for '%s' but go
32100 74 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  t %d",.         
32110 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
32120 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 7a  b->nCol, pTab->z
32130 4e 61 6d 65 2c 20 70 53 75 62 2d 3e 70 45 4c 69  Name, pSub->pELi
32140 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
32150 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
32160 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
32170 20 44 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 66   Do not try to f
32180 6c 61 74 74 65 6e 20 61 6e 20 61 67 67 72 65 67  latten an aggreg
32190 61 74 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  ate subquery..  
321a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6c 61 74    **.    ** Flat
321b0 74 65 6e 69 6e 67 20 61 6e 20 61 67 67 72 65 67  tening an aggreg
321c0 61 74 65 20 73 75 62 71 75 65 72 79 20 69 73 20  ate subquery is 
321d0 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66  only possible if
321e0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
321f0 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  .    ** is not a
32200 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66 20 74   join.  But if t
32210 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
32220 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2c 20 74 68  s not a join, th
32230 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 79 0a  en the subquery.
32240 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 69      ** will be i
32250 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
32260 63 6f 2d 72 6f 75 74 69 6e 65 20 61 6e 64 20 74  co-routine and t
32270 68 65 72 65 20 69 73 20 6e 6f 20 61 64 76 61 6e  here is no advan
32280 74 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 66  tage to.    ** f
32290 6c 61 74 74 65 6e 69 6e 67 20 69 6e 20 74 68 61  lattening in tha
322a0 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  t case..    */. 
322b0 20 20 20 69 66 28 20 28 70 53 75 62 2d 3e 73 65     if( (pSub->se
322c0 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
322d0 65 67 61 74 65 29 21 3d 30 20 29 20 63 6f 6e 74  egate)!=0 ) cont
322e0 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
322f0 28 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79  ( pSub->pGroupBy
32300 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ==0 );..    /* I
32310 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  f the outer quer
32320 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 22 63 6f  y contains a "co
32330 6d 70 6c 65 78 22 20 72 65 73 75 6c 74 20 73 65  mplex" result se
32340 74 20 28 74 68 61 74 20 69 73 2c 0a 20 20 20 20  t (that is,.    
32350 2a 2a 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  ** if the result
32360 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65   set of the oute
32370 72 20 71 75 65 72 79 20 75 73 65 73 20 66 75 6e  r query uses fun
32380 63 74 69 6f 6e 73 20 6f 72 20 73 75 62 71 75 65  ctions or subque
32390 72 69 65 73 29 0a 20 20 20 20 2a 2a 20 61 6e 64  ries).    ** and
323a0 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
323b0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 4f 52 44   contains an ORD
323c0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
323d0 20 69 66 0a 20 20 20 20 2a 2a 20 69 74 20 77 69   if.    ** it wi
323e0 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ll be implemente
323f0 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e  d as a co-routin
32400 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66  e, then do not f
32410 6c 61 74 74 65 6e 2e 20 20 54 68 69 73 0a 20 20  latten.  This.  
32420 20 20 2a 2a 20 72 65 73 74 72 69 63 74 69 6f 6e    ** restriction
32430 20 61 6c 6c 6f 77 73 20 53 51 4c 20 63 6f 6e 73   allows SQL cons
32440 74 72 75 63 74 73 20 6c 69 6b 65 20 74 68 69 73  tructs like this
32450 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
32460 20 53 45 4c 45 43 54 20 65 78 70 65 6e 73 69 76   SELECT expensiv
32470 65 5f 66 75 6e 63 74 69 6f 6e 28 78 29 0a 20 20  e_function(x).  
32480 20 20 2a 2a 20 20 20 20 46 52 4f 4d 20 28 53 45    **    FROM (SE
32490 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 20  LECT x FROM tab 
324a0 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49 54  ORDER BY y LIMIT
324b0 20 31 30 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20   10);.    **.   
324c0 20 2a 2a 20 54 68 65 20 65 78 70 65 6e 73 69 76   ** The expensiv
324d0 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73 20  e_function() is 
324e0 6f 6e 6c 79 20 63 6f 6d 70 75 74 65 64 20 6f 6e  only computed on
324f0 20 74 68 65 20 31 30 20 72 6f 77 73 20 74 68 61   the 10 rows tha
32500 74 0a 20 20 20 20 2a 2a 20 61 72 65 20 6f 75 74  t.    ** are out
32510 70 75 74 2c 20 72 61 74 68 65 72 20 74 68 61 6e  put, rather than
32520 20 65 76 65 72 79 20 72 6f 77 20 6f 66 20 74 68   every row of th
32530 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a  e table..    **.
32540 20 20 20 20 2a 2a 20 54 68 65 20 72 65 71 75 69      ** The requi
32550 72 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20  rement that the 
32560 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 76 65  outer query have
32570 20 61 20 63 6f 6d 70 6c 65 78 20 72 65 73 75 6c   a complex resul
32580 74 20 73 65 74 0a 20 20 20 20 2a 2a 20 6d 65 61  t set.    ** mea
32590 6e 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69  ns that flatteni
325a0 6e 67 20 64 6f 65 73 20 6f 63 63 75 72 20 6f 6e  ng does occur on
325b0 20 73 69 6d 70 6c 65 72 20 53 51 4c 20 63 6f 6e   simpler SQL con
325c0 73 74 72 61 69 6e 74 73 20 77 69 74 68 6f 75 74  straints without
325d0 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 78 70 65  .    ** the expe
325e0 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28 29  nsive_function()
325f0 20 6c 69 6b 65 3a 0a 20 20 20 20 2a 2a 0a 20 20   like:.    **.  
32600 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 78 20 46    **  SELECT x F
32610 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52  ROM (SELECT x FR
32620 4f 4d 20 74 61 62 20 4f 52 44 45 52 20 42 59 20  OM tab ORDER BY 
32630 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20 20  y LIMIT 10);.   
32640 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
32650 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 0a 20 20  ->pOrderBy!=0.  
32660 20 20 20 26 26 20 69 3d 3d 30 0a 20 20 20 20 20     && i==0.     
32670 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
32680 26 20 53 46 5f 43 6f 6d 70 6c 65 78 52 65 73 75  & SF_ComplexResu
32690 6c 74 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  lt)!=0.     && (
326a0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
326b0 31 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70  1.         || (p
326c0 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67  TabList->a[1].fg
326d0 2e 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45  .jointype&(JT_LE
326e0 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
326f0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63  ).    ){.      c
32700 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
32710 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53      if( flattenS
32720 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20  ubquery(pParse, 
32730 70 2c 20 69 2c 20 69 73 41 67 67 29 20 29 7b 0a  p, i, isAgg) ){.
32740 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75        /* This su
32750 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62  bquery can be ab
32760 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20  sorbed into its 
32770 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  parent. */.     
32780 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20   i = -1;.    }. 
32790 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
327a0 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 64  >pSrc;.    if( d
327b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
327c0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
327d0 64 3b 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f  d;.    if( !Igno
327e0 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65  rableOrderby(pDe
327f0 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73 53 6f  st) ){.      sSo
32800 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  rt.pOrderBy = p-
32810 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d  >pOrderBy;.    }
32820 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
32830 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32840 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
32850 0a 20 20 2f 2a 20 48 61 6e 64 6c 65 20 63 6f 6d  .  /* Handle com
32860 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
32870 74 65 6d 65 6e 74 73 20 75 73 69 6e 67 20 74 68  tements using th
32880 65 20 73 65 70 61 72 61 74 65 20 6d 75 6c 74 69  e separate multi
32890 53 65 6c 65 63 74 28 29 0a 20 20 2a 2a 20 70 72  Select().  ** pr
328a0 6f 63 65 64 75 72 65 2e 0a 20 20 2a 2f 0a 20 20  ocedure..  */.  
328b0 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
328c0 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53  .    rc = multiS
328d0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
328e0 20 70 44 65 73 74 29 3b 0a 23 69 66 20 53 45 4c   pDest);.#if SEL
328f0 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
32900 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45  .    SELECTTRACE
32910 28 30 78 31 2c 70 50 61 72 73 65 2c 70 2c 28 22  (0x1,pParse,p,("
32920 65 6e 64 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c  end compound-sel
32930 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 5c 6e  ect processing\n
32940 22 29 29 3b 0a 20 20 20 20 69 66 28 20 28 73 71  "));.    if( (sq
32950 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
32960 20 26 20 30 78 32 30 30 30 29 21 3d 30 20 26 26   & 0x2000)!=0 &&
32970 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
32980 6e 50 61 72 65 6e 74 28 70 50 61 72 73 65 29 3d  nParent(pParse)=
32990 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
329a0 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
329b0 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  t(0, p, 0);.    
329c0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
329d0 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 20 45   p->pNext==0 ) E
329e0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50  xplainQueryPlanP
329f0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  op(pParse);.    
32a00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
32a10 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 6f 72 20  endif..  /* For 
32a20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65  each term in the
32a30 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 64 6f   FROM clause, do
32a40 20 74 77 6f 20 74 68 69 6e 67 73 3a 0a 20 20 2a   two things:.  *
32a50 2a 20 28 31 29 20 41 75 74 68 6f 72 69 7a 65 64  * (1) Authorized
32a60 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 74 61   unreferenced ta
32a70 62 6c 65 73 0a 20 20 2a 2a 20 28 32 29 20 47 65  bles.  ** (2) Ge
32a80 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
32a90 61 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 0a  all sub-queries.
32aa0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
32ab0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
32ac0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
32ad0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
32ae0 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
32af0 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65  st->a[i];.    Se
32b00 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
32b10 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b     Select *pSub;
32b20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
32b30 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
32b40 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
32b50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
32b60 29 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ).    const char
32b70 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74   *zSavedAuthCont
32b80 65 78 74 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  ext;.#endif..   
32b90 20 2f 2a 20 49 73 73 75 65 20 53 51 4c 49 54 45   /* Issue SQLITE
32ba0 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a 61 74  _READ authorizat
32bb0 69 6f 6e 73 20 77 69 74 68 20 61 20 66 61 6b 65  ions with a fake
32bc0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 66 6f 72   column name for
32bd0 20 61 6e 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c   any.    ** tabl
32be0 65 73 20 74 68 61 74 20 61 72 65 20 72 65 66 65  es that are refe
32bf0 72 65 6e 63 65 64 20 62 75 74 20 66 72 6f 6d 20  renced but from 
32c00 77 68 69 63 68 20 6e 6f 20 76 61 6c 75 65 73 20  which no values 
32c10 61 72 65 20 65 78 74 72 61 63 74 65 64 2e 0a 20  are extracted.. 
32c20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f     ** Examples o
32c30 66 20 77 68 65 72 65 20 74 68 65 73 65 20 6b 69  f where these ki
32c40 6e 64 73 20 6f 66 20 6e 75 6c 6c 20 53 51 4c 49  nds of null SQLI
32c50 54 45 5f 52 45 41 44 20 61 75 74 68 6f 72 69 7a  TE_READ authoriz
32c60 61 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 77 6f  ations.    ** wo
32c70 75 6c 64 20 6f 63 63 75 72 3a 0a 20 20 20 20 2a  uld occur:.    *
32c80 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c  *.    **     SEL
32c90 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
32ca0 4d 20 74 31 3b 20 20 20 2d 2d 20 53 51 4c 49 54  M t1;   -- SQLIT
32cb0 45 5f 52 45 41 44 20 74 31 2e 22 22 0a 20 20 20  E_READ t1."".   
32cc0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 74   **     SELECT t
32cd0 31 2e 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 3b  1.* FROM t1, t2;
32ce0 20 20 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41     -- SQLITE_REA
32cf0 44 20 74 32 2e 22 22 0a 20 20 20 20 2a 2a 0a 20  D t2."".    **. 
32d00 20 20 20 2a 2a 20 54 68 65 20 66 61 6b 65 20 63     ** The fake c
32d10 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 61 6e  olumn name is an
32d20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 20   empty string.  
32d30 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  It is possible f
32d40 6f 72 20 61 20 74 61 62 6c 65 20 74 6f 0a 20 20  or a table to.  
32d50 20 20 2a 2a 20 68 61 76 65 20 61 20 63 6f 6c 75    ** have a colu
32d60 6d 6e 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20  mn named by the 
32d70 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 69 6e  empty string, in
32d80 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 72   which case ther
32d90 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 0a 20  e is no way to. 
32da0 20 20 20 2a 2a 20 64 69 73 74 69 6e 67 75 69 73     ** distinguis
32db0 68 20 62 65 74 77 65 65 6e 20 61 6e 20 75 6e 72  h between an unr
32dc0 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20  eferenced table 
32dd0 61 6e 64 20 61 6e 20 61 63 74 75 61 6c 20 72 65  and an actual re
32de0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 0a 20  ference to the. 
32df0 20 20 20 2a 2a 20 22 22 20 63 6f 6c 75 6d 6e 2e     ** "" column.
32e00 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
32e10 73 69 67 6e 20 77 61 73 20 66 6f 72 20 74 68 65  sign was for the
32e20 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d   fake column nam
32e30 65 20 74 6f 20 62 65 20 61 20 4e 55 4c 4c 2c 0a  e to be a NULL,.
32e40 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f 75      ** which wou
32e50 6c 64 20 62 65 20 75 6e 61 6d 62 69 67 75 6f 75  ld be unambiguou
32e60 73 2e 20 20 42 75 74 20 6c 65 67 61 63 79 20 61  s.  But legacy a
32e70 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c  uthorization cal
32e80 6c 62 61 63 6b 73 20 6d 69 67 68 74 0a 20 20 20  lbacks might.   
32e90 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 65 20 63   ** assume the c
32ea0 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6e 6f  olumn name is no
32eb0 6e 2d 4e 55 4c 4c 20 61 6e 64 20 73 65 67 66 61  n-NULL and segfa
32ec0 75 6c 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66  ult.  The use of
32ed0 20 61 6e 20 65 6d 70 74 79 0a 20 20 20 20 2a 2a   an empty.    **
32ee0 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20   string for the 
32ef0 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  fake column name
32f00 20 73 65 65 6d 73 20 73 61 66 65 72 2e 0a 20 20   seems safer..  
32f10 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74    */.    if( pIt
32f20 65 6d 2d 3e 63 6f 6c 55 73 65 64 3d 3d 30 20 29  em->colUsed==0 )
32f30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41  {.      sqlite3A
32f40 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
32f50 20 53 51 4c 49 54 45 5f 52 45 41 44 2c 20 70 49   SQLITE_READ, pI
32f60 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 22 22 2c 20  tem->zName, "", 
32f70 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
32f80 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64  );.    }..#if !d
32f90 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
32fa0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
32fb0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
32fc0 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20 2f  OMIT_VIEW).    /
32fd0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
32fe0 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
32ff0 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
33000 63 6c 61 75 73 65 0a 20 20 20 20 2a 2f 0a 20 20  clause.    */.  
33010 20 20 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e    pSub = pItem->
33020 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 66 28  pSelect;.    if(
33030 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69   pSub==0 ) conti
33040 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d  nue;..    /* Som
33050 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65 20  etimes the code 
33060 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20 77  for a subquery w
33070 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64  ill be generated
33080 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 2a   more than.    *
33090 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20 73  * once, if the s
330a0 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74 20  ubquery is part 
330b0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
330c0 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f  use in a LEFT JO
330d0 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65  IN,.    ** for e
330e0 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61 74  xample.  In that
330f0 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65   case, do not re
33100 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  generate the cod
33110 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20  e to manifest.  
33120 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20 74    ** a view or t
33130 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f  he co-routine to
33140 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69 65   implement a vie
33150 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69 6e  w.  The first in
33160 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73  stance.    ** is
33170 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68 6f   sufficient, tho
33180 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74 69  ugh the subrouti
33190 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20 74  ne to manifest t
331a0 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65 65  he view does nee
331b0 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69  d.    ** to be i
331c0 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f  nvoked again. */
331d0 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
331e0 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20  addrFillSub ){. 
331f0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
33200 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d  fg.viaCoroutine=
33210 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
33220 20 54 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   The subroutine 
33230 74 68 61 74 20 6d 61 6e 69 66 65 73 74 73 20 74  that manifests t
33240 68 65 20 76 69 65 77 20 6d 69 67 68 74 20 62 65  he view might be
33250 20 61 20 6f 6e 65 2d 74 69 6d 65 20 72 6f 75 74   a one-time rout
33260 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ine,.        ** 
33270 6f 72 20 69 74 20 6d 69 67 68 74 20 6e 65 65 64  or it might need
33280 20 74 6f 20 62 65 20 72 65 72 75 6e 20 6f 6e 20   to be rerun on 
33290 65 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 62  each iteration b
332a0 65 63 61 75 73 65 20 69 74 0a 20 20 20 20 20 20  ecause it.      
332b0 20 20 2a 2a 20 65 6e 63 6f 64 65 73 20 61 20 63    ** encodes a c
332c0 6f 72 72 65 6c 61 74 65 64 20 73 75 62 71 75 65  orrelated subque
332d0 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 74  ry. */.        t
332e0 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
332f0 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 49 74  VdbeGetOp(v, pIt
33300 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
33310 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4f 6e 63  ->opcode==OP_Onc
33320 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  e );.        sql
33330 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
33340 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65  , OP_Gosub, pIte
33350 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49  m->regReturn, pI
33360 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
33370 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
33380 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
33390 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  ..    /* Increme
333a0 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74  nt Parse.nHeight
333b0 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f   by the height o
333c0 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78  f the largest ex
333d0 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
333e0 74 72 65 65 20 72 65 66 65 72 72 65 64 20 74 6f  tree referred to
333f0 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61   by this, the pa
33400 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65  rent select. The
33410 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20   child select.  
33420 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e    ** may contain
33430 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
33440 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20  s of at most.   
33450 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f   ** (SQLITE_MAX_
33460 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65  EXPR_DEPTH-Parse
33470 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74  .nHeight) height
33480 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a  . This is a bit.
33490 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73      ** more cons
334a0 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65  ervative than ne
334b0 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63  cessary, but muc
334c0 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e  h easier than en
334d0 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61  forcing.    ** a
334e0 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20  n exact limit.. 
334f0 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65     */.    pParse
33500 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c  ->nHeight += sql
33510 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
33520 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  ight(p);..    /*
33530 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20   Make copies of 
33540 63 6f 6e 73 74 61 6e 74 20 57 48 45 52 45 2d 63  constant WHERE-c
33550 6c 61 75 73 65 20 74 65 72 6d 73 20 69 6e 20 74  lause terms in t
33560 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
33570 6f 77 6e 0a 20 20 20 20 2a 2a 20 69 6e 73 69 64  own.    ** insid
33580 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20  e the subquery. 
33590 20 54 68 69 73 20 63 61 6e 20 68 65 6c 70 20 74   This can help t
335a0 68 65 20 73 75 62 71 75 65 72 79 20 74 6f 20 72  he subquery to r
335b0 75 6e 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  un more efficien
335c0 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tly..    */.    
335d0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
335e0 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
335f0 54 45 5f 50 75 73 68 44 6f 77 6e 29 0a 20 20 20  TE_PushDown).   
33600 20 20 26 26 20 70 75 73 68 44 6f 77 6e 57 68 65    && pushDownWhe
33610 72 65 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20  reTerms(pParse, 
33620 70 53 75 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c  pSub, p->pWhere,
33630 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c   pItem->iCursor,
33640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33650 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49 74              (pIt
33660 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  em->fg.jointype 
33670 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 29 0a  & JT_OUTER)!=0).
33680 20 20 20 20 29 7b 0a 23 69 66 20 53 45 4c 45 43      ){.#if SELEC
33690 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
336a0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
336b0 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30 78  SelectTrace & 0x
336c0 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 53  100 ){.        S
336d0 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30 30  ELECTTRACE(0x100
336e0 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74 65  ,pParse,p,("Afte
336f0 72 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 70  r WHERE-clause p
33700 75 73 68 2d 64 6f 77 6e 3a 5c 6e 22 29 29 3b 0a  ush-down:\n"));.
33710 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
33720 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c  reeViewSelect(0,
33730 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   p, 0);.      }.
33740 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
33750 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  {.      SELECTTR
33760 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
33770 2c 70 2c 28 22 50 75 73 68 2d 64 6f 77 6e 20 6e  ,p,("Push-down n
33780 6f 74 20 70 6f 73 73 69 62 6c 65 5c 6e 22 29 29  ot possible\n"))
33790 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7a 53 61  ;.    }..    zSa
337a0 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
337b0 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
337c0 6e 74 65 78 74 3b 0a 20 20 20 20 70 50 61 72 73  ntext;.    pPars
337d0 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
337e0 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  = pItem->zName;.
337f0 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
33800 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65   code to impleme
33810 6e 74 20 74 68 65 20 73 75 62 71 75 65 72 79 0a  nt the subquery.
33820 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
33830 65 20 73 75 62 71 75 65 72 79 20 69 73 20 69 6d  e subquery is im
33840 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 63  plemented as a c
33850 6f 2d 72 6f 75 74 69 6e 65 20 69 66 20 74 68 65  o-routine if the
33860 20 73 75 62 71 75 65 72 79 20 69 73 0a 20 20 20   subquery is.   
33870 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74   ** guaranteed t
33880 6f 20 62 65 20 74 68 65 20 6f 75 74 65 72 20 6c  o be the outer l
33890 6f 6f 70 20 28 73 6f 20 74 68 61 74 20 69 74 20  oop (so that it 
338a0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
338b0 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 75   be.    ** compu
338c0 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ted more than on
338d0 63 65 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ce).    **.    *
338e0 2a 20 54 4f 44 4f 3a 20 41 72 65 20 74 68 65 72  * TODO: Are ther
338f0 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 73 20  e other reasons 
33900 62 65 73 69 64 65 20 28 31 29 20 74 6f 20 75 73  beside (1) to us
33910 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 20  e a co-routine. 
33920 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61     ** implementa
33930 74 69 6f 6e 3f 0a 20 20 20 20 2a 2f 0a 20 20 20  tion?.    */.   
33940 20 69 66 28 20 69 3d 3d 30 0a 20 20 20 20 20 26   if( i==0.     &
33950 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  & (pTabList->nSr
33960 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 20 20  c==1.           
33970 20 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61   || (pTabList->a
33980 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26  [1].fg.jointype&
33990 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
339a0 53 29 29 21 3d 30 29 20 20 2f 2a 20 28 31 29 20  S))!=0)  /* (1) 
339b0 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  */.    ){.      
339c0 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63  /* Implement a c
339d0 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  o-routine that w
339e0 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e  ill return a sin
339f0 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
33a00 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
33a10 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63  et on each invoc
33a20 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ation..      */.
33a30 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f        int addrTo
33a40 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
33a50 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 3b  urrentAddr(v)+1;
33a60 0a 20 20 20 20 20 0a 20 20 20 20 20 20 70 49 74  .     .      pIt
33a70 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20  em->regReturn = 
33a80 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
33a90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33aa0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
33ab0 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74  itCoroutine, pIt
33ac0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30  em->regReturn, 0
33ad0 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20  , addrTop);.    
33ae0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
33af0 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  , "%s", pItem->p
33b00 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
33b10 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46      pItem->addrF
33b20 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70  illSub = addrTop
33b30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
33b40 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
33b50 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  est, SRT_Corouti
33b60 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ne, pItem->regRe
33b70 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 45 78 70  turn);.      Exp
33b80 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70  lainQueryPlan((p
33b90 50 61 72 73 65 2c 20 31 2c 20 22 43 4f 2d 52 4f  Parse, 1, "CO-RO
33ba0 55 54 49 4e 45 20 30 78 25 70 22 2c 20 70 53 75  UTINE 0x%p", pSu
33bb0 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b));.      sqlit
33bc0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
33bd0 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
33be0 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62       pItem->pTab
33bf0 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 70  ->nRowLogEst = p
33c00 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  Sub->nSelectRow;
33c10 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67  .      pItem->fg
33c20 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20  .viaCoroutine = 
33c30 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  1;.      pItem->
33c40 72 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74  regResult = dest
33c50 2e 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71  .iSdst;.      sq
33c60 6c 69 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f  lite3VdbeEndCoro
33c70 75 74 69 6e 65 28 76 2c 20 70 49 74 65 6d 2d 3e  utine(v, pItem->
33c80 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
33c90 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
33ca0 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
33cb0 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
33cc0 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
33cd0 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  che(pParse);.   
33ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
33cf0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
33d00 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
33d10 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72   fill an ephemer
33d20 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20  al table with.  
33d30 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65      ** the conte
33d40 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62 71 75  nt of this subqu
33d50 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64  ery.  pItem->add
33d60 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f  rFillSub will po
33d70 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  int.      ** to 
33d80 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
33d90 68 65 20 67 65 6e 65 72 61 74 65 64 20 73 75 62  he generated sub
33da0 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d  routine.  pItem-
33db0 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20  >regReturn.     
33dc0 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74 65   ** is a registe
33dd0 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  r allocated to h
33de0 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74 69  old the subrouti
33df0 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  ne return addres
33e00 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  s.      */.     
33e10 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20   int topAddr;.  
33e20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72      int onceAddr
33e30 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
33e40 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20 73  retAddr;.      s
33e50 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
33e60 65 6d 20 2a 70 50 72 69 6f 72 3b 0a 0a 20 20 20  em *pPrior;..   
33e70 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
33e80 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30  ->addrFillSub==0
33e90 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   );.      pItem-
33ea0 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
33eb0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
33ec0 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71 6c     topAddr = sql
33ed0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
33ee0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
33ef0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
33f00 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  n);.      pItem-
33f10 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 74  >addrFillSub = t
33f20 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20 20  opAddr+1;.      
33f30 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
33f40 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b  Correlated==0 ){
33f50 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
33f60 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e  he subquery is n
33f70 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e  ot correlated an
33f80 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  d if we are not 
33f90 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20  inside of.      
33fa0 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20    ** a trigger, 
33fb0 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65  then we only nee
33fc0 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
33fd0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75   value of the su
33fe0 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a  bquery.        *
33ff0 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20  * once. */.     
34000 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71     onceAddr = sq
34010 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
34020 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56 64 62  v, OP_Once); Vdb
34030 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
34040 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
34050 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69  t((v, "materiali
34060 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65  ze \"%s\"", pIte
34070 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
34080 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
34090 20 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43         VdbeNoopC
340a0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65  omment((v, "mate
340b0 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c  rialize \"%s\"",
340c0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
340d0 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ame));.      }. 
340e0 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 69 73       pPrior = is
340f0 53 65 6c 66 4a 6f 69 6e 56 69 65 77 28 70 54 61  SelfJoinView(pTa
34100 62 4c 69 73 74 2c 20 70 49 74 65 6d 29 3b 0a 20  bList, pItem);. 
34110 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20       if( pPrior 
34120 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
34130 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
34140 4f 50 5f 4f 70 65 6e 44 75 70 2c 20 70 49 74 65  OP_OpenDup, pIte
34150 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 69  m->iCursor, pPri
34160 6f 72 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  or->iCursor);.  
34170 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
34180 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30  rior->pSelect!=0
34190 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53 75 62   );.        pSub
341a0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70  ->nSelectRow = p
341b0 50 72 69 6f 72 2d 3e 70 53 65 6c 65 63 74 2d 3e  Prior->pSelect->
341c0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
341d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
341e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
341f0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
34200 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65  T_EphemTab, pIte
34210 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
34220 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65 72       ExplainQuer
34230 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20 31  yPlan((pParse, 1
34240 2c 20 22 4d 41 54 45 52 49 41 4c 49 5a 45 20 30  , "MATERIALIZE 0
34250 78 25 70 22 2c 20 70 53 75 62 29 29 3b 0a 20 20  x%p", pSub));.  
34260 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
34270 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ect(pParse, pSub
34280 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
34290 7d 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  }.      pItem->p
342a0 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
342b0 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52  = pSub->nSelectR
342c0 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e  ow;.      if( on
342d0 63 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33  ceAddr ) sqlite3
342e0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
342f0 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20  onceAddr);.     
34300 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74   retAddr = sqlit
34310 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
34320 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d  OP_Return, pItem
34330 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
34340 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
34350 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49  (v, "end %s", pI
34360 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
34370 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
34380 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
34390 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64   topAddr, retAdd
343a0 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
343b0 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
343c0 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  he(pParse);.    
343d0 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
343e0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
343f0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
34400 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
34410 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t -= sqlite3Sele
34420 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
34430 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  .    pParse->zAu
34440 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
34450 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 23  edAuthContext;.#
34460 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
34470 56 61 72 69 6f 75 73 20 65 6c 65 6d 65 6e 74 73  Various elements
34480 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 63   of the SELECT c
34490 6f 70 69 65 64 20 69 6e 74 6f 20 6c 6f 63 61 6c  opied into local
344a0 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72 0a 20   variables for. 
344b0 20 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20   ** convenience 
344c0 2a 2f 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  */.  pEList = p-
344d0 3e 70 45 4c 69 73 74 3b 0a 20 20 70 57 68 65 72  >pEList;.  pWher
344e0 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a 20  e = p->pWhere;. 
344f0 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
34500 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76 69  GroupBy;.  pHavi
34510 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
34520 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  .  sDistinct.isT
34530 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  nct = (p->selFla
34540 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
34550 29 21 3d 30 3b 0a 0a 23 69 66 20 53 45 4c 45 43  )!=0;..#if SELEC
34560 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
34570 20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65   if( sqlite3Sele
34580 63 74 54 72 61 63 65 20 26 20 30 78 34 30 30 20  ctTrace & 0x400 
34590 29 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41  ){.    SELECTTRA
345a0 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c  CE(0x400,pParse,
345b0 70 2c 28 22 41 66 74 65 72 20 61 6c 6c 20 46 52  p,("After all FR
345c0 4f 4d 2d 63 6c 61 75 73 65 20 61 6e 61 6c 79 73  OM-clause analys
345d0 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73 71  is:\n"));.    sq
345e0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
345f0 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
34600 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
34610 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f 46 56   SQLITE_COUNTOFV
34620 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IEW_OPTIMIZATION
34630 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74  .  if( Optimizat
34640 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
34650 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74  QLITE_QueryFlatt
34660 65 6e 65 72 7c 53 51 4c 49 54 45 5f 43 6f 75 6e  ener|SQLITE_Coun
34670 74 4f 66 56 69 65 77 29 0a 20 20 20 26 26 20 63  tOfView).   && c
34680 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d 69  ountOfViewOptimi
34690 7a 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  zation(pParse, p
346a0 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 64  ).  ){.    if( d
346b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
346c0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
346d0 64 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  d;.    pEList = 
346e0 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 70  p->pEList;.    p
346f0 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
34700 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  c;.  }.#endif.. 
34710 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
34720 20 69 73 20 44 49 53 54 49 4e 43 54 20 77 69 74   is DISTINCT wit
34730 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75  h an ORDER BY bu
34740 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  t is not an aggr
34750 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a  egate, and .  **
34760 20 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c   if the select-l
34770 69 73 74 20 69 73 20 74 68 65 20 73 61 6d 65 20  ist is the same 
34780 61 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  as the ORDER BY 
34790 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20  list, then this 
347a0 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62  query.  ** can b
347b0 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61  e rewritten as a
347c0 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74   GROUP BY. In ot
347d0 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a  her words, this:
347e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
347f0 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78  ELECT DISTINCT x
34800 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45  yz FROM ... ORDE
34810 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  R BY xyz.  **.  
34820 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65  ** is transforme
34830 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  d to:.  **.  ** 
34840 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46      SELECT xyz F
34850 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59  ROM ... GROUP BY
34860 20 78 79 7a 20 4f 52 44 45 52 20 42 59 20 78 79   xyz ORDER BY xy
34870 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  z.  **.  ** The 
34880 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70  second form is p
34890 72 65 66 65 72 72 65 64 20 61 73 20 61 20 73 69  referred as a si
348a0 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74  ngle index (or t
348b0 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62  emp-table) may b
348c0 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72  e .  ** used for
348d0 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20   both the ORDER 
348e0 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20  BY and DISTINCT 
348f0 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f  processing. As o
34900 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20  riginally .  ** 
34910 77 72 69 74 74 65 6e 20 74 68 65 20 71 75 65 72  written the quer
34920 79 20 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d  y must use a tem
34930 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c  p-table for at l
34940 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  east one of the 
34950 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61  ORDER .  ** BY a
34960 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64  nd DISTINCT, and
34970 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70   an index or sep
34980 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65  arate temp-table
34990 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a   for the other..
349a0 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73    */.  if( (p->s
349b0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
349c0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
349d0 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e  ate))==SF_Distin
349e0 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65  ct .   && sqlite
349f0 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65  3ExprListCompare
34a00 28 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c  (sSort.pOrderBy,
34a10 20 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a   pEList, -1)==0.
34a20 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46    ){.    p->selF
34a30 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
34a40 69 6e 63 74 3b 0a 20 20 20 20 70 47 72 6f 75 70  inct;.    pGroup
34a50 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
34a60 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
34a70 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  stDup(db, pEList
34a80 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74  , 0);.    /* Not
34a90 69 63 65 20 74 68 61 74 20 65 76 65 6e 20 74 68  ice that even th
34aa0 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e 63  ought SF_Distinc
34ab0 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72  t has been clear
34ac0 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c  ed from p->selFl
34ad0 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20  ags,.    ** the 
34ae0 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
34af0 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20 20   is still set.  
34b00 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72 65  Hence, isTnct re
34b10 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20 20  presents the.   
34b20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65 74   ** original set
34b30 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f 44  ting of the SF_D
34b40 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f  istinct flag, no
34b50 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  t the current se
34b60 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73  tting */.    ass
34b70 65 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e 69  ert( sDistinct.i
34b80 73 54 6e 63 74 20 29 3b 0a 0a 23 69 66 20 53 45  sTnct );..#if SE
34b90 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
34ba0 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
34bb0 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
34bc0 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 53 45  x400 ){.      SE
34bd0 4c 45 43 54 54 52 41 43 45 28 30 78 34 30 30 2c  LECTTRACE(0x400,
34be0 70 50 61 72 73 65 2c 70 2c 28 22 54 72 61 6e 73  pParse,p,("Trans
34bf0 66 6f 72 6d 20 44 49 53 54 49 4e 43 54 20 69 6e  form DISTINCT in
34c00 74 6f 20 47 52 4f 55 50 20 42 59 3a 5c 6e 22 29  to GROUP BY:\n")
34c10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
34c20 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
34c30 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  , p, 0);.    }.#
34c40 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
34c50 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
34c60 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
34c70 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 20 65  then create an e
34c80 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 74  phemeral index t
34c90 6f 0a 20 20 2a 2a 20 64 6f 20 74 68 65 20 73 6f  o.  ** do the so
34ca0 72 74 69 6e 67 2e 20 20 42 75 74 20 74 68 69 73  rting.  But this
34cb0 20 73 6f 72 74 69 6e 67 20 65 70 68 65 6d 65 72   sorting ephemer
34cc0 61 6c 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65  al index might e
34cd0 6e 64 20 75 70 0a 20 20 2a 2a 20 62 65 69 6e 67  nd up.  ** being
34ce0 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64   unused if the d
34cf0 61 74 61 20 63 61 6e 20 62 65 20 65 78 74 72 61  ata can be extra
34d00 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74  cted in pre-sort
34d10 65 64 20 6f 72 64 65 72 2e 0a 20 20 2a 2a 20 49  ed order..  ** I
34d20 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
34d30 73 65 2c 20 74 68 65 6e 20 74 68 65 20 4f 50 5f  se, then the OP_
34d40 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
34d50 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62  struction will b
34d60 65 0a 20 20 2a 2a 20 63 68 61 6e 67 65 64 20 74  e.  ** changed t
34d70 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63  o an OP_Noop onc
34d80 65 20 77 65 20 66 69 67 75 72 65 20 6f 75 74 20  e we figure out 
34d90 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67  that the sorting
34da0 20 69 6e 64 65 78 20 69 73 0a 20 20 2a 2a 20 6e   index is.  ** n
34db0 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20  ot needed.  The 
34dc0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
34dd0 64 65 78 20 76 61 72 69 61 62 6c 65 20 69 73 20  dex variable is 
34de0 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61  used to facilita
34df0 74 65 0a 20 20 2a 2a 20 74 68 61 74 20 63 68 61  te.  ** that cha
34e00 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
34e10 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 29  sSort.pOrderBy )
34e20 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
34e30 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65  KeyInfo;.    pKe
34e40 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  yInfo = sqlite3K
34e50 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
34e60 73 74 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  st(.        pPar
34e70 73 65 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72  se, sSort.pOrder
34e80 42 79 2c 20 30 2c 20 70 45 4c 69 73 74 2d 3e 6e  By, 0, pEList->n
34e90 45 78 70 72 29 3b 0a 20 20 20 20 73 53 6f 72 74  Expr);.    sSort
34ea0 2e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72  .iECursor = pPar
34eb0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
34ec0 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e  sSort.addrSortIn
34ed0 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  dex =.      sqli
34ee0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
34ef0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
34f00 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 73 53 6f  l,.          sSo
34f10 72 74 2e 69 45 43 75 72 73 6f 72 2c 20 73 53 6f  rt.iECursor, sSo
34f20 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  rt.pOrderBy->nEx
34f30 70 72 2b 31 2b 70 45 4c 69 73 74 2d 3e 6e 45 78  pr+1+pEList->nEx
34f40 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  pr, 0,.         
34f50 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
34f60 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 0a 20 20 20  , P4_KEYINFO.   
34f70 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
34f80 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72     sSort.addrSor
34f90 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d  tIndex = -1;.  }
34fa0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 75  ..  /* If the ou
34fb0 74 70 75 74 20 69 73 20 64 65 73 74 69 6e 65 64  tput is destined
34fc0 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   for a temporary
34fd0 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61   table, open tha
34fe0 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  t table..  */.  
34ff0 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  if( pDest->eDest
35000 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
35010 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
35020 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
35030 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70 44 65  enEphemeral, pDe
35040 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c  st->iSDParm, pEL
35050 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d  ist->nExpr);.  }
35060 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6c  ..  /* Set the l
35070 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  imiter..  */.  i
35080 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
35090 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
350a0 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
350b0 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d 69  s & SF_FixedLimi
350c0 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  t)==0 ){.    p->
350d0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 33 32 30  nSelectRow = 320
350e0 3b 20 20 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20  ;  /* 4 billion 
350f0 72 6f 77 73 20 2a 2f 0a 20 20 7d 0a 20 20 63 6f  rows */.  }.  co
35100 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
35110 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
35120 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  End);.  if( p->i
35130 4c 69 6d 69 74 3d 3d 30 20 26 26 20 73 53 6f 72  Limit==0 && sSor
35140 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  t.addrSortIndex>
35150 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
35160 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64  3VdbeChangeOpcod
35170 65 28 76 2c 20 73 53 6f 72 74 2e 61 64 64 72 53  e(v, sSort.addrS
35180 6f 72 74 49 6e 64 65 78 2c 20 4f 50 5f 53 6f 72  ortIndex, OP_Sor
35190 74 65 72 4f 70 65 6e 29 3b 0a 20 20 20 20 73 53  terOpen);.    sS
351a0 6f 72 74 2e 73 6f 72 74 46 6c 61 67 73 20 7c 3d  ort.sortFlags |=
351b0 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
351c0 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  ter;.  }..  /* O
351d0 70 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  pen an ephemeral
351e0 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f   index to use fo
351f0 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
35200 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
35210 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
35220 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
35230 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63  sDistinct.tabTnc
35240 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
35250 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  ++;.    sDistinc
35260 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c  t.addrTnct = sql
35270 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
35280 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
35290 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
352a0 20 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74             sDist
352b0 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c  inct.tabTnct, 0,
352c0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
352d0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
352e0 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
352f0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
35300 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30  rse, p->pEList,0
35310 2c 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,0),.           
35320 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b              P4_K
35330 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c  EYINFO);.    sql
35340 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
35350 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  (v, BTREE_UNORDE
35360 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69  RED);.    sDisti
35370 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
35380 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
35390 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73  NORDERED;.  }els
353a0 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  e{.    sDistinct
353b0 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45  .eTnctType = WHE
353c0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
353d0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73  ;.  }..  if( !is
353e0 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d  Agg && pGroupBy=
353f0 3d 30 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77  =0 ){.    Window
35400 20 2a 70 57 69 6e 20 3d 20 70 2d 3e 70 57 69 6e   *pWin = p->pWin
35410 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73 74 65 72  ;      /* Master
35420 20 77 69 6e 64 6f 77 20 6f 62 6a 65 63 74 20 28   window object (
35430 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 0a 20 20 20  or NULL) */..   
35440 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65   /* No aggregate
35450 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e   functions and n
35460 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  o GROUP BY claus
35470 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74  e */.    u16 wct
35480 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74  rlFlags = (sDist
35490 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48  inct.isTnct ? WH
354a0 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43  ERE_WANT_DISTINC
354b0 54 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65  T : 0);.    asse
354c0 72 74 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49  rt( WHERE_USE_LI
354d0 4d 49 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d  MIT==SF_FixedLim
354e0 69 74 20 29 3b 0a 20 20 20 20 77 63 74 72 6c 46  it );.    wctrlF
354f0 6c 61 67 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c  lags |= p->selFl
35500 61 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69  ags & SF_FixedLi
35510 6d 69 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 57  mit;..    if( pW
35520 69 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  in ){.      sqli
35530 74 65 33 57 69 6e 64 6f 77 43 6f 64 65 49 6e 69  te3WindowCodeIni
35540 74 28 70 50 61 72 73 65 2c 20 70 57 69 6e 29 3b  t(pParse, pWin);
35550 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42  .    }..    /* B
35560 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  egin the databas
35570 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 53  e scan. */.    S
35580 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
35590 72 73 65 2c 70 2c 28 22 57 68 65 72 65 42 65 67  rse,p,("WhereBeg
355a0 69 6e 5c 6e 22 29 29 3b 0a 20 20 20 20 70 57 49  in\n"));.    pWI
355b0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
355c0 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
355d0 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
355e0 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
355f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35610 20 70 2d 3e 70 45 4c 69 73 74 2c 20 77 63 74 72   p->pEList, wctr
35620 6c 46 6c 61 67 73 2c 20 70 2d 3e 6e 53 65 6c 65  lFlags, p->nSele
35630 63 74 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20  ctRow);.    if( 
35640 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
35650 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
35660 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
35670 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28  eOutputRowCount(
35680 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65  pWInfo) < p->nSe
35690 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20  lectRow ){.     
356a0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
356b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
356c0 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e  putRowCount(pWIn
356d0 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  fo);.    }.    i
356e0 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  f( sDistinct.isT
356f0 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68  nct && sqlite3Wh
35700 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57  ereIsDistinct(pW
35710 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73  Info) ){.      s
35720 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
35730 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  pe = sqlite3Wher
35740 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e  eIsDistinct(pWIn
35750 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  fo);.    }.    i
35760 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42  f( sSort.pOrderB
35770 79 20 29 7b 0a 20 20 20 20 20 20 73 53 6f 72 74  y ){.      sSort
35780 2e 6e 4f 42 53 61 74 20 3d 20 73 71 6c 69 74 65  .nOBSat = sqlite
35790 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
357a0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  pWInfo);.      s
357b0 53 6f 72 74 2e 62 4f 72 64 65 72 65 64 49 6e 6e  Sort.bOrderedInn
357c0 65 72 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  erLoop = sqlite3
357d0 57 68 65 72 65 4f 72 64 65 72 65 64 49 6e 6e 65  WhereOrderedInne
357e0 72 4c 6f 6f 70 28 70 57 49 6e 66 6f 29 3b 0a 20  rLoop(pWInfo);. 
357f0 20 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 6e       if( sSort.n
35800 4f 42 53 61 74 3d 3d 73 53 6f 72 74 2e 70 4f 72  OBSat==sSort.pOr
35810 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
35820 20 20 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f          sSort.pO
35830 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
35840 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
35850 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64  * If sorting ind
35860 65 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61  ex that was crea
35870 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f  ted by a prior O
35880 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
35890 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  .    ** instruct
358a0 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74  ion ended up not
358b0 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74   being needed, t
358c0 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f  hen change the O
358d0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a  P_OpenEphemeral.
358e0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f      ** into an O
358f0 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  P_Noop..    */. 
35900 20 20 20 69 66 28 20 73 53 6f 72 74 2e 61 64 64     if( sSort.add
35910 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26  rSortIndex>=0 &&
35920 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 3d   sSort.pOrderBy=
35930 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
35940 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
35950 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64  oop(v, sSort.add
35960 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20  rSortIndex);.   
35970 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
35980 70 2d 3e 70 45 4c 69 73 74 3d 3d 70 45 4c 69 73  p->pEList==pELis
35990 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57 69  t );.    if( pWi
359a0 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  n ){.      int a
359b0 64 64 72 47 6f 73 75 62 20 3d 20 73 71 6c 69 74  ddrGosub = sqlit
359c0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
359d0 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65  v);.      int re
359e0 67 47 6f 73 75 62 20 3d 20 2b 2b 70 50 61 72 73  gGosub = ++pPars
359f0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69  e->nMem;.      i
35a00 6e 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20  nt addr = 0;.   
35a10 20 20 20 69 6e 74 20 62 4c 6f 6f 70 20 3d 20 30     int bLoop = 0
35a20 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ;..      sqlite3
35a30 57 69 6e 64 6f 77 43 6f 64 65 53 74 65 70 28 70  WindowCodeStep(p
35a40 50 61 72 73 65 2c 20 70 2c 20 70 57 49 6e 66 6f  Parse, p, pWInfo
35a50 2c 20 72 65 67 47 6f 73 75 62 2c 20 61 64 64 72  , regGosub, addr
35a60 47 6f 73 75 62 2c 20 26 62 4c 6f 6f 70 29 3b 0a  Gosub, &bLoop);.
35a70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
35a80 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
35a90 6f 74 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oto);.      sqli
35aa0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
35ab0 62 65 6c 28 76 2c 20 61 64 64 72 47 6f 73 75 62  bel(v, addrGosub
35ac0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4c 6f  );.      if( bLo
35ad0 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 61 64  op ){.        ad
35ae0 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
35af0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77  AddOp1(v, OP_Rew
35b00 69 6e 64 2c 20 70 57 69 6e 2d 3e 69 45 70 68 43  ind, pWin->iEphC
35b10 73 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sr);.      }else
35b20 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  {.        addr =
35b30 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
35b40 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
35b50 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74    }.      select
35b60 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
35b70 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c  , p, -1, &sSort,
35b80 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65   &sDistinct, pDe
35b90 73 74 2c 20 61 64 64 72 2b 31 2c 20 30 29 3b 0a  st, addr+1, 0);.
35ba0 20 20 20 20 20 20 69 66 28 20 62 4c 6f 6f 70 20        if( bLoop 
35bb0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
35bc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
35bd0 4f 50 5f 4e 65 78 74 2c 20 70 57 69 6e 2d 3e 69  OP_Next, pWin->i
35be0 45 70 68 43 73 72 2c 20 61 64 64 72 2b 31 29 3b  EphCsr, addr+1);
35bf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35c00 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
35c10 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
35c20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
35c30 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
35c40 75 72 6e 2c 20 72 65 67 47 6f 73 75 62 29 3b 0a  urn, regGosub);.
35c50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35c60 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
35c70 72 2d 31 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f  r-1);       /* O
35c80 50 5f 47 6f 74 6f 20 6a 75 6d 70 73 20 68 65 72  P_Goto jumps her
35c90 65 20 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73 65 7b  e */..    }else{
35ca0 0a 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68  .      /* Use th
35cb0 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72  e standard inner
35cc0 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 20 20   loop. */.      
35cd0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
35ce0 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26  pParse, p, -1, &
35cf0 73 53 6f 72 74 2c 20 26 73 44 69 73 74 69 6e 63  sSort, &sDistinc
35d00 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  t, pDest,.      
35d10 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
35d20 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57  ContinueLabel(pW
35d30 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  Info),.         
35d40 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
35d50 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29  akLabel(pWInfo))
35d60 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;..      /* End 
35d70 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61  the database sca
35d80 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f  n loop..      */
35d90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68  .      sqlite3Wh
35da0 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a  ereEnd(pWInfo);.
35db0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
35dc0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
35dd0 77 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74  when there exist
35de0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
35df0 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50 20  ions or a GROUP 
35e00 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a  BY clause.    **
35e10 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20   or both */.    
35e20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
35e30 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
35e40 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ext for processi
35e50 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66  ng aggregate inf
35e60 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
35e70 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20  int iAMem;      
35e80 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
35e90 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f   address for sto
35ea0 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f  ring current GRO
35eb0 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
35ec0 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iBMem;         
35ed0 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
35ee0 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f  dress for previo
35ef0 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  us GROUP BY */. 
35f00 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b     int iUseFlag;
35f10 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64         /* Mem ad
35f20 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c  dress holding fl
35f30 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  ag indicating th
35f40 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20  at at least.    
35f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f60 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f      ** one row o
35f70 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74  f the input to t
35f80 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61  he aggregator ha
35f90 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20  s been.         
35fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
35fb0 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  * processed */. 
35fc0 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61     int iAbortFla
35fd0 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64  g;     /* Mem ad
35fe0 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73  dress which caus
35ff0 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69  es query abort i
36000 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20  f positive */.  
36010 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72    int groupBySor
36020 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f  t;    /* Rows co
36030 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69  me from source i
36040 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
36050 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
36060 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  End;        /* E
36070 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67  nd of processing
36080 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54   for this SELECT
36090 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74   */.    int sort
360a0 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50  PTab = 0;   /* P
360b0 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20  seudotable used 
360c0 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e  to decode sortin
360d0 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20  g results */.   
360e0 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30   int sortOut = 0
360f0 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72  ;    /* Output r
36100 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65  egister from the
36110 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69   sorter */.    i
36120 6e 74 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20  nt orderByGrp = 
36130 30 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68  0; /* True if th
36140 65 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 4f  e GROUP BY and O
36150 52 44 45 52 20 42 59 20 61 72 65 20 74 68 65 20  RDER BY are the 
36160 73 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  same */..    /* 
36170 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61  Remove any and a
36180 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77 65  ll aliases betwe
36190 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  en the result se
361a0 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  t and the.    **
361b0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
361c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
361d0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
361e0 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20     int k;       
361f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36200 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
36210 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
36220 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
36230 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c  pItem;  /* For l
36240 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72  ooping over expr
36250 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74  ession in a list
36260 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b   */..      for(k
36270 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
36280 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69  r, pItem=p->pELi
36290 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c  st->a; k>0; k--,
362a0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
362b0 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41     pItem->u.x.iA
362c0 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lias = 0;.      
362d0 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47  }.      for(k=pG
362e0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70  roupBy->nExpr, p
362f0 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61  Item=pGroupBy->a
36300 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65  ; k>0; k--, pIte
36310 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49  m++){.        pI
36320 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20  tem->u.x.iAlias 
36330 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
36340 20 20 20 61 73 73 65 72 74 28 20 36 36 3d 3d 73     assert( 66==s
36350 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30  qlite3LogEst(100
36360 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
36370 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 36 36 20  ->nSelectRow>66 
36380 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
36390 3d 20 36 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = 66;.    }else{
363a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
363b0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
363c0 31 29 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  1) );.      p->n
363d0 53 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20  SelectRow = 0;. 
363e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
363f0 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20  there is both a 
36400 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20  GROUP BY and an 
36410 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
36420 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20 20  and they are.   
36430 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74   ** identical, t
36440 68 65 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f  hen it may be po
36450 73 73 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c  ssible to disabl
36460 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
36470 6c 61 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e  lause .    ** on
36480 20 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61   the grounds tha
36490 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 77  t the GROUP BY w
364a0 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e  ill cause elemen
364b0 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a  ts to come out .
364c0 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f      ** in the co
364d0 72 72 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20  rrect order. It 
364e0 61 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74  also may not - t
364f0 68 65 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68  he GROUP BY migh
36500 74 20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 64  t use a.    ** d
36510 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 74 68  atabase index th
36520 61 74 20 63 61 75 73 65 73 20 72 6f 77 73 20 74  at causes rows t
36530 6f 20 62 65 20 67 72 6f 75 70 65 64 20 74 6f 67  o be grouped tog
36540 65 74 68 65 72 20 61 73 20 72 65 71 75 69 72 65  ether as require
36550 64 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74  d.    ** but not
36560 20 61 63 74 75 61 6c 6c 79 20 73 6f 72 74 65 64   actually sorted
36570 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 72 65  . Either way, re
36580 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
36590 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52  at the.    ** OR
365a0 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50  DER BY and GROUP
365b0 20 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20   BY clauses are 
365c0 74 68 65 20 73 61 6d 65 20 62 79 20 73 65 74 74  the same by sett
365d0 69 6e 67 20 74 68 65 20 6f 72 64 65 72 42 79 47  ing the orderByG
365e0 72 70 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  rp.    ** variab
365f0 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  le.  */.    if( 
36600 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
36610 6f 6d 70 61 72 65 28 70 47 72 6f 75 70 42 79 2c  ompare(pGroupBy,
36620 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c   sSort.pOrderBy,
36630 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   -1)==0 ){.     
36640 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31 3b   orderByGrp = 1;
36650 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20  .    }. .    /* 
36660 43 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74  Create a label t
36670 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77  o jump to when w
36680 65 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20  e want to abort 
36690 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  the query */.   
366a0 20 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74   addrEnd = sqlit
366b0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
366c0 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76  v);..    /* Conv
366d0 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f  ert TK_COLUMN no
366e0 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f  des into TK_AGG_
366f0 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20  COLUMN and make 
36700 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a  entries in.    *
36710 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61  * sAggInfo for a
36720 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  ll TK_AGG_FUNCTI
36730 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72  ON nodes in expr
36740 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20  essions of the. 
36750 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61     ** SELECT sta
36760 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  tement..    */. 
36770 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
36780 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
36790 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20  .    sNC.pParse 
367a0 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e  = pParse;.    sN
367b0 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61  C.pSrcList = pTa
367c0 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 75  bList;.    sNC.u
367d0 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73  NC.pAggInfo = &s
367e0 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 56 56 41  AggInfo;.    VVA
367f0 5f 4f 4e 4c 59 28 20 73 4e 43 2e 6e 63 46 6c 61  _ONLY( sNC.ncFla
36800 67 73 20 3d 20 4e 43 5f 55 41 67 67 49 6e 66 6f  gs = NC_UAggInfo
36810 3b 20 29 0a 20 20 20 20 73 41 67 67 49 6e 66 6f  ; ).    sAggInfo
36820 2e 6d 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d  .mnReg = pParse-
36830 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67  >nMem+1;.    sAg
36840 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
36850 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20  lumn = pGroupBy 
36860 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  ? pGroupBy->nExp
36870 72 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49  r : 0;.    sAggI
36880 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70  nfo.pGroupBy = p
36890 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c  GroupBy;.    sql
368a0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
368b0 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c  ggList(&sNC, pEL
368c0 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
368d0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
368e0 69 73 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e  ist(&sNC, sSort.
368f0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69  pOrderBy);.    i
36900 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
36910 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
36920 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
36930 72 74 28 20 70 57 68 65 72 65 3d 3d 70 2d 3e 70  rt( pWhere==p->p
36940 57 68 65 72 65 20 29 3b 0a 20 20 20 20 20 20 20  Where );.       
36950 20 61 73 73 65 72 74 28 20 70 48 61 76 69 6e 67   assert( pHaving
36960 3d 3d 70 2d 3e 70 48 61 76 69 6e 67 20 29 3b 0a  ==p->pHaving );.
36970 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
36980 70 47 72 6f 75 70 42 79 3d 3d 70 2d 3e 70 47 72  pGroupBy==p->pGr
36990 6f 75 70 42 79 20 29 3b 0a 20 20 20 20 20 20 20  oupBy );.       
369a0 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28 70   havingToWhere(p
369b0 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20  Parse, p);.     
369c0 20 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70     pWhere = p->p
369d0 57 68 65 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20  Where;.      }. 
369e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
369f0 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
36a00 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29  s(&sNC, pHaving)
36a10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67  ;.    }.    sAgg
36a20 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f  Info.nAccumulato
36a30 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f  r = sAggInfo.nCo
36a40 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d  lumn;.    if( p-
36a50 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 26 26 20  >pGroupBy==0 && 
36a60 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 26 26  p->pHaving==0 &&
36a70 20 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3d   sAggInfo.nFunc=
36a80 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 69 6e 4d  =1 ){.      minM
36a90 61 78 46 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51  axFlag = minMaxQ
36aa0 75 65 72 79 28 64 62 2c 20 73 41 67 67 49 6e 66  uery(db, sAggInf
36ab0 6f 2e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72  o.aFunc[0].pExpr
36ac0 2c 20 26 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42  , &pMinMaxOrderB
36ad0 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  y);.    }else{. 
36ae0 20 20 20 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20       minMaxFlag 
36af0 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
36b00 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20 20  NORMAL;.    }.  
36b10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
36b20 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b  gInfo.nFunc; i++
36b30 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
36b40 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
36b50 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  y(sAggInfo.aFunc
36b60 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49  [i].pExpr, EP_xI
36b70 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
36b80 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d    sNC.ncFlags |=
36b90 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20   NC_InAggFunc;. 
36ba0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
36bb0 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
36bc0 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  sNC, sAggInfo.aF
36bd0 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e  unc[i].pExpr->x.
36be0 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e  pList);.      sN
36bf0 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43  C.ncFlags &= ~NC
36c00 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20  _InAggFunc;.    
36c10 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d  }.    sAggInfo.m
36c20 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xReg = pParse->n
36c30 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  Mem;.    if( db-
36c40 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
36c50 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
36c60 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
36c70 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28  _ENABLED.    if(
36c80 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72   sqlite3SelectTr
36c90 61 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20  ace & 0x400 ){. 
36ca0 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
36cb0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
36cc0 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x400,pParse,p,("
36cd0 41 66 74 65 72 20 61 67 67 72 65 67 61 74 65 20  After aggregate 
36ce0 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a  analysis:\n"));.
36cf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
36d00 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
36d10 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , 0);.      for(
36d20 69 69 3d 30 3b 20 69 69 3c 73 41 67 67 49 6e 66  ii=0; ii<sAggInf
36d30 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29  o.nColumn; ii++)
36d40 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
36d50 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 61 67  3DebugPrintf("ag
36d60 67 2d 63 6f 6c 75 6d 6e 5b 25 64 5d 20 69 4d 65  g-column[%d] iMe
36d70 6d 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  m=%d\n",.       
36d80 20 20 20 20 20 69 69 2c 20 73 41 67 67 49 6e 66       ii, sAggInf
36d90 6f 2e 61 43 6f 6c 5b 69 69 5d 2e 69 4d 65 6d 29  o.aCol[ii].iMem)
36da0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
36db0 33 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c  3TreeViewExpr(0,
36dc0 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69   sAggInfo.aCol[i
36dd0 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  i].pExpr, 0);.  
36de0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
36df0 69 69 3d 30 3b 20 69 69 3c 73 41 67 67 49 6e 66  ii=0; ii<sAggInf
36e00 6f 2e 6e 46 75 6e 63 3b 20 69 69 2b 2b 29 7b 0a  o.nFunc; ii++){.
36e10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
36e20 65 62 75 67 50 72 69 6e 74 66 28 22 61 67 67 2d  ebugPrintf("agg-
36e30 66 75 6e 63 5b 25 64 5d 3a 20 69 4d 65 6d 3d 25  func[%d]: iMem=%
36e40 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
36e50 20 20 69 69 2c 20 73 41 67 67 49 6e 66 6f 2e 61    ii, sAggInfo.a
36e60 46 75 6e 63 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a  Func[ii].iMem);.
36e70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54          sqlite3T
36e80 72 65 65 56 69 65 77 45 78 70 72 28 30 2c 20 73  reeViewExpr(0, s
36e90 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69  AggInfo.aFunc[ii
36ea0 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
36eb0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
36ec0 66 0a 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65  f...    /* Proce
36ed0 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  ssing for aggreg
36ee0 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20  ates with GROUP 
36ef0 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65  BY is very diffe
36f00 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20  rent and.    ** 
36f10 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  much more comple
36f20 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65  x than aggregate
36f30 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55  s without a GROU
36f40 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  P BY..    */.   
36f50 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
36f60 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
36f70 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65  pKeyInfo;  /* Ke
36f80 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ying information
36f90 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62   for the group b
36fa0 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  y clause */.    
36fb0 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
36fc0 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20        /* A-vs-B 
36fd0 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70  comparision jump
36fe0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
36ff0 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a  drOutputRow;  /*
37000 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75   Start of subrou
37010 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
37020 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a  s a result row *
37030 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f  /.      int regO
37040 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52  utputRow;   /* R
37050 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
37060 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75  gister for outpu
37070 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  t subroutine */.
37080 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65        int addrSe
37090 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74  tAbort;   /* Set
370a0 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20   the abort flag 
370b0 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
370c0 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f      int addrTopO
370d0 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f  fLoop;  /* Top o
370e0 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70  f the input loop
370f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
37100 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a  drSortingIdx; /*
37110 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
37120 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f  meral for the so
37130 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  rting index */. 
37140 20 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73       int addrRes
37150 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72  et;      /* Subr
37160 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74  outine for reset
37170 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c  ting the accumul
37180 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ator */.      in
37190 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20  t regReset;     
371a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72    /* Return addr
371b0 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
371c0 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e   reset subroutin
371d0 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49  e */..      /* I
371e0 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f  f there is a GRO
371f0 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20  UP BY clause we 
37200 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72  might need a sor
37210 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20  ting index to.  
37220 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74      ** implement
37230 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74   it.  Allocate t
37240 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  hat sorting inde
37250 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75  x now.  If it tu
37260 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a  rns out.      **
37270 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
37280 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c  need it after al
37290 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72  l, the OP_Sorter
372a0 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  Open instruction
372b0 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  .      ** will b
372c0 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
372d0 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20   a Noop.  .     
372e0 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e   */.      sAggIn
372f0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20  fo.sortingIdx = 
37300 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
37310 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
37320 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 46   sqlite3KeyInfoF
37330 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
37340 73 65 2c 70 47 72 6f 75 70 42 79 2c 30 2c 73 41  se,pGroupBy,0,sA
37350 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b  ggInfo.nColumn);
37360 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74 69  .      addrSorti
37370 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33 56  ngIdx = sqlite3V
37380 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
37390 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20 20  SorterOpen, .   
373a0 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
373b0 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67 67  sortingIdx, sAgg
373c0 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
373d0 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  umn, .          
373e0 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  0, (char*)pKeyIn
373f0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
37400 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69  ..      /* Initi
37410 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63  alize memory loc
37420 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47  ations used by G
37430 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74  ROUP BY aggregat
37440 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20  e processing.   
37450 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65     */.      iUse
37460 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d  Flag = ++pParse-
37470 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62  >nMem;.      iAb
37480 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  ortFlag = ++pPar
37490 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
374a0 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b  regOutputRow = +
374b0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
374c0 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
374d0 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ow = sqlite3Vdbe
374e0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
374f0 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b      regReset = +
37500 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
37510 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d       addrReset =
37520 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
37530 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
37540 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  iAMem = pParse->
37550 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20  nMem + 1;.      
37560 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
37570 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
37580 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70  .      iBMem = p
37590 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
375a0 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
375b0 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
375c0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >nExpr;.      sq
375d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
375e0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
375f0 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20  , iAbortFlag);. 
37600 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
37610 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72  ((v, "clear abor
37620 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
37630 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37640 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
37650 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 0, iUseFlag);.
37660 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
37670 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
37680 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74  accumulator empt
37690 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  y"));.      sqli
376a0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
376b0 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d   OP_Null, 0, iAM
376c0 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70  em, iAMem+pGroup
376d0 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20  By->nExpr-1);.. 
376e0 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20       /* Begin a 
376f0 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65  loop that will e
37700 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63  xtract all sourc
37710 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20  e rows in GROUP 
37720 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20  BY order..      
37730 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e  ** This might in
37740 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61  volve two separa
37750 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e  te loops with an
37760 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77   OP_Sort in betw
37770 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a  een, or.      **
37780 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73   it might be a s
37790 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20  ingle loop that 
377a0 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f  uses an index to
377b0 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61   extract informa
377c0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tion.      ** in
377d0 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72   the right order
377e0 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a   to begin with..
377f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
37800 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
37810 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
37820 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65  gReset, addrRese
37830 74 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  t);.      SELECT
37840 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
37850 2c 28 22 57 68 65 72 65 42 65 67 69 6e 5c 6e 22  ,("WhereBegin\n"
37860 29 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f  ));.      pWInfo
37870 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42   = sqlite3WhereB
37880 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61  egin(pParse, pTa
37890 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70  bList, pWhere, p
378a0 47 72 6f 75 70 42 79 2c 20 30 2c 0a 20 20 20 20  GroupBy, 0,.    
378b0 20 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55        WHERE_GROU
378c0 50 42 59 20 7c 20 28 6f 72 64 65 72 42 79 47 72  PBY | (orderByGr
378d0 70 20 3f 20 57 48 45 52 45 5f 53 4f 52 54 42 59  p ? WHERE_SORTBY
378e0 47 52 4f 55 50 20 3a 20 30 29 2c 20 30 0a 20 20  GROUP : 0), 0.  
378f0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28      );.      if(
37900 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
37910 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
37920 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
37930 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
37940 49 6e 66 6f 29 3d 3d 70 47 72 6f 75 70 42 79 2d  Info)==pGroupBy-
37950 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
37960 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a    /* The optimiz
37970 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65  er is able to de
37980 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72  liver rows in gr
37990 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a  oup by order so.
379a0 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f          ** we do
379b0 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72   not have to sor
379c0 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45  t.  The OP_OpenE
379d0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
379e0 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
379f0 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65  * cancelled late
37a00 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69  r because we sti
37a10 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74  ll need to use t
37a20 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20  he pKeyInfo.    
37a30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67      */.        g
37a40 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a  roupBySort = 0;.
37a50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
37a60 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65       /* Rows are
37a70 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75   coming out in u
37a80 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65  ndetermined orde
37a90 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70  r.  We have to p
37aa0 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  ush.        ** e
37ab0 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73  ach row into a s
37ac0 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65  orting index, te
37ad0 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73  rminate the firs
37ae0 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  t loop,.        
37af0 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65  ** then loop ove
37b00 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
37b10 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  dex in order to 
37b20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20  get the output. 
37b30 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72         ** in sor
37b40 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ted order.      
37b50 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
37b60 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
37b70 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
37b80 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
37b90 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  l;.        int n
37ba0 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20  GroupBy;..      
37bb0 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
37bc0 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  le(pParse, .    
37bd0 20 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e          (sDistin
37be0 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d  ct.isTnct && (p-
37bf0 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73  >selFlags&SF_Dis
37c00 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20  tinct)==0) ?.   
37c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c20 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47   "DISTINCT" : "G
37c30 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20  ROUP BY");..    
37c40 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
37c50 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72  = 1;.        nGr
37c60 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
37c70 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
37c80 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79   nCol = nGroupBy
37c90 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
37ca0 72 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20  roupBy;.        
37cb0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
37cc0 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
37cd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
37ce0 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69   sAggInfo.aCol[i
37cf0 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e  ].iSorterColumn>
37d00 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
37d10 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20    nCol++;.      
37d20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
37d30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
37d40 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65  .        regBase
37d50 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
37d60 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
37d70 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
37d80 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
37d90 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
37da0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
37db0 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
37dc0 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72  rse, pGroupBy, r
37dd0 65 67 42 61 73 65 2c 20 30 2c 20 30 29 3b 0a 20  egBase, 0, 0);. 
37de0 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
37df0 70 42 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  pBy;.        for
37e00 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
37e10 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
37e20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
37e30 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
37e40 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61  ol = &sAggInfo.a
37e50 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Col[i];.        
37e60 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72    if( pCol->iSor
37e70 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
37e80 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
37e90 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65  r1 = j + regBase
37ea0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
37eb0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
37ec0 43 6f 6c 75 6d 6e 54 6f 52 65 67 28 70 50 61 72  ColumnToReg(pPar
37ed0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
37ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ef0 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20      pCol->pTab, 
37f00 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  pCol->iColumn, p
37f10 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 29  Col->iTable, r1)
37f20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  ;.            j+
37f30 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
37f40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
37f50 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
37f60 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
37f70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
37f80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
37f90 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
37fa0 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  rd, regBase, nCo
37fb0 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  l, regRecord);. 
37fc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
37fd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
37fe0 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67  orterInsert, sAg
37ff0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
38000 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
38010 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
38020 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
38030 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
38040 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
38050 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
38060 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
38070 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
38080 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
38090 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
380a0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
380b0 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50  gIdxPTab = sortP
380c0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
380d0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f  ab++;.        so
380e0 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47  rtOut = sqlite3G
380f0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
38100 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
38110 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
38120 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73  OP_OpenPseudo, s
38130 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74  ortPTab, sortOut
38140 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
38150 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
38160 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
38170 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
38180 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
38190 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  d);.        Vdbe
381a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f  Comment((v, "GRO
381b0 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 20 56  UP BY sort")); V
381c0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
381d0 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
381e0 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d  .useSortingIdx =
381f0 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
38200 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
38210 72 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  r(pParse);..    
38220 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
38230 20 74 68 65 20 69 6e 64 65 78 20 6f 72 20 74 65   the index or te
38240 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 75 73  mporary table us
38250 65 64 20 62 79 20 74 68 65 20 47 52 4f 55 50 20  ed by the GROUP 
38260 42 59 20 73 6f 72 74 0a 20 20 20 20 20 20 2a 2a  BY sort.      **
38270 20 77 69 6c 6c 20 6e 61 74 75 72 61 6c 6c 79 20   will naturally 
38280 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20  deliver rows in 
38290 74 68 65 20 6f 72 64 65 72 20 72 65 71 75 69 72  the order requir
382a0 65 64 20 62 79 20 74 68 65 20 4f 52 44 45 52 20  ed by the ORDER 
382b0 42 59 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61 75  BY.      ** clau
382c0 73 65 2c 20 63 61 6e 63 65 6c 20 74 68 65 20 65  se, cancel the e
382d0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 6f  phemeral table o
382e0 70 65 6e 20 63 6f 64 65 64 20 65 61 72 6c 69 65  pen coded earlie
382f0 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
38300 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20    ** This is an 
38310 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74  optimization - t
38320 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
38330 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20  r should result 
38340 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20  regardless..    
38350 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c    ** Use the SQL
38360 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72  ITE_GroupByOrder
38370 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54   flag with SQLIT
38380 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM