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

Artifact 0b9d051a0b97d9ae20947e74f341dde248f15bbfda1834932b3d21097f4e080c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75 74 70  /*.** Trace outp
0210: 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23 69 66  ut macros.*/.#if
0220: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
0230: 42 4c 45 44 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73  BLED./***/ int s
0240: 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
0250: 65 20 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20  e = 0;.# define 
0260: 53 45 4c 45 43 54 54 52 41 43 45 28 4b 2c 50 2c  SELECTTRACE(K,P,
0270: 53 2c 58 29 20 20 5c 0a 20 20 69 66 28 73 71 6c  S,X)  \.  if(sql
0280: 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 26  ite3SelectTrace&
0290: 28 4b 29 29 20 20 20 5c 0a 20 20 20 20 73 71 6c  (K))   \.    sql
02a0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
02b0: 22 25 73 2f 25 64 2f 25 70 3a 20 22 2c 28 53 29  "%s/%d/%p: ",(S)
02c0: 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 28 50 29 2d 3e  ->zSelName,(P)->
02d0: 61 64 64 72 45 78 70 6c 61 69 6e 2c 28 53 29 29  addrExplain,(S))
02e0: 2c 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ,\.    sqlite3De
02f0: 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65 6c 73  bugPrintf X.#els
0300: 65 0a 23 20 64 65 66 69 6e 65 20 53 45 4c 45 43  e.# define SELEC
0310: 54 54 52 41 43 45 28 4b 2c 50 2c 53 2c 58 29 0a  TTRACE(K,P,S,X).
0320: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
0330: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0340: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65  e following obje
0350: 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  ct is used to re
0360: 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  cord information
0370: 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f   about.** how to
0380: 20 70 72 6f 63 65 73 73 20 74 68 65 20 44 49 53   process the DIS
0390: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 2c 20 74  TINCT keyword, t
03a0: 6f 20 73 69 6d 70 6c 69 66 79 20 70 61 73 73 69  o simplify passi
03b0: 6e 67 20 74 68 61 74 20 69 6e 66 6f 72 6d 61 74  ng that informat
03c0: 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  ion.** into the 
03d0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
03e0: 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79  ) routine..*/.ty
03f0: 70 65 64 65 66 20 73 74 72 75 63 74 20 44 69 73  pedef struct Dis
0400: 74 69 6e 63 74 43 74 78 20 44 69 73 74 69 6e 63  tinctCtx Distinc
0410: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 44 69 73  tCtx;.struct Dis
0420: 74 69 6e 63 74 43 74 78 20 7b 0a 20 20 75 38 20  tinctCtx {.  u8 
0430: 69 73 54 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20  isTnct;      /* 
0440: 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
0450: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
0460: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20  present */.  u8 
0470: 65 54 6e 63 74 54 79 70 65 3b 20 20 20 2f 2a 20  eTnctType;   /* 
0480: 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
0490: 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72  _DISTINCT_* oper
04a0: 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74  ators */.  int t
04b0: 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70  abTnct;    /* Ep
04c0: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73  hemeral table us
04d0: 65 64 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20  ed for DISTINCT 
04e0: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20  processing */.  
04f0: 69 6e 74 20 61 64 64 72 54 6e 63 74 3b 20 20 20  int addrTnct;   
0500: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
0510: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f  _OpenEphemeral o
0520: 70 63 6f 64 65 20 66 6f 72 20 74 61 62 54 6e 63  pcode for tabTnc
0530: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
0540: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0550: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65  e following obje
0560: 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  ct is used to re
0570: 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  cord information
0580: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 4f 52   about.** the OR
0590: 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f 55 50  DER BY (or GROUP
05a0: 20 42 59 29 20 63 6c 61 75 73 65 20 6f 66 20 71   BY) clause of q
05b0: 75 65 72 79 20 69 73 20 62 65 69 6e 67 20 63 6f  uery is being co
05c0: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ded..**.** The a
05d0: 44 65 66 65 72 5b 5d 20 61 72 72 61 79 20 69 73  Defer[] array is
05e0: 20 75 73 65 64 20 62 79 20 74 68 65 20 73 6f 72   used by the sor
05f0: 74 65 72 2d 72 65 66 65 72 65 6e 63 65 73 20 6f  ter-references o
0600: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 46 6f 72  ptimization. For
0610: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  .** example, ass
0620: 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 6e  uming there is n
0630: 6f 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e  o index that can
0640: 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
0650: 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20 66 6f   ORDER BY,.** fo
0660: 72 20 74 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a  r the query:.**.
0670: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c  **     SELECT a,
0680: 20 62 69 67 62 6c 6f 62 20 46 52 4f 4d 20 74 31   bigblob FROM t1
0690: 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49   ORDER BY a LIMI
06a0: 54 20 31 30 3b 0a 2a 2a 0a 2a 2a 20 69 74 20 6d  T 10;.**.** it m
06b0: 61 79 20 62 65 20 6d 6f 72 65 20 65 66 66 69 63  ay be more effic
06c0: 69 65 6e 74 20 74 6f 20 61 64 64 20 6a 75 73 74  ient to add just
06d0: 20 74 68 65 20 22 61 22 20 76 61 6c 75 65 73 20   the "a" values 
06e0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 20 61  to the sorter, a
06f0: 6e 64 0a 2a 2a 20 72 65 74 72 69 65 76 65 20 74  nd.** retrieve t
0700: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 62  he associated "b
0710: 69 67 62 6c 6f 62 22 20 76 61 6c 75 65 73 20 64  igblob" values d
0720: 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 61 62  irectly from tab
0730: 6c 65 20 74 31 20 61 73 20 74 68 65 0a 2a 2a 20  le t1 as the.** 
0740: 31 30 20 73 6d 61 6c 6c 65 73 74 20 22 61 22 20  10 smallest "a" 
0750: 76 61 6c 75 65 73 20 61 72 65 20 65 78 74 72 61  values are extra
0760: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 6f  cted from the so
0770: 72 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  rter..**.** When
0780: 20 74 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65   the sorter-refe
0790: 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69  rence optimizati
07a0: 6f 6e 20 69 73 20 75 73 65 64 2c 20 74 68 65 72  on is used, ther
07b0: 65 20 69 73 20 6f 6e 65 20 65 6e 74 72 79 20 69  e is one entry i
07c0: 6e 20 74 68 65 0a 2a 2a 20 61 44 65 66 65 72 5b  n the.** aDefer[
07d0: 5d 20 61 72 72 61 79 20 66 6f 72 20 65 61 63 68  ] array for each
07e0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
07f0: 74 68 61 74 20 6d 61 79 20 62 65 20 72 65 61 64  that may be read
0800: 20 61 73 20 76 61 6c 75 65 73 20 61 72 65 0a 2a   as values are.*
0810: 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  * extracted from
0820: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
0830: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0840: 6f 72 74 43 74 78 20 53 6f 72 74 43 74 78 3b 0a  ortCtx SortCtx;.
0850: 73 74 72 75 63 74 20 53 6f 72 74 43 74 78 20 7b  struct SortCtx {
0860: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
0870: 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65 20  derBy;   /* The 
0880: 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52 4f  ORDER BY (or GRO
0890: 55 50 20 42 59 20 63 6c 61 75 73 65 29 20 2a 2f  UP BY clause) */
08a0: 0a 20 20 69 6e 74 20 6e 4f 42 53 61 74 3b 20 20  .  int nOBSat;  
08b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
08c0: 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74  er of ORDER BY t
08d0: 65 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 62  erms satisfied b
08e0: 79 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  y indices */.  i
08f0: 6e 74 20 69 45 43 75 72 73 6f 72 3b 20 20 20 20  nt iECursor;    
0900: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
0910: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73 6f  umber for the so
0920: 72 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65  rter */.  int re
0930: 67 52 65 74 75 72 6e 3b 20 20 20 20 20 20 20 20  gReturn;        
0940: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
0950: 69 6e 67 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74  ing block-output
0960: 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   return address 
0970: 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 42 6b  */.  int labelBk
0980: 4f 75 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 74  Out;       /* St
0990: 61 72 74 20 6c 61 62 65 6c 20 66 6f 72 20 74 68  art label for th
09a0: 65 20 62 6c 6f 63 6b 2d 6f 75 74 70 75 74 20 73  e block-output s
09b0: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
09c0: 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  nt addrSortIndex
09d0: 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  ;    /* Address 
09e0: 6f 66 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72  of the OP_Sorter
09f0: 4f 70 65 6e 20 6f 72 20 4f 50 5f 4f 70 65 6e 45  Open or OP_OpenE
0a00: 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 69 6e  phemeral */.  in
0a10: 74 20 6c 61 62 65 6c 44 6f 6e 65 3b 20 20 20 20  t labelDone;    
0a20: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
0a30: 20 77 68 65 6e 20 64 6f 6e 65 2c 20 65 78 3a 20   when done, ex: 
0a40: 4c 49 4d 49 54 20 72 65 61 63 68 65 64 20 2a 2f  LIMIT reached */
0a50: 0a 20 20 75 38 20 73 6f 72 74 46 6c 61 67 73 3b  .  u8 sortFlags;
0a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f           /* Zero
0a70: 20 6f 72 20 6d 6f 72 65 20 53 4f 52 54 46 4c 41   or more SORTFLA
0a80: 47 5f 2a 20 62 69 74 73 20 2a 2f 0a 20 20 75 38  G_* bits */.  u8
0a90: 20 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f   bOrderedInnerLo
0aa0: 6f 70 3b 20 2f 2a 20 4f 52 44 45 52 20 42 59 20  op; /* ORDER BY 
0ab0: 63 6f 72 72 65 63 74 6c 79 20 73 6f 72 74 73 20  correctly sorts 
0ac0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a  the inner loop *
0ad0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
0ae0: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
0af0: 46 45 52 45 4e 43 45 53 0a 20 20 75 38 20 6e 44  FERENCES.  u8 nD
0b00: 65 66 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  efer;           
0b10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
0b20: 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61  lid entries in a
0b30: 44 65 66 65 72 5b 5d 20 2a 2f 0a 20 20 73 74 72  Defer[] */.  str
0b40: 75 63 74 20 44 65 66 65 72 72 65 64 43 73 72 20  uct DeferredCsr 
0b50: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
0b60: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  b;        /* Tab
0b70: 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 2a 2f  le definition */
0b80: 0a 20 20 20 20 69 6e 74 20 69 43 73 72 3b 20 20  .    int iCsr;  
0b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
0ba0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 61  or number for ta
0bb0: 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ble */.    int n
0bc0: 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Key;           /
0bd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 4b 20 63  * Number of PK c
0be0: 6f 6c 75 6d 6e 73 20 66 6f 72 20 74 61 62 6c 65  olumns for table
0bf0: 20 70 54 61 62 20 28 3e 3d 31 29 20 2a 2f 0a 20   pTab (>=1) */. 
0c00: 20 7d 20 61 44 65 66 65 72 5b 34 5d 3b 0a 23 65   } aDefer[4];.#e
0c10: 6e 64 69 66 0a 20 20 73 74 72 75 63 74 20 52 6f  ndif.  struct Ro
0c20: 77 4c 6f 61 64 49 6e 66 6f 20 2a 70 44 65 66 65  wLoadInfo *pDefe
0c30: 72 72 65 64 52 6f 77 4c 6f 61 64 3b 20 20 2f 2a  rredRowLoad;  /*
0c40: 20 44 65 66 65 72 72 65 64 20 72 6f 77 20 6c 6f   Deferred row lo
0c50: 61 64 69 6e 67 20 69 6e 66 6f 20 6f 72 20 4e 55  ading info or NU
0c60: 4c 4c 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65  LL */.};.#define
0c70: 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72   SORTFLAG_UseSor
0c80: 74 65 72 20 20 30 78 30 31 20 20 20 2f 2a 20 55  ter  0x01   /* U
0c90: 73 65 20 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  se SorterOpen in
0ca0: 73 74 65 61 64 20 6f 66 20 4f 70 65 6e 45 70 68  stead of OpenEph
0cb0: 65 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  emeral */../*.**
0cc0: 20 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20   Delete all the 
0cd0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c  content of a Sel
0ce0: 65 63 74 20 73 74 72 75 63 74 75 72 65 2e 20 20  ect structure.  
0cf0: 44 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  Deallocate the s
0d00: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65  tructure.** itse
0d10: 6c 66 20 6f 6e 6c 79 20 69 66 20 62 46 72 65 65  lf only if bFree
0d20: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
0d30: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0d40: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0d50: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
0d60: 20 62 46 72 65 65 29 7b 0a 20 20 77 68 69 6c 65   bFree){.  while
0d70: 28 20 70 20 29 7b 0a 20 20 20 20 53 65 6c 65 63  ( p ){.    Selec
0d80: 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
0d90: 50 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74  Prior;.    sqlit
0da0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
0db0: 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  (db, p->pEList);
0dc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
0dd0: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
0de0: 3e 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69  >pSrc);.    sqli
0df0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
0e00: 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  , p->pWhere);.  
0e10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
0e20: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
0e30: 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71  GroupBy);.    sq
0e40: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
0e50: 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  db, p->pHaving);
0e60: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0e70: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
0e80: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
0e90: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
0ea0: 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
0eb0: 29 3b 0a 20 20 20 20 69 66 28 20 4f 4b 5f 49 46  );.    if( OK_IF
0ec0: 5f 41 4c 57 41 59 53 5f 54 52 55 45 28 70 2d 3e  _ALWAYS_TRUE(p->
0ed0: 70 57 69 74 68 29 20 29 20 73 71 6c 69 74 65 33  pWith) ) sqlite3
0ee0: 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70  WithDelete(db, p
0ef0: 2d 3e 70 57 69 74 68 29 3b 0a 20 20 20 20 69 66  ->pWith);.    if
0f00: 28 20 62 46 72 65 65 20 29 20 73 71 6c 69 74 65  ( bFree ) sqlite
0f10: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
0f20: 3b 0a 20 20 20 20 70 20 3d 20 70 50 72 69 6f 72  ;.    p = pPrior
0f30: 3b 0a 20 20 20 20 62 46 72 65 65 20 3d 20 31 3b  ;.    bFree = 1;
0f40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
0f50: 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63  itialize a Selec
0f60: 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e  tDest structure.
0f70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0f80: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53  SelectDestInit(S
0f90: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
0fa0: 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74  , int eDest, int
0fb0: 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74   iParm){.  pDest
0fc0: 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44  ->eDest = (u8)eD
0fd0: 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53  est;.  pDest->iS
0fe0: 44 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20  DParm = iParm;. 
0ff0: 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74   pDest->zAffSdst
1000: 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69   = 0;.  pDest->i
1010: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
1020: 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a  t->nSdst = 0;.}.
1030: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1040: 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74   a new Select st
1050: 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75  ructure and retu
1060: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1070: 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72  that.** structur
1080: 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71  e..*/.Select *sq
1090: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a  lite3SelectNew(.
10a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
10c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
10d0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
10e0: 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63  ,     /* which c
10f0: 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64  olumns to includ
1100: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  e in the result 
1110: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1120: 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68  rc,        /* th
1130: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d  e FROM clause --
1140: 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f   which tables to
1150: 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20   scan */.  Expr 
1160: 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
1170: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
1180: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
1190: 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20  st *pGroupBy,   
11a0: 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  /* the GROUP BY 
11b0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
11c0: 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20   *pHaving,      
11d0: 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20    /* the HAVING 
11e0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
11f0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
1200: 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42    /* the ORDER B
1210: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 33  Y clause */.  u3
1220: 32 20 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20  2 selFlags,     
1230: 20 20 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61      /* Flag para
1240: 6d 65 74 65 72 73 2c 20 73 75 63 68 20 61 73 20  meters, such as 
1250: 53 46 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20  SF_Distinct */. 
1260: 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 20 20   Expr *pLimit   
1270: 20 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20         /* LIMIT 
1280: 76 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61  value.  NULL mea
1290: 6e 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 29  ns not used */.)
12a0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
12b0: 3b 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64  ;.  Select stand
12c0: 69 6e 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  in;.  pNew = sql
12d0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
12e0: 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  N(pParse->db, si
12f0: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
1300: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1310: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1320: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1330: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
1340: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d   = &standin;.  }
1350: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30  .  if( pEList==0
1360: 20 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d   ){.    pEList =
1370: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1380: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
1390: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
13c0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 54 4b 5f 41  (pParse->db,TK_A
13d0: 53 54 45 52 49 53 4b 2c 30 29 29 3b 0a 20 20 7d  STERISK,0));.  }
13e0: 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20  .  pNew->pEList 
13f0: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77  = pEList;.  pNew
1400: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54  ->op = TK_SELECT
1410: 3b 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61  ;.  pNew->selFla
1420: 67 73 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20  gs = selFlags;. 
1430: 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20   pNew->iLimit = 
1440: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  0;.  pNew->iOffs
1450: 65 74 20 3d 20 30 3b 0a 23 69 66 20 53 45 4c 45  et = 0;.#if SELE
1460: 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
1470: 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65    pNew->zSelName
1480: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
1490: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
14a0: 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[0] = -1;.  
14b0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
14c0: 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[1] = -1;.  pN
14d0: 65 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d  ew->nSelectRow =
14e0: 20 30 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d   0;.  if( pSrc==
14f0: 30 20 29 20 70 53 72 63 20 3d 20 73 71 6c 69 74  0 ) pSrc = sqlit
1500: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
1510: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
1520: 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65  f(*pSrc));.  pNe
1530: 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  w->pSrc = pSrc;.
1540: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
1550: 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d   pWhere;.  pNew-
1560: 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  >pGroupBy = pGro
1570: 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  upBy;.  pNew->pH
1580: 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b  aving = pHaving;
1590: 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
15a0: 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20  y = pOrderBy;.  
15b0: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30  pNew->pPrior = 0
15c0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
15d0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  = 0;.  pNew->pLi
15e0: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
15f0: 70 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b  pNew->pWith = 0;
1600: 0a 20 20 70 4e 65 77 2d 3e 70 57 69 6e 20 3d 20  .  pNew->pWin = 
1610: 30 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  0;.  if( pParse-
1620: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1630: 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72 53  d ) {.    clearS
1640: 65 6c 65 63 74 28 70 50 61 72 73 65 2d 3e 64 62  elect(pParse->db
1650: 2c 20 70 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73  , pNew, pNew!=&s
1660: 74 61 6e 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65  tandin);.    pNe
1670: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
1680: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
1690: 2d 3e 70 53 72 63 21 3d 30 20 7c 7c 20 70 50 61  ->pSrc!=0 || pPa
16a0: 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20  rse->nErr>0 );. 
16b0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65   }.  assert( pNe
16c0: 77 21 3d 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20  w!=&standin );. 
16d0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
16e0: 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
16f0: 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53  _ENABLED./*.** S
1700: 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  et the name of a
1710: 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 0a 2a   Select object.*
1720: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  /.void sqlite3Se
1730: 6c 65 63 74 53 65 74 4e 61 6d 65 28 53 65 6c 65  lectSetName(Sele
1740: 63 74 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ct *p, const cha
1750: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
1760: 20 70 20 26 26 20 7a 4e 61 6d 65 20 29 7b 0a 20   p && zName ){. 
1770: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1780: 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 53  ntf(sizeof(p->zS
1790: 65 6c 4e 61 6d 65 29 2c 20 70 2d 3e 7a 53 65 6c  elName), p->zSel
17a0: 4e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 4e 61 6d  Name, "%s", zNam
17b0: 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  e);.  }.}.#endif
17c0: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  .../*.** Delete 
17d0: 74 68 65 20 67 69 76 65 6e 20 53 65 6c 65 63 74  the given Select
17e0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
17f0: 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 73 74 72  ll of its substr
1800: 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64  uctures..*/.void
1810: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1820: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
1830: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
1840: 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53  if( OK_IF_ALWAYS
1850: 5f 54 52 55 45 28 70 29 20 29 20 63 6c 65 61 72  _TRUE(p) ) clear
1860: 53 65 6c 65 63 74 28 64 62 2c 20 70 2c 20 31 29  Select(db, p, 1)
1870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1880: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1890: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45  he right-most SE
18a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
18b0: 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f  n a compound..*/
18c0: 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74 20 2a  .static Select *
18d0: 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 53 65  findRightmost(Se
18e0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c  lect *p){.  whil
18f0: 65 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 20  e( p->pNext ) p 
1900: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65  = p->pNext;.  re
1910: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1920: 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64   Given 1 to 3 id
1930: 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 64  entifiers preced
1940: 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79  ing the JOIN key
1950: 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65 20  word, determine 
1960: 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a  the.** type of j
1970: 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  oin.  Return an 
1980: 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  integer constant
1990: 20 74 68 61 74 20 65 78 70 72 65 73 73 65 73 20   that expresses 
19a0: 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20  that type.** in 
19b0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c  terms of the fol
19c0: 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75 65  lowing bit value
19d0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f  s:.**.**     JT_
19e0: 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f  INNER.**     JT_
19f0: 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f  CROSS.**     JT_
1a00: 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f  OUTER.**     JT_
1a10: 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a  NATURAL.**     J
1a20: 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54  T_LEFT.**     JT
1a30: 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66  _RIGHT.**.** A f
1a40: 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69  ull outer join i
1a50: 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f  s the combinatio
1a60: 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64  n of JT_LEFT and
1a70: 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a   JT_RIGHT..**.**
1a80: 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f   If an illegal o
1a90: 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f  r unsupported jo
1aa0: 69 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e 2c  in type is seen,
1ab0: 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74 75   then still retu
1ac0: 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70  rn.** a join typ
1ad0: 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65 72  e, but put an er
1ae0: 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72 73  ror in the pPars
1af0: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
1b00: 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54  int sqlite3JoinT
1b10: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
1b20: 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f  e, Token *pA, To
1b30: 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a  ken *pB, Token *
1b40: 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74  pC){.  int joint
1b50: 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e  ype = 0;.  Token
1b60: 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f   *apAll[3];.  To
1b70: 6b 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20 20  ken *p;.        
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34 35       /*   012345
1ba0: 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20 31  6789 123456789 1
1bb0: 32 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f 0a  23456789 123 */.
1bc0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1bd0: 68 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d  har zKeyText[] =
1be0: 20 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74 65   "naturaleftoute
1bf0: 72 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72  rightfullinnercr
1c00: 6f 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20 63  oss";.  static c
1c10: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
1c20: 20 20 75 38 20 69 3b 20 20 20 20 20 20 20 20 2f    u8 i;        /
1c30: 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b  * Beginning of k
1c40: 65 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20 7a  eyword text in z
1c50: 4b 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20  KeyText[] */.   
1c60: 20 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a   u8 nChar;    /*
1c70: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6b   Length of the k
1c80: 65 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61 63  eyword in charac
1c90: 74 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20 63  ters */.    u8 c
1ca0: 6f 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e  ode;     /* Join
1cb0: 20 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20   type mask */.  
1cc0: 7d 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b  } aKeyword[] = {
1cd0: 0a 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20  .    /* natural 
1ce0: 2a 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e  */ { 0,  7, JT_N
1cf0: 41 54 55 52 41 4c 20 20 20 20 20 20 20 20 20 20  ATURAL          
1d00: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1d10: 6c 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20  left    */ { 6, 
1d20: 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f   4, JT_LEFT|JT_O
1d30: 55 54 45 52 20 20 20 20 20 20 20 20 20 20 7d 2c  UTER          },
1d40: 0a 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20 20  .    /* outer   
1d50: 2a 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f  */ { 10, 5, JT_O
1d60: 55 54 45 52 20 20 20 20 20 20 20 20 20 20 20 20  UTER            
1d70: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20        },.    /* 
1d80: 72 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c  right   */ { 14,
1d90: 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f   5, JT_RIGHT|JT_
1da0: 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 7d 2c  OUTER         },
1db0: 0a 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20  .    /* full    
1dc0: 2a 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c  */ { 19, 4, JT_L
1dd0: 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f  EFT|JT_RIGHT|JT_
1de0: 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20  OUTER },.    /* 
1df0: 69 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c  inner   */ { 23,
1e00: 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20   5, JT_INNER    
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
1e20: 0a 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20 20  .    /* cross   
1e30: 2a 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49  */ { 28, 5, JT_I
1e40: 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20  NNER|JT_CROSS   
1e50: 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20        },.  };.  
1e60: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c  int i, j;.  apAl
1e70: 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41  l[0] = pA;.  apA
1e80: 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70  ll[1] = pB;.  ap
1e90: 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66  All[2] = pC;.  f
1ea0: 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20 61  or(i=0; i<3 && a
1eb0: 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  pAll[i]; i++){. 
1ec0: 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b     p = apAll[i];
1ed0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
1ee0: 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f  ArraySize(aKeywo
1ef0: 72 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  rd); j++){.     
1f00: 20 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77   if( p->n==aKeyw
1f10: 6f 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20  ord[j].nChar .  
1f20: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
1f30: 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61 72  e3StrNICmp((char
1f40: 2a 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78  *)p->z, &zKeyTex
1f50: 74 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d  t[aKeyword[j].i]
1f60: 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20  , p->n)==0 ){.  
1f70: 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c        jointype |
1f80: 3d 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f  = aKeyword[j].co
1f90: 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  de;.        brea
1fa0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1fb0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a  .    testcase( j
1fc0: 3d 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a  ==0 || j==1 || j
1fd0: 3d 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a  ==2 || j==3 || j
1fe0: 3d 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a  ==4 || j==5 || j
1ff0: 3d 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20 6a  ==6 );.    if( j
2000: 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79  >=ArraySize(aKey
2010: 77 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20 6a  word) ){.      j
2020: 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52  ointype |= JT_ER
2030: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
2040: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2050: 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  (.     (jointype
2060: 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f   & (JT_INNER|JT_
2070: 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e  OUTER))==(JT_INN
2080: 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a  ER|JT_OUTER) ||.
2090: 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26       (jointype &
20a0: 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20   JT_ERROR)!=0.  
20b0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
20c0: 72 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20  r *zSp = " ";.  
20d0: 20 20 61 73 73 65 72 74 28 20 70 42 21 3d 30 20    assert( pB!=0 
20e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d 30  );.    if( pC==0
20f0: 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20   ){ zSp++; }.   
2100: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2110: 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77  (pParse, "unknow
2120: 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64  n or unsupported
2130: 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20 20   join type: ".  
2140: 20 20 20 20 20 22 25 54 20 25 54 25 73 25 54 22       "%T %T%s%T"
2150: 2c 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70  , pA, pB, zSp, p
2160: 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65  C);.    jointype
2170: 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d   = JT_INNER;.  }
2180: 65 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74 79  else if( (jointy
2190: 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
21a0: 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0 .         && (
21b0: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c  jointype & (JT_L
21c0: 45 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d  EFT|JT_RIGHT))!=
21d0: 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 73  JT_LEFT ){.    s
21e0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
21f0: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 52  Parse, .      "R
2200: 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55  IGHT and FULL OU
2210: 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f  TER JOINs are no
2220: 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70 70  t currently supp
2230: 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69  orted");.    joi
2240: 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52  ntype = JT_INNER
2250: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a  ;.  }.  return j
2260: 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ointype;.}../*.*
2270: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
2280: 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69  ex of a column i
2290: 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74 75  n a table.  Retu
22a0: 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f 6c  rn -1 if the col
22b0: 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  umn.** is not co
22c0: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 74  ntained in the t
22d0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
22e0: 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28  int columnIndex(
22f0: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e  Table *pTab, con
2300: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a  st char *zCol){.
2310: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
2320: 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; i<pTab->nCol
2330: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2340: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
2350: 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  Tab->aCol[i].zNa
2360: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72  me, zCol)==0 ) r
2370: 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
2380: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
2390: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 69  ** Search the fi
23a0: 72 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e 20  rst N tables in 
23b0: 70 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20  pSrc, from left 
23c0: 74 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e  to right, lookin
23d0: 67 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65  g for a.** table
23e0: 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c 75   that has a colu
23f0: 6d 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20  mn named zCol.  
2400: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e  .**.** When foun
2410: 64 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61 6e  d, set *piTab an
2420: 64 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65 20  d *piCol to the 
2430: 74 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64 20  table index and 
2440: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20  column index.** 
2450: 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  of the matching 
2460: 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75 72  column and retur
2470: 6e 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  n TRUE..**.** If
2480: 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74 75   not found, retu
2490: 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61  rn FALSE..*/.sta
24a0: 74 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e 64  tic int tableAnd
24b0: 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53  ColumnIndex(.  S
24c0: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
24d0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
24e0: 74 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63 68  tables to search
24f0: 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20   */.  int N,    
2500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2510: 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
2520: 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73  n pSrc->a[] to s
2530: 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74  earch */.  const
2540: 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20   char *zCol,    
2550: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
2560: 6f 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f  olumn we are loo
2570: 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  king for */.  in
2580: 74 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20 20  t *piTab,       
2590: 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64 65     /* Write inde
25a0: 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68  x of pSrc->a[] h
25b0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  ere */.  int *pi
25c0: 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Col           /*
25d0: 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66 20   Write index of 
25e0: 70 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e  pSrc->a[*piTab].
25f0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72  pTab->aCol[] her
2600: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2620: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
2630: 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72  er tables in pSr
2640: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  c */.  int iCol;
2650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2660: 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d  ndex of column m
2670: 61 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a  atching zCol */.
2680: 0a 20 20 61 73 73 65 72 74 28 20 28 70 69 54 61  .  assert( (piTa
2690: 62 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30  b==0)==(piCol==0
26a0: 29 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72  ) );  /* Both or
26b0: 20 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55 4c   neither are NUL
26c0: 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  L */.  for(i=0; 
26d0: 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<N; i++){.    i
26e0: 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65  Col = columnInde
26f0: 78 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61  x(pSrc->a[i].pTa
2700: 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66  b, zCol);.    if
2710: 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
2720: 20 20 20 69 66 28 20 70 69 54 61 62 20 29 7b 0a     if( piTab ){.
2730: 20 20 20 20 20 20 20 20 2a 70 69 54 61 62 20 3d          *piTab =
2740: 20 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43   i;.        *piC
2750: 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  ol = iCol;.     
2760: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
2770: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
2780: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2790: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
27a0: 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 74  is used to add t
27b0: 65 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79 20  erms implied by 
27c0: 4a 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20 74  JOIN syntax to t
27d0: 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
27e0: 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  se expression of
27f0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
2800: 65 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65 72  ent. The new ter
2810: 6d 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 41  m, which.** is A
2820: 4e 44 65 64 20 77 69 74 68 20 74 68 65 20 65 78  NDed with the ex
2830: 69 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c 61  isting WHERE cla
2840: 75 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20 66  use, is of the f
2850: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74  orm:.**.**    (t
2860: 61 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e  ab1.col1 = tab2.
2870: 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72  col2).**.** wher
2880: 65 20 74 61 62 31 20 69 73 20 74 68 65 20 69 53  e tab1 is the iS
2890: 72 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20 53  rc'th table in S
28a0: 72 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64 20  rcList pSrc and 
28b0: 74 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a 20  tab2 is the .** 
28c0: 28 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c  (iSrc+1)'th. Col
28d0: 75 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75  umn col1 is colu
28e0: 6d 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74  mn iColLeft of t
28f0: 61 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73  ab1, and col2 is
2900: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52  .** column iColR
2910: 69 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f  ight of tab2..*/
2920: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64 64  .static void add
2930: 57 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61 72  WhereTerm(.  Par
2940: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2960: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
2970: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
2980: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rc,             
2990: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
29a0: 74 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63  tables in FROM c
29b0: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  lause */.  int i
29c0: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
29d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
29e0: 64 65 78 20 6f 66 20 66 69 72 73 74 20 74 61 62  dex of first tab
29f0: 6c 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53  le to join in pS
2a00: 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  rc */.  int iCol
2a10: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
2a20: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2a30: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69   of column in fi
2a40: 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  rst table */.  i
2a50: 6e 74 20 69 52 69 67 68 74 2c 20 20 20 20 20 20  nt iRight,      
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a70: 2a 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e  * Index of secon
2a80: 64 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 20  d table in pSrc 
2a90: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69 67  */.  int iColRig
2aa0: 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
2ab0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2ac0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e   column in secon
2ad0: 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  d table */.  int
2ae0: 20 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20   isOuterJoin,   
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b00: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2b10: 61 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f  an OUTER join */
2b20: 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65 72  .  Expr **ppWher
2b30: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2b40: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68     /* IN/OUT: Th
2b50: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2b60: 6f 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20  o add to */.){. 
2b70: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2b80: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
2b90: 72 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20 2a  r *pE1;.  Expr *
2ba0: 70 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45 71  pE2;.  Expr *pEq
2bb0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65  ;..  assert( iLe
2bc0: 66 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20 61  ft<iRight );.  a
2bd0: 73 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53 72  ssert( pSrc->nSr
2be0: 63 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73  c>iRight );.  as
2bf0: 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c  sert( pSrc->a[iL
2c00: 65 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61  eft].pTab );.  a
2c10: 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69  ssert( pSrc->a[i
2c20: 52 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a  Right].pTab );..
2c30: 20 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33 43    pE1 = sqlite3C
2c40: 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28  reateColumnExpr(
2c50: 64 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  db, pSrc, iLeft,
2c60: 20 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45   iColLeft);.  pE
2c70: 32 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  2 = sqlite3Creat
2c80: 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20  eColumnExpr(db, 
2c90: 70 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69 43  pSrc, iRight, iC
2ca0: 6f 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45 71  olRight);..  pEq
2cb0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2cc0: 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70  pParse, TK_EQ, p
2cd0: 45 31 2c 20 70 45 32 29 3b 0a 20 20 69 66 28 20  E1, pE2);.  if( 
2ce0: 70 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f  pEq && isOuterJo
2cf0: 69 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65  in ){.    ExprSe
2d00: 74 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45  tProperty(pEq, E
2d10: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20  P_FromJoin);.   
2d20: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2d30: 73 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45  sProperty(pEq, E
2d40: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52  P_TokenOnly|EP_R
2d50: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45  educed) );.    E
2d60: 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
2d70: 79 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75  y(pEq, EP_NoRedu
2d80: 63 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52  ce);.    pEq->iR
2d90: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20  ightJoinTable = 
2da0: 28 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65  (i16)pE2->iTable
2db0: 3b 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65  ;.  }.  *ppWhere
2dc0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
2dd0: 64 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20  d(db, *ppWhere, 
2de0: 70 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pEq);.}../*.** S
2df0: 65 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f  et the EP_FromJo
2e00: 69 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61  in property on a
2e10: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
2e20: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
2e30: 2e 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65  ..** And set the
2e40: 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e   Expr.iRightJoin
2e50: 54 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20  Table to iTable 
2e60: 66 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69  for every term i
2e70: 6e 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73  n the.** express
2e80: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  ion..**.** The E
2e90: 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65  P_FromJoin prope
2ea0: 72 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74  rty is used on t
2eb0: 65 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65  erms of an expre
2ec0: 73 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a  ssion to tell.**
2ed0: 20 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20   the LEFT OUTER 
2ee0: 4a 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20  JOIN processing 
2ef0: 6c 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20  logic that this 
2f00: 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20  term is part of 
2f10: 74 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74  the.** join rest
2f20: 72 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65  riction specifie
2f30: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
2f40: 53 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20  SING clause and 
2f50: 6e 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66  not a part.** of
2f60: 20 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61   the more genera
2f70: 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  l WHERE clause. 
2f80: 20 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65   These terms are
2f90: 20 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74   moved over to t
2fa0: 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  he.** WHERE clau
2fb0: 73 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70  se during join p
2fc0: 72 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65  rocessing but we
2fd0: 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
2fe0: 72 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f  r that they.** o
2ff0: 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65  riginated in the
3000: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
3010: 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  use..**.** The E
3020: 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
3030: 62 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48  ble tells the WH
3040: 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
3050: 73 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a  ssing that the.*
3060: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  * expression dep
3070: 65 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52  ends on table iR
3080: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76  ightJoinTable ev
3090: 65 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65  en if that table
30a0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69   is not.** expli
30b0: 63 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20  citly mentioned 
30c0: 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  in the expressio
30d0: 6e 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61  n.  That informa
30e0: 74 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a  tion is needed.*
30f0: 2a 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65  * for cases like
3100: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
3110: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3120: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
3130: 20 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74   t1.a=t2.b AND t
3140: 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  1.x=5.**.** The 
3150: 77 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65  where clause nee
3160: 64 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20  ds to defer the 
3170: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20  handling of the 
3180: 74 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75  t1.x=5.** term u
3190: 6e 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74  ntil after the t
31a0: 32 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f  2 loop of the jo
31b0: 69 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79  in.  In that way
31c0: 2c 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72  , a.** NULL t2 r
31d0: 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  ow will be inser
31e0: 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e  ted whenever t1.
31f0: 78 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20  x!=5.  If we do 
3200: 6e 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65  not.** defer the
3210: 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e   handling of t1.
3220: 78 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  x=5, it will be 
3230: 70 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69  processed immedi
3240: 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74  ately.** after t
3250: 68 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72  he t1 loop and r
3260: 6f 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35  ows with t1.x!=5
3270: 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65   will never appe
3280: 61 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74  ar in.** the out
3290: 70 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e  put, which is in
32a0: 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74  correct..*/.stat
32b0: 69 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45  ic void setJoinE
32c0: 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  xpr(Expr *p, int
32d0: 20 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c   iTable){.  whil
32e0: 65 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72  e( p ){.    Expr
32f0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45  SetProperty(p, E
3300: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20  P_FromJoin);.   
3310: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
3320: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
3330: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
3340: 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70  uced) );.    Exp
3350: 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28  rSetVVAProperty(
3360: 70 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  p, EP_NoReduce);
3370: 0a 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f  .    p->iRightJo
3380: 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69  inTable = (i16)i
3390: 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 70  Table;.    if( p
33a0: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
33b0: 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20  N && p->x.pList 
33c0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
33d0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
33e0: 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  <p->x.pList->nEx
33f0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
3400: 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d    setJoinExpr(p-
3410: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
3420: 45 78 70 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20  Expr, iTable);. 
3430: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
3440: 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e   setJoinExpr(p->
3450: 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a  pLeft, iTable);.
3460: 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68      p = p->pRigh
3470: 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 20 55 6e  t;.  } .}../* Un
3480: 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 73  do the work of s
3490: 65 74 4a 6f 69 6e 45 78 70 72 28 29 2e 20 20 49  etJoinExpr().  I
34a0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
34b0: 20 74 72 65 65 20 70 2c 20 63 6f 6e 76 65 72 74   tree p, convert
34c0: 20 65 76 65 72 79 0a 2a 2a 20 74 65 72 6d 20 74   every.** term t
34d0: 68 61 74 20 69 73 20 6d 61 72 6b 65 64 20 77 69  hat is marked wi
34e0: 74 68 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 61  th EP_FromJoin a
34f0: 6e 64 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  nd iRightJoinTab
3500: 6c 65 3d 3d 69 54 61 62 6c 65 20 69 6e 74 6f 0a  le==iTable into.
3510: 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 74  ** an ordinary t
3520: 65 72 6d 20 74 68 61 74 20 6f 6d 69 74 73 20 74  erm that omits t
3530: 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 6d  he EP_FromJoin m
3540: 61 72 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ark..**.** This 
3550: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 4c  happens when a L
3560: 45 46 54 20 4a 4f 49 4e 20 69 73 20 73 69 6d 70  EFT JOIN is simp
3570: 6c 69 66 69 65 64 20 69 6e 74 6f 20 61 6e 20 6f  lified into an o
3580: 72 64 69 6e 61 72 79 20 4a 4f 49 4e 2e 0a 2a 2f  rdinary JOIN..*/
3590: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 73  .static void uns
35a0: 65 74 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20  etJoinExpr(Expr 
35b0: 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b  *p, int iTable){
35c0: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
35d0: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
35e0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f  operty(p, EP_Fro
35f0: 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 28  mJoin).     && (
3600: 69 54 61 62 6c 65 3c 30 20 7c 7c 20 70 2d 3e 69  iTable<0 || p->i
3610: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d  RightJoinTable==
3620: 69 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20  iTable) ){.     
3630: 20 45 78 70 72 43 6c 65 61 72 50 72 6f 70 65 72   ExprClearProper
3640: 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  ty(p, EP_FromJoi
3650: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  n);.    }.    if
3660: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43  ( p->op==TK_FUNC
3670: 54 49 4f 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69  TION && p->x.pLi
3680: 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  st ){.      int 
3690: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
36a0: 3b 20 69 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e  ; i<p->x.pList->
36b0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
36c0: 20 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78       unsetJoinEx
36d0: 70 72 28 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  pr(p->x.pList->a
36e0: 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
36f0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
3700: 7d 0a 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45  }.    unsetJoinE
3710: 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54  xpr(p->pLeft, iT
3720: 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d 20 70  able);.    p = p
3730: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d  ->pRight;.  } .}
3740: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3750: 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73 20 74  tine processes t
3760: 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74  he join informat
3770: 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45 43 54  ion for a SELECT
3780: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f   statement..** O
3790: 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
37a0: 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72 74 65  ses are converte
37b0: 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74 65 72  d into extra ter
37c0: 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
37d0: 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52  clause..** NATUR
37e0: 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72  AL joins also cr
37f0: 65 61 74 65 20 65 78 74 72 61 20 57 48 45 52 45  eate extra WHERE
3800: 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a   clause terms..*
3810: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73 20 6f  *.** The terms o
3820: 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  f a FROM clause 
3830: 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  are contained in
3840: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53 72 63   the Select.pSrc
3850: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54   structure..** T
3860: 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74 61 62  he left most tab
3870: 6c 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20  le is the first 
3880: 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63 74 2e  entry in Select.
3890: 70 53 72 63 2e 20 20 54 68 65 20 72 69 67 68 74  pSrc.  The right
38a0: 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69  -most.** table i
38b0: 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  s the last entry
38c0: 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72  .  The join oper
38d0: 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69 6e 20  ator is held in 
38e0: 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20  the entry to.** 
38f0: 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75 73 20  the left.  Thus 
3900: 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69 6e 73  entry 0 contains
3910: 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   the join operat
3920: 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20  or for the join 
3930: 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69  between.** entri
3940: 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41 6e 79  es 0 and 1.  Any
3950: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
3960: 75 73 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  uses associated 
3970: 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20 61 72  with the join ar
3980: 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61 63 68  e.** also attach
3990: 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 65  ed to the left e
39a0: 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ntry..**.** This
39b0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
39c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
39d0: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
39e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
39f0: 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f   sqliteProcessJo
3a00: 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  in(Parse *pParse
3a10: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
3a20: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a40: 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e  /* All tables in
3a50: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
3a60: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a80: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
3a90: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74 72 75  unters */.  stru
3aa0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
3ab0: 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c  *pLeft;     /* L
3ac0: 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20  eft table being 
3ad0: 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  joined */.  stru
3ae0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
3af0: 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 52  *pRight;    /* R
3b00: 69 67 68 74 20 74 61 62 6c 65 20 62 65 69 6e 67  ight table being
3b10: 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53   joined */..  pS
3b20: 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
3b30: 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d 3e 61  pLeft = &pSrc->a
3b40: 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20 3d 20  [0];.  pRight = 
3b50: 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72  &pLeft[1];.  for
3b60: 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53  (i=0; i<pSrc->nS
3b70: 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68  rc-1; i++, pRigh
3b80: 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20  t++, pLeft++){. 
3b90: 20 20 20 54 61 62 6c 65 20 2a 70 52 69 67 68 74     Table *pRight
3ba0: 54 61 62 20 3d 20 70 52 69 67 68 74 2d 3e 70 54  Tab = pRight->pT
3bb0: 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 73 4f 75  ab;.    int isOu
3bc0: 74 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45  ter;..    if( NE
3bd0: 56 45 52 28 70 4c 65 66 74 2d 3e 70 54 61 62 3d  VER(pLeft->pTab=
3be0: 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61 62 3d  =0 || pRightTab=
3bf0: 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =0) ) continue;.
3c00: 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20 28 70      isOuter = (p
3c10: 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79  Right->fg.jointy
3c20: 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
3c30: 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  0;..    /* When 
3c40: 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
3c50: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ord is present, 
3c60: 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65  add WHERE clause
3c70: 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a   terms for.    *
3c80: 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74  * every column t
3c90: 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c  hat the two tabl
3ca0: 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f  es have in commo
3cb0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
3cc0: 28 20 70 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69  ( pRight->fg.joi
3cd0: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
3ce0: 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  AL ){.      if( 
3cf0: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70  pRight->pOn || p
3d00: 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b  Right->pUsing ){
3d10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3d20: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3d30: 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e   "a NATURAL join
3d40: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 22 0a   may not have ".
3d50: 20 20 20 20 20 20 20 20 20 20 20 22 61 6e 20 4f             "an O
3d60: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
3d70: 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  e", 0);.        
3d80: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
3d90: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
3da0: 20 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e 6e 43   j<pRightTab->nC
3db0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
3dc0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
3dd0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75   /* Name of colu
3de0: 6d 6e 20 69 6e 20 74 68 65 20 72 69 67 68 74 20  mn in the right 
3df0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
3e00: 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20   int iLeft;     
3e10: 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65 66 74  /* Matching left
3e20: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
3e30: 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20    int iLeftCol; 
3e40: 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c   /* Matching col
3e50: 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66 74 20  umn in the left 
3e60: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20  table */..      
3e70: 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67 68 74    zName = pRight
3e80: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
3e90: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
3ea0: 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e  tableAndColumnIn
3eb0: 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a  dex(pSrc, i+1, z
3ec0: 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69  Name, &iLeft, &i
3ed0: 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20  LeftCol) ){.    
3ee0: 20 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65        addWhereTe
3ef0: 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c  rm(pParse, pSrc,
3f00: 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c   iLeft, iLeftCol
3f10: 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20  , i+1, j,.      
3f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f30: 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57   isOuter, &p->pW
3f40: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  here);.        }
3f50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
3f60: 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20      /* Disallow 
3f70: 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e  both ON and USIN
3f80: 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65  G clauses in the
3f90: 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a   same join.    *
3fa0: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3fb0: 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68 74 2d  ->pOn && pRight-
3fc0: 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 20  >pUsing ){.     
3fd0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3fe0: 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74  (pParse, "cannot
3ff0: 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e   have both ON an
4000: 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20 20 20  d USING ".      
4010: 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20 74 68    "clauses in th
4020: 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20  e same join");. 
4030: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
4040: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
4050: 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 74   the ON clause t
4060: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
4070: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20 63   WHERE clause, c
4080: 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20 20 20  onnected by.    
4090: 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  ** an AND operat
40a0: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  or..    */.    i
40b0: 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29  f( pRight->pOn )
40c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 75  {.      if( isOu
40d0: 74 65 72 20 29 20 73 65 74 4a 6f 69 6e 45 78 70  ter ) setJoinExp
40e0: 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70  r(pRight->pOn, p
40f0: 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b  Right->iCursor);
4100: 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65 72 65  .      p->pWhere
4110: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
4120: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  d(pParse->db, p-
4130: 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68 74 2d  >pWhere, pRight-
4140: 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70 52 69  >pOn);.      pRi
4150: 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20  ght->pOn = 0;.  
4160: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
4170: 74 65 20 65 78 74 72 61 20 74 65 72 6d 73 20 6f  te extra terms o
4180: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
4190: 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  se for each colu
41a0: 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20  mn named.    ** 
41b0: 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  in the USING cla
41c0: 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49  use.  Example: I
41d0: 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73  f the two tables
41e0: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20 61 72   to be joined ar
41f0: 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e 64 20  e .    ** A and 
4200: 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e 47 20  B and the USING 
4210: 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58 2c 20  clause names X, 
4220: 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61  Y, and Z, then a
4230: 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 74  dd this.    ** t
4240: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
4250: 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58 20 41  se:    A.X=B.X A
4260: 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41  ND A.Y=B.Y AND A
4270: 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65  .Z=B.Z.    ** Re
4280: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66  port an error if
4290: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74   any column ment
42a0: 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55 53 49  ioned in the USI
42b0: 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20 20 20  NG clause is.   
42c0: 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65   ** not containe
42d0: 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73  d in both tables
42e0: 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20   to be joined.. 
42f0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52     */.    if( pR
4300: 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a  ight->pUsing ){.
4310: 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 4c        IdList *pL
4320: 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 55  ist = pRight->pU
4330: 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  sing;.      for(
4340: 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49  j=0; j<pList->nI
4350: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
4360: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
4370: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
4380: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 55 53 49   term in the USI
4390: 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  NG clause */.   
43a0: 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20       int iLeft; 
43b0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f        /* Table o
43c0: 6e 20 74 68 65 20 6c 65 66 74 20 77 69 74 68 20  n the left with 
43d0: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
43e0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  name */.        
43f0: 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20  int iLeftCol;   
4400: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
4410: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f  r of matching co
4420: 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74  lumn on the left
4430: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
4440: 69 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20  iRightCol;   /* 
4450: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
4460: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
4470: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f   on the right */
4480: 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ..        zName 
4490: 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e  = pList->a[j].zN
44a0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 52 69  ame;.        iRi
44b0: 67 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49  ghtCol = columnI
44c0: 6e 64 65 78 28 70 52 69 67 68 74 54 61 62 2c 20  ndex(pRightTab, 
44d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
44e0: 69 66 28 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a  if( iRightCol<0.
44f0: 20 20 20 20 20 20 20 20 20 7c 7c 20 21 74 61 62           || !tab
4500: 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
4510: 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d  (pSrc, i+1, zNam
4520: 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66  e, &iLeft, &iLef
4530: 74 43 6f 6c 29 0a 20 20 20 20 20 20 20 20 29 7b  tCol).        ){
4540: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4550: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4560: 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20  e, "cannot join 
4570: 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20  using column %s 
4580: 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20  - column ".     
4590: 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72 65 73         "not pres
45a0: 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61 62 6c  ent in both tabl
45b0: 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  es", zName);.   
45c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
45d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
45e0: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
45f0: 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c  pParse, pSrc, iL
4600: 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69  eft, iLeftCol, i
4610: 2b 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20  +1, iRightCol,. 
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4630: 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d      isOuter, &p-
4640: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20  >pWhere);.      
4650: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
4660: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f  turn 0;.}../* Fo
4670: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
4680: 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
4690: 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  o *keyInfoFromEx
46a0: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
46b0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
46c0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
46d0: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
46e0: 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 46  *pList,     /* F
46f0: 6f 72 6d 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  orm the KeyInfo 
4700: 6f 62 6a 65 63 74 20 66 72 6f 6d 20 74 68 69 73  object from this
4710: 20 45 78 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69   ExprList */.  i
4720: 6e 74 20 69 53 74 61 72 74 2c 20 20 20 20 20 20  nt iStart,      
4730: 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 77 69 74      /* Begin wit
4740: 68 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66  h this column of
4750: 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20   pList */.  int 
4760: 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  nExtra          
4770: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
4780: 79 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  y extra columns 
4790: 74 6f 20 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b  to the end */.);
47a0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
47b0: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
47c0: 63 74 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61  ct holds informa
47d0: 74 69 6f 6e 20 28 62 65 79 6f 6e 64 20 70 50 61  tion (beyond pPa
47e0: 72 73 65 20 61 6e 64 20 70 53 65 6c 65 63 74 29  rse and pSelect)
47f0: 0a 2a 2a 20 6e 65 65 64 65 64 20 74 6f 20 6c 6f  .** needed to lo
4800: 61 64 20 74 68 65 20 6e 65 78 74 20 72 65 73 75  ad the next resu
4810: 6c 74 20 72 6f 77 20 74 68 61 74 20 69 73 20 74  lt row that is t
4820: 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
4830: 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 74 79 70  e sorter..*/.typ
4840: 65 64 65 66 20 73 74 72 75 63 74 20 52 6f 77 4c  edef struct RowL
4850: 6f 61 64 49 6e 66 6f 20 52 6f 77 4c 6f 61 64 49  oadInfo RowLoadI
4860: 6e 66 6f 3b 0a 73 74 72 75 63 74 20 52 6f 77 4c  nfo;.struct RowL
4870: 6f 61 64 49 6e 66 6f 20 7b 0a 20 20 69 6e 74 20  oadInfo {.  int 
4880: 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20  regResult;      
4890: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
48a0: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 72 72  e results in arr
48b0: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 20  ay of registers 
48c0: 68 65 72 65 20 2a 2f 0a 20 20 75 38 20 65 63 65  here */.  u8 ece
48d0: 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  lFlags;         
48e0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 61         /* Flag a
48f0: 72 67 75 6d 65 6e 74 20 74 6f 20 45 78 70 72 43  rgument to ExprC
4900: 6f 64 65 45 78 70 72 4c 69 73 74 28 29 20 2a 2f  odeExprList() */
4910: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
4920: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
4930: 45 52 45 4e 43 45 53 0a 20 20 45 78 70 72 4c 69  ERENCES.  ExprLi
4940: 73 74 20 2a 70 45 78 74 72 61 3b 20 20 20 20 20  st *pExtra;     
4950: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
4960: 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 62  columns needed b
4970: 79 20 73 6f 72 74 65 72 20 72 65 66 73 20 2a 2f  y sorter refs */
4980: 0a 20 20 69 6e 74 20 72 65 67 45 78 74 72 61 52  .  int regExtraR
4990: 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
49a0: 2f 2a 20 57 68 65 72 65 20 74 6f 20 6c 6f 61 64  /* Where to load
49b0: 20 74 68 65 20 65 78 74 72 61 20 63 6f 6c 75 6d   the extra colum
49c0: 6e 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ns */.#endif.};.
49d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
49e0: 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72  ine does the wor
49f0: 6b 20 6f 66 20 6c 6f 61 64 69 6e 67 20 71 75 65  k of loading que
4a00: 72 79 20 64 61 74 61 20 69 6e 74 6f 20 61 6e 20  ry data into an 
4a10: 61 72 72 61 79 20 6f 66 0a 2a 2a 20 72 65 67 69  array of.** regi
4a20: 73 74 65 72 73 20 73 6f 20 74 68 61 74 20 69 74  sters so that it
4a30: 20 63 61 6e 20 62 65 20 61 64 64 65 64 20 74 6f   can be added to
4a40: 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a   the sorter..*/.
4a50: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 6e 65  static void inne
4a60: 72 4c 6f 6f 70 4c 6f 61 64 52 6f 77 28 0a 20 20  rLoopLoadRow(.  
4a70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4a80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
4a90: 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f  atement under co
4aa0: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
4ab0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
4ac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
4ad0: 65 20 71 75 65 72 79 20 62 65 69 6e 67 20 63 6f  e query being co
4ae0: 64 65 64 20 2a 2f 0a 20 20 52 6f 77 4c 6f 61 64  ded */.  RowLoad
4af0: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
4b00: 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6e 65 65 64      /* Info need
4b10: 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  ed to complete t
4b20: 68 65 20 72 6f 77 20 6c 6f 61 64 20 2a 2f 0a 29  he row load */.)
4b30: 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  {.  sqlite3ExprC
4b40: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
4b50: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  se, pSelect->pEL
4b60: 69 73 74 2c 20 70 49 6e 66 6f 2d 3e 72 65 67 52  ist, pInfo->regR
4b70: 65 73 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20  esult,.         
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b90: 20 30 2c 20 70 49 6e 66 6f 2d 3e 65 63 65 6c 46   0, pInfo->ecelF
4ba0: 6c 61 67 73 29 3b 0a 23 69 66 64 65 66 20 53 51  lags);.#ifdef SQ
4bb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54  LITE_ENABLE_SORT
4bc0: 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20  ER_REFERENCES.  
4bd0: 69 66 28 20 70 49 6e 66 6f 2d 3e 70 45 78 74 72  if( pInfo->pExtr
4be0: 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  a ){.    sqlite3
4bf0: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
4c00: 28 70 50 61 72 73 65 2c 20 70 49 6e 66 6f 2d 3e  (pParse, pInfo->
4c10: 70 45 78 74 72 61 2c 20 70 49 6e 66 6f 2d 3e 72  pExtra, pInfo->r
4c20: 65 67 45 78 74 72 61 52 65 73 75 6c 74 2c 20 30  egExtraResult, 0
4c30: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
4c40: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
4c50: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 66  pParse->db, pInf
4c60: 6f 2d 3e 70 45 78 74 72 61 29 3b 0a 20 20 7d 0a  o->pExtra);.  }.
4c70: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
4c80: 43 6f 64 65 20 74 68 65 20 4f 50 5f 4d 61 6b 65  Code the OP_Make
4c90: 52 65 63 6f 72 64 20 69 6e 73 74 72 75 63 74 69  Record instructi
4ca0: 6f 6e 20 74 68 61 74 20 67 65 6e 65 72 61 74 65  on that generate
4cb0: 73 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 62  s the entry to b
4cc0: 65 0a 2a 2a 20 61 64 64 65 64 20 69 6e 74 6f 20  e.** added into 
4cd0: 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2a 0a 2a  the sorter..**.*
4ce0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 67  * Return the reg
4cf0: 69 73 74 65 72 20 69 6e 20 77 68 69 63 68 20 74  ister in which t
4d00: 68 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f  he result is sto
4d10: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
4d20: 6e 74 20 6d 61 6b 65 53 6f 72 74 65 72 52 65 63  nt makeSorterRec
4d30: 6f 72 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ord(.  Parse *pP
4d40: 61 72 73 65 2c 0a 20 20 53 6f 72 74 43 74 78 20  arse,.  SortCtx 
4d50: 2a 70 53 6f 72 74 2c 0a 20 20 53 65 6c 65 63 74  *pSort,.  Select
4d60: 20 2a 70 53 65 6c 65 63 74 2c 0a 20 20 69 6e 74   *pSelect,.  int
4d70: 20 72 65 67 42 61 73 65 2c 0a 20 20 69 6e 74 20   regBase,.  int 
4d80: 6e 42 61 73 65 0a 29 7b 0a 20 20 69 6e 74 20 6e  nBase.){.  int n
4d90: 4f 42 53 61 74 20 3d 20 70 53 6f 72 74 2d 3e 6e  OBSat = pSort->n
4da0: 4f 42 53 61 74 3b 0a 20 20 56 64 62 65 20 2a 76  OBSat;.  Vdbe *v
4db0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
4dc0: 3b 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 20 3d  ;.  int regOut =
4dd0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
4de0: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 70 44  .  if( pSort->pD
4df0: 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 20 29  eferredRowLoad )
4e00: 7b 0a 20 20 20 20 69 6e 6e 65 72 4c 6f 6f 70 4c  {.    innerLoopL
4e10: 6f 61 64 52 6f 77 28 70 50 61 72 73 65 2c 20 70  oadRow(pParse, p
4e20: 53 65 6c 65 63 74 2c 20 70 53 6f 72 74 2d 3e 70  Select, pSort->p
4e30: 44 65 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 29  DeferredRowLoad)
4e40: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
4e50: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
4e60: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
4e70: 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73  ase+nOBSat, nBas
4e80: 65 2d 6e 4f 42 53 61 74 2c 20 72 65 67 4f 75 74  e-nOBSat, regOut
4e90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 67 4f  );.  return regO
4ea0: 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ut;.}../*.** Gen
4eb0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
4ec0: 77 69 6c 6c 20 70 75 73 68 20 74 68 65 20 72 65  will push the re
4ed0: 63 6f 72 64 20 69 6e 20 72 65 67 69 73 74 65 72  cord in register
4ee0: 73 20 72 65 67 44 61 74 61 0a 2a 2a 20 74 68 72  s regData.** thr
4ef0: 6f 75 67 68 20 72 65 67 44 61 74 61 2b 6e 44 61  ough regData+nDa
4f00: 74 61 2d 31 20 6f 6e 74 6f 20 74 68 65 20 73 6f  ta-1 onto the so
4f10: 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rter..*/.static 
4f20: 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53 6f 72  void pushOntoSor
4f30: 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ter(.  Parse *pP
4f40: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
4f50: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
4f60: 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70 53  */.  SortCtx *pS
4f70: 6f 72 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 49  ort,        /* I
4f80: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
4f90: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
4fa0: 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ause */.  Select
4fb0: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
4fc0: 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45   /* The whole SE
4fd0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
4fe0: 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 2c  /.  int regData,
4ff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
5000: 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c  rst register hol
5010: 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20  ding data to be 
5020: 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  sorted */.  int 
5030: 72 65 67 4f 72 69 67 44 61 74 61 2c 20 20 20 20  regOrigData,    
5040: 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69     /* First regi
5050: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74  ster holding dat
5060: 61 20 62 65 66 6f 72 65 20 70 61 63 6b 69 6e 67  a before packing
5070: 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c   */.  int nData,
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5090: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
50a0: 74 73 20 69 6e 20 74 68 65 20 72 65 67 44 61 74  ts in the regDat
50b0: 61 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f 0a  a data array */.
50c0: 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67    int nPrefixReg
50d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20           /* No. 
50e0: 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f 20  of reg prior to 
50f0: 72 65 67 44 61 74 61 20 61 76 61 69 6c 61 62 6c  regData availabl
5100: 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b 0a  e for use */.){.
5110: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
5120: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65 72     /* Stmt under
5150: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
5160: 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28 28  .  int bSeq = ((
5170: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
5180: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
5190: 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69 6e  orter)==0);.  in
51a0: 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74 2d  t nExpr = pSort-
51b0: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
51c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
51d0: 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20 42  * No. of ORDER B
51e0: 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  Y terms */.  int
51f0: 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20 2b   nBase = nExpr +
5200: 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20 20   bSeq + nData;  
5210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5220: 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74 65   Fields in sorte
5230: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
5240: 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5270: 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74 65  * Regs for sorte
5280: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
5290: 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 30 3b  t regRecord = 0;
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
52c0: 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72 74  * Assembled sort
52d0: 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  er record */.  i
52e0: 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72  nt nOBSat = pSor
52f0: 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20 20  t->nOBSat;      
5300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5310: 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  /* ORDER BY term
5320: 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 69  s to skip */.  i
5330: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
5340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5350: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61    /* Opcode to a
5360: 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  dd sorter record
5370: 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20   to sorter */.  
5380: 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20 20 20  int iLimit;     
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53a0: 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f 75 6e     /* LIMIT coun
53b0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6b  ter */.  int iSk
53c0: 69 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ip = 0;         
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
53e0: 6e 64 20 6f 66 20 74 68 65 20 73 6f 72 74 65 72  nd of the sorter
53f0: 20 69 6e 73 65 72 74 20 6c 6f 6f 70 20 2a 2f 0a   insert loop */.
5400: 0a 20 20 61 73 73 65 72 74 28 20 62 53 65 71 3d  .  assert( bSeq=
5410: 3d 30 20 7c 7c 20 62 53 65 71 3d 3d 31 20 29 3b  =0 || bSeq==1 );
5420: 0a 0a 20 20 2f 2a 20 54 68 72 65 65 20 63 61 73  ..  /* Three cas
5430: 65 73 3a 0a 20 20 2a 2a 20 20 20 28 31 29 20 54  es:.  **   (1) T
5440: 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 73 6f  he data to be so
5450: 72 74 65 64 20 68 61 73 20 61 6c 72 65 61 64 79  rted has already
5460: 20 62 65 65 6e 20 70 61 63 6b 65 64 20 69 6e 74   been packed int
5470: 6f 20 61 20 52 65 63 6f 72 64 0a 20 20 2a 2a 20  o a Record.  ** 
5480: 20 20 20 20 20 20 62 79 20 61 20 70 72 69 6f 72        by a prior
5490: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 20   OP_MakeRecord. 
54a0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6e 44   In this case nD
54b0: 61 74 61 3d 3d 31 20 61 6e 64 20 72 65 67 44 61  ata==1 and regDa
54c0: 74 61 0a 20 20 2a 2a 20 20 20 20 20 20 20 77 69  ta.  **       wi
54d0: 6c 6c 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  ll be completely
54e0: 20 75 6e 72 65 6c 61 74 65 64 20 74 6f 20 72 65   unrelated to re
54f0: 67 4f 72 69 67 44 61 74 61 2e 0a 20 20 2a 2a 20  gOrigData..  ** 
5500: 20 20 28 32 29 20 41 6c 6c 20 6f 75 74 70 75 74    (2) All output
5510: 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 69 6e 63   columns are inc
5520: 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 6f 72  luded in the sor
5530: 74 20 72 65 63 6f 72 64 2e 20 20 49 6e 20 74 68  t record.  In th
5540: 61 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 63 61  at.  **       ca
5550: 73 65 20 72 65 67 44 61 74 61 3d 3d 72 65 67 4f  se regData==regO
5560: 72 69 67 44 61 74 61 2e 0a 20 20 2a 2a 20 20 20  rigData..  **   
5570: 28 33 29 20 53 6f 6d 65 20 6f 75 74 70 75 74 20  (3) Some output 
5580: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6f 6d 69 74  columns are omit
5590: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 6f 72  ted from the sor
55a0: 74 20 72 65 63 6f 72 64 20 64 75 65 20 74 6f 0a  t record due to.
55b0: 20 20 2a 2a 20 20 20 20 20 20 20 74 68 65 20 53    **       the S
55c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
55d0: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 20 6f 70  TER_REFERENCE op
55e0: 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 6f 72 20 64  timization, or d
55f0: 75 65 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 20  ue to the.  **  
5600: 20 20 20 20 20 53 51 4c 49 54 45 5f 45 43 45 4c       SQLITE_ECEL
5610: 5f 4f 4d 49 54 52 45 46 20 6f 70 74 69 6d 69 7a  _OMITREF optimiz
5620: 61 74 69 6f 6e 2c 20 6f 72 20 64 75 65 20 74 6f  ation, or due to
5630: 20 74 68 65 20 0a 20 20 2a 2a 20 20 20 20 20 20   the .  **      
5640: 20 53 6f 72 74 43 74 78 2e 70 44 65 66 65 72 72   SortCtx.pDeferr
5650: 65 64 52 6f 77 4c 6f 61 64 20 6f 70 74 69 6d 69  edRowLoad optimi
5660: 61 74 69 6f 6e 2e 20 20 49 6e 20 61 6e 79 20 6f  ation.  In any o
5670: 66 20 74 68 65 73 65 20 63 61 73 65 73 0a 20 20  f these cases.  
5680: 2a 2a 20 20 20 20 20 20 20 72 65 67 4f 72 69 67  **       regOrig
5690: 44 61 74 61 20 69 73 20 30 20 74 6f 20 70 72 65  Data is 0 to pre
56a0: 76 65 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e  vent this routin
56b0: 65 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  e from trying to
56c0: 20 63 6f 70 79 0a 20 20 2a 2a 20 20 20 20 20 20   copy.  **      
56d0: 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 69 67   values that mig
56e0: 68 74 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74  ht not yet exist
56f0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
5700: 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72 65 67   nData==1 || reg
5710: 44 61 74 61 3d 3d 72 65 67 4f 72 69 67 44 61 74  Data==regOrigDat
5720: 61 20 7c 7c 20 72 65 67 4f 72 69 67 44 61 74 61  a || regOrigData
5730: 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 6e 50  ==0 );..  if( nP
5740: 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20 20 20  refixReg ){.    
5750: 61 73 73 65 72 74 28 20 6e 50 72 65 66 69 78 52  assert( nPrefixR
5760: 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20 29  eg==nExpr+bSeq )
5770: 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  ;.    regBase = 
5780: 72 65 67 44 61 74 61 20 2d 20 6e 50 72 65 66 69  regData - nPrefi
5790: 78 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  xReg;.  }else{. 
57a0: 20 20 20 72 65 67 42 61 73 65 20 3d 20 70 50 61     regBase = pPa
57b0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
57c0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
57d0: 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a 20 20  += nBase;.  }.  
57e0: 61 73 73 65 72 74 28 20 70 53 65 6c 65 63 74 2d  assert( pSelect-
57f0: 3e 69 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70  >iOffset==0 || p
5800: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 21 3d  Select->iLimit!=
5810: 30 20 29 3b 0a 20 20 69 4c 69 6d 69 74 20 3d 20  0 );.  iLimit = 
5820: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
5830: 20 3f 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66   ? pSelect->iOff
5840: 73 65 74 2b 31 20 3a 20 70 53 65 6c 65 63 74 2d  set+1 : pSelect-
5850: 3e 69 4c 69 6d 69 74 3b 0a 20 20 70 53 6f 72 74  >iLimit;.  pSort
5860: 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d 20 73 71  ->labelDone = sq
5870: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
5880: 65 6c 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  el(v);.  sqlite3
5890: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
58a0: 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e  (pParse, pSort->
58b0: 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61 73  pOrderBy, regBas
58c0: 65 2c 20 72 65 67 4f 72 69 67 44 61 74 61 2c 0a  e, regOrigData,.
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58e0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
58f0: 5f 45 43 45 4c 5f 44 55 50 20 7c 20 28 72 65 67  _ECEL_DUP | (reg
5900: 4f 72 69 67 44 61 74 61 3f 20 53 51 4c 49 54 45  OrigData? SQLITE
5910: 5f 45 43 45 4c 5f 52 45 46 20 3a 20 30 29 29 3b  _ECEL_REF : 0));
5920: 0a 20 20 69 66 28 20 62 53 65 71 20 29 7b 0a 20  .  if( bSeq ){. 
5930: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
5940: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65  dOp2(v, OP_Seque
5950: 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45 43 75  nce, pSort->iECu
5960: 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e 45  rsor, regBase+nE
5970: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  xpr);.  }.  if( 
5980: 6e 50 72 65 66 69 78 52 65 67 3d 3d 30 20 26 26  nPrefixReg==0 &&
5990: 20 6e 44 61 74 61 3e 30 20 29 7b 0a 20 20 20 20   nData>0 ){.    
59a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
59b0: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 44  ove(pParse, regD
59c0: 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e 45 78  ata, regBase+nEx
59d0: 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61 29 3b  pr+bSeq, nData);
59e0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 42 53 61  .  }.  if( nOBSa
59f0: 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  t>0 ){.    int r
5a00: 65 67 50 72 65 76 4b 65 79 3b 20 20 20 2f 2a 20  egPrevKey;   /* 
5a10: 54 68 65 20 66 69 72 73 74 20 6e 4f 42 53 61 74  The first nOBSat
5a20: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
5a30: 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a  previous row */.
5a40: 20 20 20 20 69 6e 74 20 61 64 64 72 46 69 72 73      int addrFirs
5a50: 74 3b 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  t;    /* Address
5a60: 20 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e 6f 74   of the OP_IfNot
5a70: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69   opcode */.    i
5a80: 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20 20 20 20  nt addrJmp;     
5a90: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
5aa0: 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63 6f 64  he OP_Jump opcod
5ab0: 65 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f 70 20  e */.    VdbeOp 
5ac0: 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20 4f 70  *pOp;      /* Op
5ad0: 63 6f 64 65 20 74 68 61 74 20 6f 70 65 6e 73 20  code that opens 
5ae0: 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20  the sorter */.  
5af0: 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20    int nKey;     
5b00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5b10: 20 73 6f 72 74 69 6e 67 20 6b 65 79 20 63 6f 6c   sorting key col
5b20: 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  umns, including 
5b30: 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f 0a 20  OP_Sequence */. 
5b40: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 49 3b     KeyInfo *pKI;
5b50: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
5b60: 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68 65 20   KeyInfo on the 
5b70: 73 6f 72 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  sorter table */.
5b80: 0a 20 20 20 20 72 65 67 52 65 63 6f 72 64 20 3d  .    regRecord =
5b90: 20 6d 61 6b 65 53 6f 72 74 65 72 52 65 63 6f 72   makeSorterRecor
5ba0: 64 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74 2c  d(pParse, pSort,
5bb0: 20 70 53 65 6c 65 63 74 2c 20 72 65 67 42 61 73   pSelect, regBas
5bc0: 65 2c 20 6e 42 61 73 65 29 3b 0a 20 20 20 20 72  e, nBase);.    r
5bd0: 65 67 50 72 65 76 4b 65 79 20 3d 20 70 50 61 72  egPrevKey = pPar
5be0: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
5bf0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
5c00: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20  pSort->nOBSat;. 
5c10: 20 20 20 6e 4b 65 79 20 3d 20 6e 45 78 70 72 20     nKey = nExpr 
5c20: 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 20  - pSort->nOBSat 
5c30: 2b 20 62 53 65 71 3b 0a 20 20 20 20 69 66 28 20  + bSeq;.    if( 
5c40: 62 53 65 71 20 29 7b 0a 20 20 20 20 20 20 61 64  bSeq ){.      ad
5c50: 64 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65  drFirst = sqlite
5c60: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
5c70: 50 5f 49 66 4e 6f 74 2c 20 72 65 67 42 61 73 65  P_IfNot, regBase
5c80: 2b 6e 45 78 70 72 29 3b 20 0a 20 20 20 20 7d 65  +nExpr); .    }e
5c90: 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 46  lse{.      addrF
5ca0: 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  irst = sqlite3Vd
5cb0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53  beAddOp1(v, OP_S
5cc0: 65 71 75 65 6e 63 65 54 65 73 74 2c 20 70 53 6f  equenceTest, pSo
5cd0: 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  rt->iECursor);. 
5ce0: 20 20 20 7d 0a 20 20 20 20 56 64 62 65 43 6f 76     }.    VdbeCov
5cf0: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
5d00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5d10: 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72  v, OP_Compare, r
5d20: 65 67 50 72 65 76 4b 65 79 2c 20 72 65 67 42 61  egPrevKey, regBa
5d30: 73 65 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61  se, pSort->nOBSa
5d40: 74 29 3b 0a 20 20 20 20 70 4f 70 20 3d 20 73 71  t);.    pOp = sq
5d50: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
5d60: 2c 20 70 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72  , pSort->addrSor
5d70: 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  tIndex);.    if(
5d80: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
5d90: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
5da0: 72 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20  rn;.    pOp->p2 
5db0: 3d 20 6e 4b 65 79 20 2b 20 6e 44 61 74 61 3b 0a  = nKey + nData;.
5dc0: 20 20 20 20 70 4b 49 20 3d 20 70 4f 70 2d 3e 70      pKI = pOp->p
5dd0: 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
5de0: 6d 65 6d 73 65 74 28 70 4b 49 2d 3e 61 53 6f 72  memset(pKI->aSor
5df0: 74 4f 72 64 65 72 2c 20 30 2c 20 70 4b 49 2d 3e  tOrder, 0, pKI->
5e00: 6e 4b 65 79 46 69 65 6c 64 29 3b 20 2f 2a 20 4d  nKeyField); /* M
5e10: 61 6b 65 73 20 4f 50 5f 4a 75 6d 70 20 74 65 73  akes OP_Jump tes
5e20: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73 71 6c  table */.    sql
5e30: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
5e40: 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 70  (v, -1, (char*)p
5e50: 4b 49 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  KI, P4_KEYINFO);
5e60: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
5e70: 4b 49 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 3e 20  KI->nAllField > 
5e80: 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c 64 2b 32  pKI->nKeyField+2
5e90: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   );.    pOp->p4.
5ea0: 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
5eb0: 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
5ec0: 50 61 72 73 65 2c 20 70 53 6f 72 74 2d 3e 70 4f  Parse, pSort->pO
5ed0: 72 64 65 72 42 79 2c 20 6e 4f 42 53 61 74 2c 0a  rderBy, nOBSat,.
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f00: 20 20 20 20 20 20 20 20 20 20 20 70 4b 49 2d 3e             pKI->
5f10: 6e 41 6c 6c 46 69 65 6c 64 2d 70 4b 49 2d 3e 6e  nAllField-pKI->n
5f20: 4b 65 79 46 69 65 6c 64 2d 31 29 3b 0a 20 20 20  KeyField-1);.   
5f30: 20 61 64 64 72 4a 6d 70 20 3d 20 73 71 6c 69 74   addrJmp = sqlit
5f40: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
5f50: 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
5f60: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5f70: 50 5f 4a 75 6d 70 2c 20 61 64 64 72 4a 6d 70 2b  P_Jump, addrJmp+
5f80: 31 2c 20 30 2c 20 61 64 64 72 4a 6d 70 2b 31 29  1, 0, addrJmp+1)
5f90: 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
5fa0: 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 6c 61  );.    pSort->la
5fb0: 62 65 6c 42 6b 4f 75 74 20 3d 20 73 71 6c 69 74  belBkOut = sqlit
5fc0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
5fd0: 76 29 3b 0a 20 20 20 20 70 53 6f 72 74 2d 3e 72  v);.    pSort->r
5fe0: 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61  egReturn = ++pPa
5ff0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
6000: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6010: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 53  (v, OP_Gosub, pS
6020: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20  ort->regReturn, 
6030: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
6040: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  t);.    sqlite3V
6050: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
6060: 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 53 6f  ResetSorter, pSo
6070: 72 74 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  rt->iECursor);. 
6080: 20 20 20 69 66 28 20 69 4c 69 6d 69 74 20 29 7b     if( iLimit ){
6090: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
60a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
60b0: 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20 70 53  fNot, iLimit, pS
60c0: 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 29 3b  ort->labelDone);
60d0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72  .      VdbeCover
60e0: 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a 20 20  age(v);.    }.  
60f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
6100: 70 48 65 72 65 28 76 2c 20 61 64 64 72 46 69 72  pHere(v, addrFir
6110: 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
6120: 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
6130: 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 72 65  rse, regBase, re
6140: 67 50 72 65 76 4b 65 79 2c 20 70 53 6f 72 74 2d  gPrevKey, pSort-
6150: 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20 20 73 71  >nOBSat);.    sq
6160: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
6170: 65 28 76 2c 20 61 64 64 72 4a 6d 70 29 3b 0a 20  e(v, addrJmp);. 
6180: 20 7d 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 20   }.  if( iLimit 
6190: 29 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  ){.    /* At thi
61a0: 73 20 70 6f 69 6e 74 20 74 68 65 20 76 61 6c 75  s point the valu
61b0: 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  es for the new s
61c0: 6f 72 74 65 72 20 65 6e 74 72 79 20 61 72 65 20  orter entry are 
61d0: 73 74 6f 72 65 64 0a 20 20 20 20 2a 2a 20 69 6e  stored.    ** in
61e0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
61f0: 69 73 74 65 72 73 2e 20 54 68 65 79 20 6e 65 65  isters. They nee
6200: 64 20 74 6f 20 62 65 20 63 6f 6d 70 6f 73 65 64  d to be composed
6210: 20 69 6e 74 6f 20 61 20 72 65 63 6f 72 64 0a 20   into a record. 
6220: 20 20 20 2a 2a 20 61 6e 64 20 69 6e 73 65 72 74     ** and insert
6230: 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ed into the sort
6240: 65 72 20 69 66 20 65 69 74 68 65 72 20 28 61 29  er if either (a)
6250: 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65   there are curre
6260: 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6c 65 73 73  ntly.    ** less
6270: 20 74 68 61 6e 20 4c 49 4d 49 54 2b 4f 46 46 53   than LIMIT+OFFS
6280: 45 54 20 69 74 65 6d 73 20 6f 72 20 28 62 29 20  ET items or (b) 
6290: 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 69  the new record i
62a0: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
62b0: 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 72 67 65      ** the large
62c0: 73 74 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e  st record curren
62d0: 74 6c 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65  tly in the sorte
62e0: 72 2e 20 49 66 20 28 62 29 20 69 73 20 74 72 75  r. If (b) is tru
62f0: 65 20 61 6e 64 20 74 68 65 72 65 0a 20 20 20 20  e and there.    
6300: 2a 2a 20 61 72 65 20 61 6c 72 65 61 64 79 20 4c  ** are already L
6310: 49 4d 49 54 2b 4f 46 46 53 45 54 20 69 74 65 6d  IMIT+OFFSET item
6320: 73 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 2c  s in the sorter,
6330: 20 64 65 6c 65 74 65 20 74 68 65 20 6c 61 72 67   delete the larg
6340: 65 73 74 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79  est.    ** entry
6350: 20 62 65 66 6f 72 65 20 69 6e 73 65 72 74 69 6e   before insertin
6360: 67 20 74 68 65 20 6e 65 77 20 6f 6e 65 2e 20 54  g the new one. T
6370: 68 69 73 20 77 61 79 20 74 68 65 72 65 20 61 72  his way there ar
6380: 65 20 6e 65 76 65 72 20 6d 6f 72 65 20 0a 20 20  e never more .  
6390: 20 20 2a 2a 20 74 68 61 6e 20 4c 49 4d 49 54 2b    ** than LIMIT+
63a0: 4f 46 46 53 45 54 20 69 74 65 6d 73 20 69 6e 20  OFFSET items in 
63b0: 74 68 65 20 73 6f 72 74 65 72 2e 0a 20 20 20 20  the sorter..    
63c0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
63d0: 20 6e 65 77 20 72 65 63 6f 72 64 20 64 6f 65 73   new record does
63e0: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
63f0: 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
6400: 65 20 73 6f 72 74 65 72 2c 0a 20 20 20 20 2a 2a  e sorter,.    **
6410: 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78   jump to the nex
6420: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
6430: 68 65 20 6c 6f 6f 70 2e 20 4f 72 2c 20 69 66 20  he loop. Or, if 
6440: 74 68 65 0a 20 20 20 20 2a 2a 20 70 53 6f 72 74  the.    ** pSort
6450: 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ->bOrderedInnerL
6460: 6f 6f 70 20 66 6c 61 67 20 69 73 20 73 65 74 20  oop flag is set 
6470: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
6480: 20 74 68 65 20 69 6e 6e 65 72 0a 20 20 20 20 2a   the inner.    *
6490: 2a 20 6c 6f 6f 70 20 64 65 6c 69 76 65 72 73 20  * loop delivers 
64a0: 69 74 65 6d 73 20 69 6e 20 73 6f 72 74 65 64 20  items in sorted 
64b0: 6f 72 64 65 72 2c 20 6a 75 6d 70 20 74 6f 20 74  order, jump to t
64c0: 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
64d0: 6e 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  n.    ** of the 
64e0: 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 20 20  outer loop..    
64f0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 73 72 20  */.    int iCsr 
6500: 3d 20 70 53 6f 72 74 2d 3e 69 45 43 75 72 73 6f  = pSort->iECurso
6510: 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  r;.    sqlite3Vd
6520: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6530: 66 4e 6f 74 5a 65 72 6f 2c 20 69 4c 69 6d 69 74  fNotZero, iLimit
6540: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
6550: 72 65 6e 74 41 64 64 72 28 76 29 2b 34 29 3b 0a  rentAddr(v)+4);.
6560: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
6570: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
6580: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6590: 5f 4c 61 73 74 2c 20 69 43 73 72 2c 20 30 29 3b  _Last, iCsr, 0);
65a0: 0a 20 20 20 20 69 53 6b 69 70 20 3d 20 73 71 6c  .    iSkip = sql
65b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
65c0: 74 28 76 2c 20 4f 50 5f 49 64 78 4c 45 2c 0a 20  t(v, OP_IdxLE,. 
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65f0: 69 43 73 72 2c 20 30 2c 20 72 65 67 42 61 73 65  iCsr, 0, regBase
6600: 2b 6e 4f 42 53 61 74 2c 20 6e 45 78 70 72 2d 6e  +nOBSat, nExpr-n
6610: 4f 42 53 61 74 29 3b 0a 20 20 20 20 56 64 62 65  OBSat);.    Vdbe
6620: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
6630: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6640: 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c  p1(v, OP_Delete,
6650: 20 69 43 73 72 29 3b 0a 20 20 7d 0a 20 20 69 66   iCsr);.  }.  if
6660: 28 20 72 65 67 52 65 63 6f 72 64 3d 3d 30 20 29  ( regRecord==0 )
6670: 7b 0a 20 20 20 20 72 65 67 52 65 63 6f 72 64 20  {.    regRecord 
6680: 3d 20 6d 61 6b 65 53 6f 72 74 65 72 52 65 63 6f  = makeSorterReco
6690: 72 64 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  rd(pParse, pSort
66a0: 2c 20 70 53 65 6c 65 63 74 2c 20 72 65 67 42 61  , pSelect, regBa
66b0: 73 65 2c 20 6e 42 61 73 65 29 3b 0a 20 20 7d 0a  se, nBase);.  }.
66c0: 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f 72    if( pSort->sor
66d0: 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c 41  tFlags & SORTFLA
66e0: 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  G_UseSorter ){. 
66f0: 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65     op = OP_Sorte
6700: 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65  rInsert;.  }else
6710: 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64  {.    op = OP_Id
6720: 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73  xInsert;.  }.  s
6730: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
6740: 49 6e 74 28 76 2c 20 6f 70 2c 20 70 53 6f 72 74  Int(v, op, pSort
6750: 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52  ->iECursor, regR
6760: 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ecord,.         
6770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
6780: 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42  gBase+nOBSat, nB
6790: 61 73 65 2d 6e 4f 42 53 61 74 29 3b 0a 20 20 69  ase-nOBSat);.  i
67a0: 66 28 20 69 53 6b 69 70 20 29 7b 0a 20 20 20 20  f( iSkip ){.    
67b0: 61 73 73 65 72 74 28 20 70 53 6f 72 74 2d 3e 62  assert( pSort->b
67c0: 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70  OrderedInnerLoop
67d0: 3d 3d 30 20 7c 7c 20 70 53 6f 72 74 2d 3e 62 4f  ==0 || pSort->bO
67e0: 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3d  rderedInnerLoop=
67f0: 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =1 );.    sqlite
6800: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
6810: 20 69 53 6b 69 70 2c 0a 20 20 20 20 20 20 20 20   iSkip,.        
6820: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
6830: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 70 53 6f  entAddr(v) + pSo
6840: 72 74 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65  rt->bOrderedInne
6850: 72 4c 6f 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  rLoop);.  }.}../
6860: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 6f  *.** Add code to
6870: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 4f   implement the O
6880: 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74 69 63 20  FFSET.*/.static 
6890: 76 6f 69 64 20 63 6f 64 65 4f 66 66 73 65 74 28  void codeOffset(
68a0: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
68b0: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
68c0: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
68d0: 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66  VM */.  int iOff
68e0: 73 65 74 2c 20 20 20 20 20 20 2f 2a 20 52 65 67  set,      /* Reg
68f0: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68  ister holding th
6900: 65 20 6f 66 66 73 65 74 20 63 6f 75 6e 74 65 72  e offset counter
6910: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69   */.  int iConti
6920: 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  nue     /* Jump 
6930: 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 65  here to skip the
6940: 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64 20   current record 
6950: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 4f 66 66  */.){.  if( iOff
6960: 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  set>0 ){.    sql
6970: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6980: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66  , OP_IfPos, iOff
6990: 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  set, iContinue, 
69a0: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
69b0: 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  (v);.    VdbeCom
69c0: 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54  ment((v, "OFFSET
69d0: 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  "));.  }.}../*.*
69e0: 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20  * Add code that 
69f0: 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61  will check to ma
6a00: 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65  ke sure the N re
6a10: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
6a20: 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d   at iMem.** form
6a30: 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72   a distinct entr
6a40: 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f  y.  iTab is a so
6a50: 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
6a60: 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c   holds previousl
6a70: 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e  y.** seen combin
6a80: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20  ations of the N 
6a90: 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65  values.  A new e
6aa0: 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20  ntry is made in 
6ab0: 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63  iTab.** if the c
6ac0: 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20  urrent N values 
6ad0: 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41  are new..**.** A
6ae0: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70   jump to addrRep
6af0: 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20  eat is made and 
6b00: 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61  the N+1 values a
6b10: 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  re popped from t
6b20: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74  he.** stack if t
6b30: 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74  he top N element
6b40: 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e  s are not distin
6b50: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
6b60: 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28  id codeDistinct(
6b70: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6b80: 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
6b90: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
6ba0: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
6bb0: 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20    int iTab,     
6bc0: 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e       /* A sortin
6bd0: 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20  g index used to 
6be0: 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63  test for distinc
6bf0: 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61  tness */.  int a
6c00: 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a  ddrRepeat,    /*
6c10: 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66   Jump to here if
6c20: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f   not distinct */
6c30: 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
6c40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6c50: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  of elements */. 
6c60: 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20   int iMem       
6c70: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65      /* First ele
6c80: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  ment */.){.  Vdb
6c90: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a  e *v;.  int r1;.
6ca0: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
6cb0: 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c  Vdbe;.  r1 = sql
6cc0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
6cd0: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
6ce0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
6cf0: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62  , OP_Found, iTab
6d00: 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d  , addrRepeat, iM
6d10: 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43 6f 76 65  em, N); VdbeCove
6d20: 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74  rage(v);.  sqlit
6d30: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6d40: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69  OP_MakeRecord, i
6d50: 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73  Mem, N, r1);.  s
6d60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
6d70: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
6d80: 65 72 74 2c 20 69 54 61 62 2c 20 72 31 2c 20 69  ert, iTab, r1, i
6d90: 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74  Mem, N);.  sqlit
6da0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
6db0: 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
6dc0: 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74  RESULT);.  sqlit
6dd0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
6de0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
6df0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6e00: 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46  NABLE_SORTER_REF
6e10: 45 52 45 4e 43 45 53 0a 2f 2a 0a 2a 2a 20 54 68  ERENCES./*.** Th
6e20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
6e30: 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
6e40: 20 69 6e 6e 65 72 2d 6c 6f 6f 70 20 67 65 6e 65   inner-loop gene
6e50: 72 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c  ration for a SEL
6e60: 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
6e70: 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
6e80: 59 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 70  Y that is not op
6e90: 74 69 6d 69 7a 65 64 20 62 79 20 61 6e 20 69 6e  timized by an in
6ea0: 64 65 78 2e 20 49 74 20 0a 2a 2a 20 64 65 74 65  dex. It .** dete
6eb0: 72 6d 69 6e 65 73 20 74 68 65 20 65 78 70 72 65  rmines the expre
6ec0: 73 73 69 6f 6e 73 2c 20 69 66 20 61 6e 79 2c 20  ssions, if any, 
6ed0: 74 68 61 74 20 74 68 65 20 73 6f 72 74 65 72 2d  that the sorter-
6ee0: 72 65 66 65 72 65 6e 63 65 20 0a 2a 2a 20 6f 70  reference .** op
6ef0: 74 69 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c  timization shoul
6f00: 64 20 62 65 20 75 73 65 64 20 66 6f 72 2e 20 54  d be used for. T
6f10: 68 65 20 73 6f 72 74 65 72 2d 72 65 66 65 72 65  he sorter-refere
6f20: 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  nce optimization
6f30: 0a 2a 2a 20 69 73 20 75 73 65 64 20 66 6f 72 20  .** is used for 
6f40: 53 45 4c 45 43 54 20 71 75 65 72 69 65 73 20 6c  SELECT queries l
6f50: 69 6b 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c  ike:.**.**   SEL
6f60: 45 43 54 20 61 2c 20 62 69 67 62 6c 6f 62 20 46  ECT a, bigblob F
6f70: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
6f80: 61 20 4c 49 4d 49 54 20 31 30 0a 2a 2a 0a 2a 2a  a LIMIT 10.**.**
6f90: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
6fa0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
6fb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 22 62 69 67   expression "big
6fc0: 62 6c 6f 62 22 2c 20 74 68 65 6e 20 69 6e 73 74  blob", then inst
6fd0: 65 61 64 20 6f 66 0a 2a 2a 20 73 74 6f 72 69 6e  ead of.** storin
6fe0: 67 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  g values read fr
6ff0: 6f 6d 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  om that column i
7000: 6e 20 74 68 65 20 73 6f 72 74 65 72 20 72 65 63  n the sorter rec
7010: 6f 72 64 73 2c 20 74 68 65 20 50 4b 20 6f 66 0a  ords, the PK of.
7020: 2a 2a 20 74 68 65 20 72 6f 77 20 66 72 6f 6d 20  ** the row from 
7030: 74 61 62 6c 65 20 74 31 20 69 73 20 73 74 6f 72  table t1 is stor
7040: 65 64 20 69 6e 73 74 65 61 64 2e 20 54 68 65 6e  ed instead. Then
7050: 2c 20 61 73 20 72 65 63 6f 72 64 73 20 61 72 65  , as records are
7060: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 0a   extracted from.
7070: 2a 2a 20 74 68 65 20 73 6f 72 74 65 72 20 74 6f  ** the sorter to
7080: 20 72 65 74 75 72 6e 20 74 6f 20 74 68 65 20 75   return to the u
7090: 73 65 72 2c 20 74 68 65 20 72 65 71 75 69 72 65  ser, the require
70a0: 64 20 76 61 6c 75 65 20 6f 66 20 62 69 67 62 6c  d value of bigbl
70b0: 6f 62 20 69 73 0a 2a 2a 20 72 65 74 72 69 65 76  ob is.** retriev
70c0: 65 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  ed directly from
70d0: 20 74 61 62 6c 65 20 74 31 2e 20 49 66 20 74 68   table t1. If th
70e0: 65 20 76 61 6c 75 65 73 20 61 72 65 20 76 65 72  e values are ver
70f0: 79 20 6c 61 72 67 65 2c 20 74 68 69 73 20 0a 2a  y large, this .*
7100: 2a 20 63 61 6e 20 62 65 20 6d 6f 72 65 20 65 66  * can be more ef
7110: 66 69 63 69 65 6e 74 20 74 68 61 6e 20 73 74 6f  ficient than sto
7120: 72 69 6e 67 20 74 68 65 6d 20 64 69 72 65 63 74  ring them direct
7130: 6c 79 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72  ly in the sorter
7140: 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20   records..**.** 
7150: 54 68 65 20 45 78 70 72 4c 69 73 74 5f 69 74 65  The ExprList_ite
7160: 6d 2e 62 53 6f 72 74 65 72 52 65 66 20 66 6c 61  m.bSorterRef fla
7170: 67 20 69 73 20 73 65 74 20 66 6f 72 20 65 61 63  g is set for eac
7180: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
7190: 70 45 4c 69 73 74 20 0a 2a 2a 20 66 6f 72 20 77  pEList .** for w
71a0: 68 69 63 68 20 74 68 65 20 73 6f 72 74 65 72 2d  hich the sorter-
71b0: 72 65 66 65 72 65 6e 63 65 20 6f 70 74 69 6d 69  reference optimi
71c0: 7a 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  zation should be
71d0: 20 65 6e 61 62 6c 65 64 2e 20 0a 2a 2a 20 41 64   enabled. .** Ad
71e0: 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20  ditionally, the 
71f0: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 5d 20  pSort->aDefer[] 
7200: 61 72 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74  array is populat
7210: 65 64 20 77 69 74 68 20 65 6e 74 72 69 65 73 0a  ed with entries.
7220: 2a 2a 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  ** for all curso
7230: 72 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  rs required to e
7240: 76 61 6c 75 61 74 65 20 61 6c 6c 20 73 65 6c 65  valuate all sele
7250: 63 74 65 64 20 65 78 70 72 65 73 73 69 6f 6e 73  cted expressions
7260: 2e 20 46 69 6e 61 6c 6c 79 2e 0a 2a 2a 20 6f 75  . Finally..** ou
7270: 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 28 2a  tput variable (*
7280: 70 70 45 78 74 72 61 29 20 69 73 20 73 65 74 20  ppExtra) is set 
7290: 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  to an expression
72a0: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
72b0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
72c0: 66 6f 72 20 61 6c 6c 20 65 78 74 72 61 20 50 4b  for all extra PK
72d0: 20 76 61 6c 75 65 73 20 74 68 61 74 20 73 68 6f   values that sho
72e0: 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e  uld be stored in
72f0: 20 74 68 65 0a 2a 2a 20 73 6f 72 74 65 72 20 72   the.** sorter r
7300: 65 63 6f 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ecords..*/.stati
7310: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 45 78 70  c void selectExp
7320: 72 44 65 66 65 72 28 0a 20 20 50 61 72 73 65 20  rDefer(.  Parse 
7330: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
7340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61            /* Lea
7350: 76 65 20 61 6e 79 20 65 72 72 6f 72 20 68 65 72  ve any error her
7360: 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a  e */.  SortCtx *
7370: 70 53 6f 72 74 2c 20 20 20 20 20 20 20 20 20 20  pSort,          
7380: 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 65 72         /* Sorter
7390: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
73a0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
73c0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 73   Expressions des
73d0: 74 69 6e 65 64 20 66 6f 72 20 73 6f 72 74 65 72  tined for sorter
73e0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
73f0: 2a 70 70 45 78 74 72 61 20 20 20 20 20 20 20 20  *ppExtra        
7400: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
7410: 69 6f 6e 73 20 74 6f 20 61 70 70 65 6e 64 20 74  ions to append t
7420: 6f 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64 20  o sorter record 
7430: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
7440: 20 69 6e 74 20 6e 44 65 66 65 72 20 3d 20 30 3b   int nDefer = 0;
7450: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 78  .  ExprList *pEx
7460: 74 72 61 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  tra = 0;.  for(i
7470: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
7480: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
7490: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
74a0: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 45  tem *pItem = &pE
74b0: 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  List->a[i];.    
74c0: 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  if( pItem->u.x.i
74d0: 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 7b  OrderByCol==0 ){
74e0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
74f0: 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70  pr = pItem->pExp
7500: 72 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  r;.      Table *
7510: 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
7520: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  ab;.      if( pE
7530: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
7540: 4d 4e 20 26 26 20 70 54 61 62 20 26 26 20 21 49  MN && pTab && !I
7550: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 0a 20  sVirtual(pTab). 
7560: 20 20 20 20 20 20 26 26 20 28 70 54 61 62 2d 3e        && (pTab->
7570: 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c  aCol[pExpr->iCol
7580: 75 6d 6e 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20  umn].colFlags & 
7590: 43 4f 4c 46 4c 41 47 5f 53 4f 52 54 45 52 52 45  COLFLAG_SORTERRE
75a0: 46 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  F).      ){.    
75b0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
75c0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 44     for(j=0; j<nD
75d0: 65 66 65 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  efer; j++){.    
75e0: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 2d        if( pSort-
75f0: 3e 61 44 65 66 65 72 5b 6a 5d 2e 69 43 73 72 3d  >aDefer[j].iCsr=
7600: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29  =pExpr->iTable )
7610: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7620: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  }.        if( j=
7630: 3d 6e 44 65 66 65 72 20 29 7b 0a 20 20 20 20 20  =nDefer ){.     
7640: 20 20 20 20 20 69 66 28 20 6e 44 65 66 65 72 3d       if( nDefer=
7650: 3d 41 72 72 61 79 53 69 7a 65 28 70 53 6f 72 74  =ArraySize(pSort
7660: 2d 3e 61 44 65 66 65 72 29 20 29 7b 0a 20 20 20  ->aDefer) ){.   
7670: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
7680: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  e;.          }el
7690: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
76a0: 69 6e 74 20 6e 4b 65 79 20 3d 20 31 3b 0a 20 20  int nKey = 1;.  
76b0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
76c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 64  .            Ind
76d0: 65 78 20 2a 70 50 6b 20 3d 20 30 3b 0a 20 20 20  ex *pPk = 0;.   
76e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 48 61           if( !Ha
76f0: 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a  sRowid(pTab) ){.
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
7710: 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
7720: 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
7730: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7740: 6e 4b 65 79 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79  nKey = pPk->nKey
7750: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
7760: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 66   }.            f
7770: 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20  or(k=0; k<nKey; 
7780: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
7790: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
77a0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
77b0: 61 72 73 65 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c  arse, TK_COLUMN,
77c0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
77d0: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
77e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
77f0: 20 20 70 4e 65 77 2d 3e 69 54 61 62 6c 65 20 3d    pNew->iTable =
7800: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a   pExpr->iTable;.
7810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7820: 70 4e 65 77 2d 3e 70 54 61 62 20 3d 20 70 45 78  pNew->pTab = pEx
7830: 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  pr->pTab;.      
7840: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
7850: 69 43 6f 6c 75 6d 6e 20 3d 20 70 50 6b 20 3f 20  iColumn = pPk ? 
7860: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  pPk->aiColumn[k]
7870: 20 3a 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   : -1;.         
7880: 20 20 20 20 20 20 20 70 45 78 74 72 61 20 3d 20         pExtra = 
7890: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
78a0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 45  ppend(pParse, pE
78b0: 78 74 72 61 2c 20 70 4e 65 77 29 3b 0a 20 20 20  xtra, pNew);.   
78c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
78d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
78e0: 20 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44         pSort->aD
78f0: 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e 70 54 61  efer[nDefer].pTa
7900: 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
7910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 6f  .            pSo
7920: 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44 65 66 65  rt->aDefer[nDefe
7930: 72 5d 2e 69 43 73 72 20 3d 20 70 45 78 70 72 2d  r].iCsr = pExpr-
7940: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
7950: 20 20 20 20 20 70 53 6f 72 74 2d 3e 61 44 65 66       pSort->aDef
7960: 65 72 5b 6e 44 65 66 65 72 5d 2e 6e 4b 65 79 20  er[nDefer].nKey 
7970: 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  = nKey;.        
7980: 20 20 20 20 6e 44 65 66 65 72 2b 2b 3b 0a 20 20      nDefer++;.  
7990: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
79a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 49 74 65    }.        pIte
79b0: 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66 20 3d 20  m->bSorterRef = 
79c0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
79d0: 0a 20 20 7d 0a 20 20 70 53 6f 72 74 2d 3e 6e 44  .  }.  pSort->nD
79e0: 65 66 65 72 20 3d 20 28 75 38 29 6e 44 65 66 65  efer = (u8)nDefe
79f0: 72 3b 0a 20 20 2a 70 70 45 78 74 72 61 20 3d 20  r;.  *ppExtra = 
7a00: 70 45 78 74 72 61 3b 0a 7d 0a 23 65 6e 64 69 66  pExtra;.}.#endif
7a10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
7a20: 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74  tine generates t
7a30: 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  he code for the 
7a40: 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69 6e  inside of the in
7a50: 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 61  ner loop.** of a
7a60: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 49   SELECT..**.** I
7a70: 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67 61  f srcTab is nega
7a80: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20 70  tive, then the p
7a90: 2d 3e 70 45 4c 69 73 74 20 65 78 70 72 65 73 73  ->pEList express
7aa0: 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c  ions.** are eval
7ab0: 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uated in order t
7ac0: 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66  o get the data f
7ad0: 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66  or this row.  If
7ae0: 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65   srcTab is.** ze
7af0: 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e  ro or more, then
7b00: 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20   data is pulled 
7b10: 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20  from srcTab and 
7b20: 70 2d 3e 70 45 4c 69 73 74 20 69 73 20 75 73 65  p->pEList is use
7b30: 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65  d only .** to ge
7b40: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
7b50: 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68 65 20  columns and the 
7b60: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
7b70: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
7b80: 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mn..*/.static vo
7b90: 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  id selectInnerLo
7ba0: 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  op(.  Parse *pPa
7bb0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
7bc0: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
7bd0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
7be0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
7bf0: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65   /* The complete
7c00: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
7c10: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
7c20: 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20  .  int srcTab,  
7c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75             /* Pu
7c40: 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  ll data from thi
7c50: 73 20 74 61 62 6c 65 20 69 66 20 6e 6f 6e 2d 6e  s table if non-n
7c60: 65 67 61 74 69 76 65 20 2a 2f 0a 20 20 53 6f 72  egative */.  Sor
7c70: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
7c80: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
7c90: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
7ca0: 20 74 6f 20 70 72 6f 63 65 73 73 20 4f 52 44 45   to process ORDE
7cb0: 52 20 42 59 20 2a 2f 0a 20 20 44 69 73 74 69 6e  R BY */.  Distin
7cc0: 63 74 43 74 78 20 2a 70 44 69 73 74 69 6e 63 74  ctCtx *pDistinct
7cd0: 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  , /* If not NULL
7ce0: 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  , info on how to
7cf0: 20 70 72 6f 63 65 73 73 20 44 49 53 54 49 4e 43   process DISTINC
7d00: 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  T */.  SelectDes
7d10: 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f  t *pDest,      /
7d20: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
7d30: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   of the results 
7d40: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e  */.  int iContin
7d50: 75 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ue,          /* 
7d60: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
7d70: 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
7d80: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72  row */.  int iBr
7d90: 65 61 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  eak             
7da0: 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
7db0: 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
7dc0: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  e inner loop */.
7dd0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
7de0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
7df0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73  int i;.  int has
7e00: 44 69 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20  Distinct;       
7e10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
7e20: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
7e30: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
7e40: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
7e50: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20   pDest->eDest;  
7e60: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
7e70: 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f  se of results */
7e80: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
7e90: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f  Dest->iSDParm; /
7ea0: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
7eb0: 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74   to disposal met
7ec0: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  hod */.  int nRe
7ed0: 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  sultCol;        
7ee0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7ef0: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
7f00: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72 65 66 69   */.  int nPrefi
7f10: 78 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  xReg = 0;       
7f20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
7f30: 78 74 72 61 20 72 65 67 69 73 74 65 72 73 20 62  xtra registers b
7f40: 65 66 6f 72 65 20 72 65 67 52 65 73 75 6c 74 20  efore regResult 
7f50: 2a 2f 0a 20 20 52 6f 77 4c 6f 61 64 49 6e 66 6f  */.  RowLoadInfo
7f60: 20 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 20 20   sRowLoadInfo;  
7f70: 20 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 64 65 66   /* Info for def
7f80: 65 72 72 65 64 20 72 6f 77 20 6c 6f 61 64 69 6e  erred row loadin
7f90: 67 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 75 61 6c  g */..  /* Usual
7fa0: 6c 79 2c 20 72 65 67 52 65 73 75 6c 74 20 69 73  ly, regResult is
7fb0: 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
7fc0: 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6d  in an array of m
7fd0: 65 6d 6f 72 79 20 63 65 6c 6c 73 0a 20 20 2a 2a  emory cells.  **
7fe0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
7ff0: 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 20 72  current result r
8000: 6f 77 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ow. In this case
8010: 20 72 65 67 4f 72 69 67 20 69 73 20 73 65 74 20   regOrig is set 
8020: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  to the.  ** same
8030: 20 76 61 6c 75 65 2e 20 48 6f 77 65 76 65 72 2c   value. However,
8040: 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73 20   if the results 
8050: 61 72 65 20 62 65 69 6e 67 20 73 65 6e 74 20 74  are being sent t
8060: 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 20 74 68  o the sorter, th
8070: 65 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 66 6f  e.  ** values fo
8080: 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  r any expression
8090: 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20  s that are also 
80a0: 70 61 72 74 20 6f 66 20 74 68 65 20 73 6f 72 74  part of the sort
80b0: 2d 6b 65 79 20 61 72 65 20 6f 6d 69 74 74 65 64  -key are omitted
80c0: 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 69 73 20  .  ** from this 
80d0: 61 72 72 61 79 2e 20 49 6e 20 74 68 69 73 20 63  array. In this c
80e0: 61 73 65 20 72 65 67 4f 72 69 67 20 69 73 20 73  ase regOrig is s
80f0: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 2a 2f 0a  et to zero.  */.
8100: 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74 3b    int regResult;
8110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8120: 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79   Start of memory
8130: 20 68 6f 6c 64 69 6e 67 20 63 75 72 72 65 6e 74   holding current
8140: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
8150: 74 20 72 65 67 4f 72 69 67 3b 20 20 20 20 20 20  t regOrig;      
8160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
8170: 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c  rt of memory hol
8180: 64 69 6e 67 20 66 75 6c 6c 20 72 65 73 75 6c 74  ding full result
8190: 20 28 6f 72 20 30 29 20 2a 2f 0a 0a 20 20 61 73   (or 0) */..  as
81a0: 73 65 72 74 28 20 76 20 29 3b 0a 20 20 61 73 73  sert( v );.  ass
81b0: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d  ert( p->pEList!=
81c0: 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e  0 );.  hasDistin
81d0: 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f  ct = pDistinct ?
81e0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63   pDistinct->eTnc
81f0: 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49  tType : WHERE_DI
8200: 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69  STINCT_NOOP;.  i
8210: 66 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f 72  f( pSort && pSor
8220: 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t->pOrderBy==0 )
8230: 20 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69 66   pSort = 0;.  if
8240: 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21 68  ( pSort==0 && !h
8250: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
8260: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74 69    assert( iConti
8270: 6e 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63 6f  nue!=0 );.    co
8280: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
8290: 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75  Offset, iContinu
82a0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75  e);.  }..  /* Pu
82b0: 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ll the requested
82c0: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20   columns..  */. 
82d0: 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 2d   nResultCol = p-
82e0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
82f0: 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53  .  if( pDest->iS
8300: 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  dst==0 ){.    if
8310: 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  ( pSort ){.     
8320: 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20 70 53   nPrefixReg = pS
8330: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  ort->pOrderBy->n
8340: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
8350: 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61  !(pSort->sortFla
8360: 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73  gs & SORTFLAG_Us
8370: 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72 65 66  eSorter) ) nPref
8380: 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20 70  ixReg++;.      p
8390: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
83a0: 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20 20 7d  PrefixReg;.    }
83b0: 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73  .    pDest->iSds
83c0: 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  t = pParse->nMem
83d0: 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
83e0: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
83f0: 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ol;.  }else if( 
8400: 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52 65  pDest->iSdst+nRe
8410: 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73 65  sultCol > pParse
8420: 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f 2a  ->nMem ){.    /*
8430: 20 54 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f   This is an erro
8440: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61 74  r condition that
8450: 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f 72   can result, for
8460: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61   example, when a
8470: 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 6f   SELECT.    ** o
8480: 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  n the right-hand
8490: 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e 53 45   side of an INSE
84a0: 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65  RT contains more
84b0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
84c0: 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72  than.    ** ther
84d0: 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69 6e  e are columns in
84e0: 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
84f0: 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65 72 72  e left.  The err
8500: 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67 68  or will be caugh
8510: 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 70  t.    ** and rep
8520: 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20 42 75  orted later.  Bu
8530: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b  t we need to mak
8540: 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20 6d 65  e sure enough me
8550: 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74 65  mory is allocate
8560: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69  d.    ** to avoi
8570: 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f 75 73  d other spurious
8580: 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20 6d   errors in the m
8590: 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20 20  eantime. */.    
85a0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
85b0: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 0a  nResultCol;.  }.
85c0: 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
85d0: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 72   nResultCol;.  r
85e0: 65 67 4f 72 69 67 20 3d 20 72 65 67 52 65 73 75  egOrig = regResu
85f0: 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64 73  lt = pDest->iSds
8600: 74 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62 3e  t;.  if( srcTab>
8610: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 ){.    for(i=
8620: 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b  0; i<nResultCol;
8630: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
8640: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8650: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63  , OP_Column, src
8660: 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c  Tab, i, regResul
8670: 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62 65  t+i);.      Vdbe
8680: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22  Comment((v, "%s"
8690: 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69  , p->pEList->a[i
86a0: 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  ].zName));.    }
86b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65  .  }else if( eDe
86c0: 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29  st!=SRT_Exists )
86d0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
86e0: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
86f0: 46 45 52 45 4e 43 45 53 0a 20 20 20 20 45 78 70  FERENCES.    Exp
8700: 72 4c 69 73 74 20 2a 70 45 78 74 72 61 20 3d 20  rList *pExtra = 
8710: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a  0;.#endif.    /*
8720: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
8730: 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53  ion is an EXISTS
8740: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
8750: 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20  , the actual.   
8760: 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72   ** values retur
8770: 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
8780: 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72  T are not requir
8790: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ed..    */.    u
87a0: 38 20 65 63 65 6c 46 6c 61 67 73 3b 20 20 20 20  8 ecelFlags;    
87b0: 2f 2a 20 22 65 63 65 6c 22 20 69 73 20 61 6e 20  /* "ecel" is an 
87c0: 61 62 62 72 65 76 69 61 74 69 6f 6e 20 6f 66 20  abbreviation of 
87d0: 22 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  "ExprCodeExprLis
87e0: 74 22 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69  t" */.    ExprLi
87f0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
8800: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d  if( eDest==SRT_M
8810: 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  em || eDest==SRT
8820: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
8830: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
8840: 29 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61  ){.      ecelFla
8850: 67 73 20 3d 20 53 51 4c 49 54 45 5f 45 43 45 4c  gs = SQLITE_ECEL
8860: 5f 44 55 50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  _DUP;.    }else{
8870: 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61 67 73  .      ecelFlags
8880: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
8890: 69 66 28 20 70 53 6f 72 74 20 26 26 20 68 61 73  if( pSort && has
88a0: 44 69 73 74 69 6e 63 74 3d 3d 30 20 26 26 20 65  Distinct==0 && e
88b0: 44 65 73 74 21 3d 53 52 54 5f 45 70 68 65 6d 54  Dest!=SRT_EphemT
88c0: 61 62 20 26 26 20 65 44 65 73 74 21 3d 53 52 54  ab && eDest!=SRT
88d0: 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  _Table ){.      
88e0: 2f 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  /* For each expr
88f0: 65 73 73 69 6f 6e 20 69 6e 20 70 2d 3e 70 45 4c  ession in p->pEL
8900: 69 73 74 20 74 68 61 74 20 69 73 20 61 20 63 6f  ist that is a co
8910: 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  py of an express
8920: 69 6f 6e 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ion in.      ** 
8930: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
8940: 75 73 65 20 28 70 53 6f 72 74 2d 3e 70 4f 72 64  use (pSort->pOrd
8950: 65 72 42 79 29 2c 20 73 65 74 20 74 68 65 20 61  erBy), set the a
8960: 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20 20  ssociated .     
8970: 20 2a 2a 20 69 4f 72 64 65 72 42 79 43 6f 6c 20   ** iOrderByCol 
8980: 76 61 6c 75 65 20 74 6f 20 6f 6e 65 20 6d 6f 72  value to one mor
8990: 65 20 74 68 61 6e 20 74 68 65 20 69 6e 64 65 78  e than the index
89a0: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
89b0: 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65   .      ** expre
89c0: 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 65  ssion within the
89d0: 20 73 6f 72 74 2d 6b 65 79 20 74 68 61 74 20 70   sort-key that p
89e0: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 29 20  ushOntoSorter() 
89f0: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20  will generate.. 
8a00: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 61 6c 6c       ** This all
8a10: 6f 77 73 20 74 68 65 20 70 2d 3e 70 45 4c 69 73  ows the p->pELis
8a20: 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20 6f 6d  t field to be om
8a30: 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  itted from the s
8a40: 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a 20 20  orted record,.  
8a50: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 73 70      ** saving sp
8a60: 61 63 65 20 61 6e 64 20 43 50 55 20 63 79 63 6c  ace and CPU cycl
8a70: 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 65 63  es.  */.      ec
8a80: 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49  elFlags |= (SQLI
8a90: 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45 46 7c  TE_ECEL_OMITREF|
8aa0: 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45 46 29  SQLITE_ECEL_REF)
8ab0: 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  ;..      for(i=p
8ac0: 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69 3c  Sort->nOBSat; i<
8ad0: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d  pSort->pOrderBy-
8ae0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
8af0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
8b00: 20 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70 53       if( (j = pS
8b10: 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61  ort->pOrderBy->a
8b20: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
8b30: 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  Col)>0 ){.      
8b40: 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61      p->pEList->a
8b50: 5b 6a 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  [j-1].u.x.iOrder
8b60: 42 79 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f 72  ByCol = i+1-pSor
8b70: 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20 20  t->nOBSat;.     
8b80: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
8b90: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
8ba0: 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e  E_SORTER_REFEREN
8bb0: 43 45 53 0a 20 20 20 20 20 20 73 65 6c 65 63 74  CES.      select
8bc0: 45 78 70 72 44 65 66 65 72 28 70 50 61 72 73 65  ExprDefer(pParse
8bd0: 2c 20 70 53 6f 72 74 2c 20 70 2d 3e 70 45 4c 69  , pSort, p->pELi
8be0: 73 74 2c 20 26 70 45 78 74 72 61 29 3b 0a 20 20  st, &pExtra);.  
8bf0: 20 20 20 20 69 66 28 20 70 45 78 74 72 61 20 26      if( pExtra &
8c00: 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  & pParse->db->ma
8c10: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
8c20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
8c30: 68 65 72 65 20 61 72 65 20 61 6e 79 20 65 78 74  here are any ext
8c40: 72 61 20 50 4b 20 63 6f 6c 75 6d 6e 73 20 74 6f  ra PK columns to
8c50: 20 61 64 64 20 74 6f 20 74 68 65 20 73 6f 72 74   add to the sort
8c60: 65 72 20 72 65 63 6f 72 64 73 2c 0a 20 20 20 20  er records,.    
8c70: 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20      ** allocate 
8c80: 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 63 65 6c  extra memory cel
8c90: 6c 73 20 61 6e 64 20 61 64 6a 75 73 74 20 74 68  ls and adjust th
8ca0: 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  e OpenEphemeral 
8cb0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 74  .        ** inst
8cc0: 72 75 63 74 69 6f 6e 20 74 6f 20 61 63 63 6f 75  ruction to accou
8cd0: 6e 74 20 66 6f 72 20 74 68 65 20 6c 61 72 67 65  nt for the large
8ce0: 72 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  r records. This 
8cf0: 69 73 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20 20  is only.        
8d00: 2a 2a 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ** required if t
8d10: 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
8d20: 6d 6f 72 65 20 57 49 54 48 4f 55 54 20 52 4f 57  more WITHOUT ROW
8d30: 49 44 20 74 61 62 6c 65 73 20 77 69 74 68 0a 20  ID tables with. 
8d40: 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6f 73         ** compos
8d50: 69 74 65 20 70 72 69 6d 61 72 79 20 6b 65 79 73  ite primary keys
8d60: 20 69 6e 20 74 68 65 20 53 6f 72 74 43 74 78 2e   in the SortCtx.
8d70: 61 44 65 66 65 72 5b 5d 20 61 72 72 61 79 2e 20  aDefer[] array. 
8d80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 56 64 62 65   */.        Vdbe
8d90: 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65  Op *pOp = sqlite
8da0: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 53  3VdbeGetOp(v, pS
8db0: 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64  ort->addrSortInd
8dc0: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ex);.        pOp
8dd0: 2d 3e 70 32 20 2b 3d 20 28 70 45 78 74 72 61 2d  ->p2 += (pExtra-
8de0: 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d 3e  >nExpr - pSort->
8df0: 6e 44 65 66 65 72 29 3b 0a 20 20 20 20 20 20 20  nDefer);.       
8e00: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
8e10: 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 2b 3d 20  o->nAllField += 
8e20: 28 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 20 2d  (pExtra->nExpr -
8e30: 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 29 3b   pSort->nDefer);
8e40: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
8e50: 3e 6e 4d 65 6d 20 2b 3d 20 70 45 78 74 72 61 2d  >nMem += pExtra-
8e60: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a  >nExpr;.      }.
8e70: 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a  #endif..      /*
8e80: 20 41 64 6a 75 73 74 20 6e 52 65 73 75 6c 74 43   Adjust nResultC
8e90: 6f 6c 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  ol to account fo
8ea0: 72 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61  r columns that a
8eb0: 72 65 20 6f 6d 69 74 74 65 64 0a 20 20 20 20 20  re omitted.     
8ec0: 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 6f 72   ** from the sor
8ed0: 74 65 72 20 62 79 20 74 68 65 20 6f 70 74 69 6d  ter by the optim
8ee0: 69 7a 61 74 69 6f 6e 73 20 69 6e 20 74 68 69 73  izations in this
8ef0: 20 62 72 61 6e 63 68 20 2a 2f 0a 20 20 20 20 20   branch */.     
8f00: 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
8f10: 69 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ist;.      for(i
8f20: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
8f30: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
8f40: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
8f50: 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  [i].u.x.iOrderBy
8f60: 43 6f 6c 3e 30 0a 23 69 66 64 65 66 20 53 51 4c  Col>0.#ifdef SQL
8f70: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45  ITE_ENABLE_SORTE
8f80: 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20  R_REFERENCES.   
8f90: 20 20 20 20 20 20 7c 7c 20 70 45 4c 69 73 74 2d        || pEList-
8fa0: 3e 61 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65 66  >a[i].bSorterRef
8fb0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
8fc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 52 65  ){.          nRe
8fd0: 73 75 6c 74 43 6f 6c 2d 2d 3b 0a 20 20 20 20 20  sultCol--;.     
8fe0: 20 20 20 20 20 72 65 67 4f 72 69 67 20 3d 20 30       regOrig = 0
8ff0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9000: 20 20 7d 0a 0a 20 20 20 20 20 20 74 65 73 74 63    }..      testc
9010: 61 73 65 28 20 72 65 67 4f 72 69 67 20 29 3b 0a  ase( regOrig );.
9020: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9030: 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 29  eDest==SRT_Set )
9040: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
9050: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d  ( eDest==SRT_Mem
9060: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
9070: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  se( eDest==SRT_C
9080: 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20  oroutine );.    
9090: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
90a0: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
90b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
90c0: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 20 7c 7c  Dest==SRT_Set ||
90d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20   eDest==SRT_Mem 
90e0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65  .           || e
90f0: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
9100: 69 6e 65 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  ine || eDest==SR
9110: 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20  T_Output );.    
9120: 7d 0a 20 20 20 20 73 52 6f 77 4c 6f 61 64 49 6e  }.    sRowLoadIn
9130: 66 6f 2e 72 65 67 52 65 73 75 6c 74 20 3d 20 72  fo.regResult = r
9140: 65 67 52 65 73 75 6c 74 3b 0a 20 20 20 20 73 52  egResult;.    sR
9150: 6f 77 4c 6f 61 64 49 6e 66 6f 2e 65 63 65 6c 46  owLoadInfo.ecelF
9160: 6c 61 67 73 20 3d 20 65 63 65 6c 46 6c 61 67 73  lags = ecelFlags
9170: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
9180: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
9190: 46 45 52 45 4e 43 45 53 0a 20 20 20 20 73 52 6f  FERENCES.    sRo
91a0: 77 4c 6f 61 64 49 6e 66 6f 2e 70 45 78 74 72 61  wLoadInfo.pExtra
91b0: 20 3d 20 70 45 78 74 72 61 3b 0a 20 20 20 20 73   = pExtra;.    s
91c0: 52 6f 77 4c 6f 61 64 49 6e 66 6f 2e 72 65 67 45  RowLoadInfo.regE
91d0: 78 74 72 61 52 65 73 75 6c 74 20 3d 20 72 65 67  xtraResult = reg
91e0: 52 65 73 75 6c 74 20 2b 20 6e 52 65 73 75 6c 74  Result + nResult
91f0: 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 70 45 78  Col;.    if( pEx
9200: 74 72 61 20 29 20 6e 52 65 73 75 6c 74 43 6f 6c  tra ) nResultCol
9210: 20 2b 3d 20 70 45 78 74 72 61 2d 3e 6e 45 78 70   += pExtra->nExp
9220: 72 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  r;.#endif.    if
9230: 28 20 70 2d 3e 69 4c 69 6d 69 74 0a 20 20 20 20  ( p->iLimit.    
9240: 20 26 26 20 28 65 63 65 6c 46 6c 61 67 73 20 26   && (ecelFlags &
9250: 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49   SQLITE_ECEL_OMI
9260: 54 52 45 46 29 21 3d 30 20 0a 20 20 20 20 20 26  TREF)!=0 .     &
9270: 26 20 6e 50 72 65 66 69 78 52 65 67 3e 30 0a 20  & nPrefixReg>0. 
9280: 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
9290: 72 74 28 20 70 53 6f 72 74 21 3d 30 20 29 3b 0a  rt( pSort!=0 );.
92a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 68 61        assert( ha
92b0: 73 44 69 73 74 69 6e 63 74 3d 3d 30 20 29 3b 0a  sDistinct==0 );.
92c0: 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 70 44 65        pSort->pDe
92d0: 66 65 72 72 65 64 52 6f 77 4c 6f 61 64 20 3d 20  ferredRowLoad = 
92e0: 26 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 3b 0a 20  &sRowLoadInfo;. 
92f0: 20 20 20 20 20 72 65 67 4f 72 69 67 20 3d 20 30       regOrig = 0
9300: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9310: 20 20 20 69 6e 6e 65 72 4c 6f 6f 70 4c 6f 61 64     innerLoopLoad
9320: 52 6f 77 28 70 50 61 72 73 65 2c 20 70 2c 20 26  Row(pParse, p, &
9330: 73 52 6f 77 4c 6f 61 64 49 6e 66 6f 29 3b 0a 20  sRowLoadInfo);. 
9340: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
9350: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
9360: 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65  eyword was prese
9370: 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  nt on the SELECT
9380: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
9390: 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73  and this row has
93a0: 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72   been seen befor
93b0: 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d  e, then do not m
93c0: 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a  ake this row.  *
93d0: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65  * part of the re
93e0: 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
93f0: 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a   hasDistinct ){.
9400: 20 20 20 20 73 77 69 74 63 68 28 20 70 44 69 73      switch( pDis
9410: 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65  tinct->eTnctType
9420: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57   ){.      case W
9430: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
9440: 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20  DERED: {.       
9450: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20   VdbeOp *pOp;   
9460: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c           /* No l
9470: 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20 4f  onger required O
9480: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
9490: 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  tr. */.        i
94a0: 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20  nt iJump;       
94b0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64         /* Jump d
94c0: 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20  estination */.  
94d0: 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 72 65        int regPre
94e0: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  v;            /*
94f0: 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f   Previous row co
9500: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20  ntent */..      
9510: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
9520: 61 63 65 20 66 6f 72 20 74 68 65 20 70 72 65 76  ace for the prev
9530: 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20  ious row */.    
9540: 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50      regPrev = pP
9550: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20  arse->nMem+1;.  
9560: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
9570: 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  em += nResultCol
9580: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ;..        /* Ch
9590: 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
95a0: 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20  Ephemeral coded 
95b0: 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50  earlier to an OP
95c0: 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  _Null.        **
95d0: 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c   sets the MEM_Cl
95e0: 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65  eared bit on the
95f0: 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
9600: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
9610: 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  * previous value
9620: 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
9630: 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c  se the OP_Ne bel
9640: 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20  ow to always.   
9650: 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20       ** fail on 
9660: 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
9670: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ion of the loop 
9680: 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72 73  even if the firs
9690: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77  t.        ** row
96a0: 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20   is all NULLs.. 
96b0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
96c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
96d0: 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69  ngeToNoop(v, pDi
96e0: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
96f0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d  );.        pOp =
9700: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
9710: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
9720: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
9730: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
9740: 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20   OP_Null;.      
9750: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20    pOp->p1 = 1;. 
9760: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d         pOp->p2 =
9770: 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20   regPrev;..     
9780: 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74     iJump = sqlit
9790: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
97a0: 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f  r(v) + nResultCo
97b0: 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  l;.        for(i
97c0: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
97d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
97e0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
97f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
9800: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
9810: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  >pEList->a[i].pE
9820: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
9830: 69 66 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  if( i<nResultCol
9840: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
9850: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9860: 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65  Op3(v, OP_Ne, re
9870: 67 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70  gResult+i, iJump
9880: 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20  , regPrev+i);.  
9890: 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
98a0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
98b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
98c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
98d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
98e0: 45 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c  Eq, regResult+i,
98f0: 20 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50   iContinue, regP
9900: 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20  rev+i);.        
9910: 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
9920: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (v);.           
9930: 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
9940: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
9950: 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68  v, -1, (const ch
9960: 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
9970: 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20  OLLSEQ);.       
9980: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
9990: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
99a0: 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
99b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
99c0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43  rt( sqlite3VdbeC
99d0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69  urrentAddr(v)==i
99e0: 4a 75 6d 70 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Jump || pParse->
99f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9a00: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
9a10: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
9a20: 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73   OP_Copy, regRes
9a30: 75 6c 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52  ult, regPrev, nR
9a40: 65 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20  esultCol-1);.   
9a50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9a60: 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20    }..      case 
9a70: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
9a80: 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20  NIQUE: {.       
9a90: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
9aa0: 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73  geToNoop(v, pDis
9ab0: 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29  tinct->addrTnct)
9ac0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9ad0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
9ae0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
9af0: 20 20 20 61 73 73 65 72 74 28 20 70 44 69 73 74     assert( pDist
9b00: 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d  inct->eTnctType=
9b10: 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f  =WHERE_DISTINCT_
9b20: 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20  UNORDERED );.   
9b30: 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63       codeDistinc
9b40: 74 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69  t(pParse, pDisti
9b50: 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43  nct->tabTnct, iC
9b60: 6f 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74  ontinue, nResult
9b70: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
9b80: 20 20 20 20 20 20 20 20 20 20 72 65 67 52 65 73            regRes
9b90: 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  ult);.        br
9ba0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9bb0: 20 7d 0a 20 20 20 20 69 66 28 20 70 53 6f 72 74   }.    if( pSort
9bc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ==0 ){.      cod
9bd0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
9be0: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
9bf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
9c00: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
9c10: 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
9c20: 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68  mode, write each
9c30: 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f   query result to
9c40: 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
9c50: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a  temporary.    **
9c60: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
9c70: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
9c80: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
9c90: 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73  D_SELECT.    cas
9ca0: 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20  e SRT_Union: {. 
9cb0: 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20       int r1;.   
9cc0: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
9cd0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
9ce0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9cf0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9d00: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
9d10: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
9d20: 6f 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  ol, r1);.      s
9d30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
9d40: 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Int(v, OP_IdxIns
9d50: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20  ert, iParm, r1, 
9d60: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
9d70: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 73 71  ltCol);.      sq
9d80: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
9d90: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
9da0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9db0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73    }..    /* Cons
9dc0: 74 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66  truct a record f
9dd0: 72 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65  rom the query re
9de0: 73 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61  sult, but instea
9df0: 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69  d of.    ** savi
9e00: 6e 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20  ng that record, 
9e10: 75 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20  use it as a key 
9e20: 74 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e  to delete elemen
9e30: 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ts from.    ** t
9e40: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
9e50: 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f  le iParm..    */
9e60: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78  .    case SRT_Ex
9e70: 63 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71  cept: {.      sq
9e80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9e90: 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c  v, OP_IdxDelete,
9ea0: 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c   iParm, regResul
9eb0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
9ec0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9ed0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
9ee0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
9ef0: 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20  D_SELECT */..   
9f00: 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
9f10: 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
9f20: 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
9f30: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
9f40: 20 53 52 54 5f 46 69 66 6f 3a 0a 20 20 20 20 63   SRT_Fifo:.    c
9f50: 61 73 65 20 53 52 54 5f 44 69 73 74 46 69 66 6f  ase SRT_DistFifo
9f60: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  :.    case SRT_T
9f70: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
9f80: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
9f90: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
9fa0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
9fb0: 65 28 70 50 61 72 73 65 2c 20 6e 50 72 65 66 69  e(pParse, nPrefi
9fc0: 78 52 65 67 2b 31 29 3b 0a 20 20 20 20 20 20 74  xReg+1);.      t
9fd0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
9fe0: 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20  SRT_Table );.   
9ff0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
a000: 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
a010: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
a020: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 46  se( eDest==SRT_F
a030: 69 66 6f 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ifo );.      tes
a040: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
a050: 54 5f 44 69 73 74 46 69 66 6f 20 29 3b 0a 20 20  T_DistFifo );.  
a060: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a070: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
a080: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
a090: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  t, nResultCol, r
a0a0: 31 2b 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 23  1+nPrefixReg);.#
a0b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a0c0: 49 54 5f 43 54 45 0a 20 20 20 20 20 20 69 66 28  IT_CTE.      if(
a0d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
a0e0: 46 69 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Fifo ){.        
a0f0: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
a100: 61 74 69 6f 6e 20 69 73 20 44 69 73 74 46 69 66  ation is DistFif
a110: 6f 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28  o, then cursor (
a120: 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e  iParm+1) is open
a130: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61  .        ** on a
a140: 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  n ephemeral inde
a150: 78 2e 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  x. If the curren
a160: 74 20 72 6f 77 20 69 73 20 61 6c 72 65 61 64 79  t row is already
a170: 20 70 72 65 73 65 6e 74 0a 20 20 20 20 20 20 20   present.       
a180: 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78   ** in the index
a190: 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69  , do not write i
a1a0: 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  t to the output.
a1b0: 20 49 66 20 6e 6f 74 2c 20 61 64 64 20 74 68 65   If not, add the
a1c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72  .        ** curr
a1d0: 65 6e 74 20 72 6f 77 20 74 6f 20 74 68 65 20 69  ent row to the i
a1e0: 6e 64 65 78 20 61 6e 64 20 70 72 6f 63 65 65 64  ndex and proceed
a1f0: 20 77 69 74 68 20 77 72 69 74 69 6e 67 20 69 74   with writing it
a200: 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   to the.        
a210: 2a 2a 20 6f 75 74 70 75 74 20 74 61 62 6c 65 20  ** output table 
a220: 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20  as well.  */.   
a230: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
a240: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
a250: 6e 74 41 64 64 72 28 76 29 20 2b 20 34 3b 0a 20  ntAddr(v) + 4;. 
a260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a270: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
a280: 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31  P_Found, iParm+1
a290: 2c 20 61 64 64 72 2c 20 72 31 2c 20 30 29 3b 0a  , addr, r1, 0);.
a2a0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
a2b0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
a2c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a2d0: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
a2e0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20  nsert, iParm+1, 
a2f0: 72 31 2c 72 65 67 52 65 73 75 6c 74 2c 6e 52 65  r1,regResult,nRe
a300: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
a310: 20 20 61 73 73 65 72 74 28 20 70 53 6f 72 74 3d    assert( pSort=
a320: 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  =0 );.      }.#e
a330: 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
a340: 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
a350: 61 73 73 65 72 74 28 20 72 65 67 52 65 73 75 6c  assert( regResul
a360: 74 3d 3d 72 65 67 4f 72 69 67 20 29 3b 0a 20 20  t==regOrig );.  
a370: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
a380: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53 6f  rter(pParse, pSo
a390: 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66 69  rt, p, r1+nPrefi
a3a0: 78 52 65 67 2c 20 72 65 67 4f 72 69 67 2c 20 31  xReg, regOrig, 1
a3b0: 2c 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  , nPrefixReg);. 
a3c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a3d0: 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
a3e0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
a3f0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
a400: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a410: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
a420: 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20  , iParm, r2);.  
a430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a440: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
a450: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c  sert, iParm, r1,
a460: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r2);.        sq
a470: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
a480: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
a490: 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ND);.        sql
a4a0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
a4b0: 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
a4c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
a4d0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
a4e0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  Range(pParse, r1
a4f0: 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b  , nPrefixReg+1);
a500: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a510: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
a520: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
a530: 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
a540: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
a550: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
a560: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
a570: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
a580: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
a590: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
a5a0: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
a5b0: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
a5c0: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
a5d0: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
a5e0: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
a5f0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
a600: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
a610: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
a620: 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74       /* At first
a630: 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c   glance you woul
a640: 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64  d think we could
a650: 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68   optimize out th
a660: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44  e.        ** ORD
a670: 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61  ER BY in this ca
a680: 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64  se since the ord
a690: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
a6a0: 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20   the set.       
a6b0: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   ** does not mat
a6c0: 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20  ter.  But there 
a6d0: 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54  might be a LIMIT
a6e0: 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63   clause, in whic
a6f0: 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73  h.        ** cas
a700: 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73  e the order does
a710: 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20   matter */.     
a720: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
a730: 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r(.            p
a740: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c  Parse, pSort, p,
a750: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f   regResult, regO
a760: 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  rig, nResultCol,
a770: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
a780: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a790: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
a7a0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
a7b0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61  arse);.        a
a7c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 74  ssert( sqlite3St
a7d0: 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41  rlen30(pDest->zA
a7e0: 66 66 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74  ffSdst)==nResult
a7f0: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73  Col );.        s
a800: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
a810: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
a820: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
a830: 65 73 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20  esultCol, .     
a840: 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74         r1, pDest
a850: 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73  ->zAffSdst, nRes
a860: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
a870: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
a880: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
a890: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
a8a0: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
a8b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a8c0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
a8d0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
a8e0: 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75  arm, r1, regResu
a8f0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
a900: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a910: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
a920: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
a930: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
a940: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
a950: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
a960: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
a970: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
a980: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
a990: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
a9a0: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
a9b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a9c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
a9d0: 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20  er, 1, iParm);. 
a9e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
a9f0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
aa00: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
aa10: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
aa20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
aa30: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
aa40: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
aa50: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
aa60: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
aa70: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
aa80: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
aa90: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
aaa0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20   memory cell or 
aab0: 61 72 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a  array of .    **
aac0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
aad0: 64 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  d break out of t
aae0: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
aaf0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
ab00: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69  T_Mem: {.      i
ab10: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
ab20: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
ab30: 75 6c 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e  ultCol<=pDest->n
ab40: 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Sdst );.        
ab50: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a  pushOntoSorter(.
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
ab70: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65  se, pSort, p, re
ab80: 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67  gResult, regOrig
ab90: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50  , nResultCol, nP
aba0: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
abb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
abc0: 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43  assert( nResultC
abd0: 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74  ol==pDest->nSdst
abe0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
abf0: 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69  rt( regResult==i
ac00: 50 61 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  Parm );.        
ac10: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
ac20: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
ac30: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
ac40: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r us */.      }.
ac50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ac60: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
ac70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ac80: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
ac90: 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
aca0: 74 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53  tine:       /* S
acb0: 65 6e 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f  end data to a co
acc0: 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  -routine */.    
acd0: 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a  case SRT_Output:
ace0: 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74   {        /* Ret
acf0: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  urn the results 
ad00: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
ad10: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
ad20: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
ad30: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
ad40: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
ad50: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
ad60: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
ad70: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
ad80: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
ad90: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
ada0: 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20  nResultCol,.    
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adc0: 20 20 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a     nPrefixReg);.
add0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ade0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
adf0: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tine ){.        
ae00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ae10: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
ae20: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
ae30: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ae40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ae50: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
ae60: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
ae70: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
ae80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
ae90: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
aea0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
aeb0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
aec0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tCol);.      }. 
aed0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aee0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
aef0: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f  E_OMIT_CTE.    /
af00: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75  * Write the resu
af10: 6c 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72  lts into a prior
af20: 69 74 79 20 71 75 65 75 65 20 74 68 61 74 20 69  ity queue that i
af30: 73 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e  s order accordin
af40: 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73  g to.    ** pDes
af50: 74 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20  t->pOrderBy (in 
af60: 70 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53  pSO).  pDest->iS
af70: 44 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29  DParm (in iParm)
af80: 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66   is the cursor f
af90: 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64  or an.    ** ind
afa0: 65 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78  ex with pSO->nEx
afb0: 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42  pr+2 columns.  B
afc0: 75 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67  uild a key using
afd0: 20 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72   pSO for the fir
afe0: 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e  st.    ** pSO->n
aff0: 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  Expr columns, th
b000: 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  en make sure all
b010: 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65   keys are unique
b020: 20 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20   by adding a.   
b030: 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71   ** final OP_Seq
b040: 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54  uence column.  T
b050: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
b060: 73 20 74 68 65 20 72 65 63 6f 72 64 20 61 73 20  s the record as 
b070: 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  a blob..    */. 
b080: 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74     case SRT_Dist
b090: 51 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20  Queue:.    case 
b0a0: 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20  SRT_Queue: {.   
b0b0: 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20     int nKey;.   
b0c0: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
b0d0: 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  3;.      int add
b0e0: 72 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  rTest = 0;.     
b0f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a   ExprList *pSO;.
b100: 20 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73        pSO = pDes
b110: 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  t->pOrderBy;.   
b120: 20 20 20 61 73 73 65 72 74 28 20 70 53 4f 20 29     assert( pSO )
b130: 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70  ;.      nKey = p
b140: 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  SO->nExpr;.     
b150: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
b160: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
b170: 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
b180: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
b190: 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b  pParse, nKey+2);
b1a0: 0a 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e  .      r3 = r2+n
b1b0: 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28  Key+1;.      if(
b1c0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
b1d0: 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Queue ){.       
b1e0: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
b1f0: 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75  nation is DistQu
b200: 65 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72  eue, then cursor
b210: 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70   (iParm+1) is op
b220: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  en.        ** on
b230: 20 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65   a second epheme
b240: 72 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68  ral index that h
b250: 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20  olds all values 
b260: 65 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79  every previously
b270: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65  .        ** adde
b280: 64 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20  d to the queue. 
b290: 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72 54  */.        addrT
b2a0: 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
b2b0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
b2c0: 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c  _Found, iParm+1,
b2d0: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
b300: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
b310: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  ol);.        Vdb
b320: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
b330: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
b340: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
b350: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
b360: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
b370: 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20  ltCol, r3);.    
b380: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
b390: 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20  _DistQueue ){.  
b3a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b3b0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
b3c0: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
b3d0: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73  , r3);.        s
b3e0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
b3f0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
b400: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20  SEEKRESULT);.   
b410: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
b420: 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29  =0; i<nKey; i++)
b430: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b440: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b450: 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20  P_SCopy,.       
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b470: 20 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70     regResult + p
b480: 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  SO->a[i].u.x.iOr
b490: 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20  derByCol - 1,.  
b4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4b0: 20 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20          r2+i);. 
b4c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
b4d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b4e0: 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69  , OP_Sequence, i
b4f0: 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a  Parm, r2+nKey);.
b500: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b510: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
b520: 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b  keRecord, r2, nK
b530: 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20  ey+2, r1);.     
b540: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b550: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
b560: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
b570: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  , r2, nKey+2);. 
b580: 20 20 20 20 20 69 66 28 20 61 64 64 72 54 65 73       if( addrTes
b590: 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  t ) sqlite3VdbeJ
b5a0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
b5b0: 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
b5c0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
b5d0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
b5e0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
b5f0: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
b600: 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29  rse, r2, nKey+2)
b610: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b620: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
b630: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a  QLITE_OMIT_CTE *
b640: 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  /....#if !define
b650: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
b660: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
b670: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
b680: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
b690: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
b6a0: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
b6b0: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
b6c0: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
b6d0: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
b6e0: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
b6f0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
b700: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
b710: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
b720: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
b730: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
b740: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
b750: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
b760: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
b770: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
b780: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
b790: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
b7a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b7b0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
b7c0: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
b7d0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
b7e0: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
b7f0: 69 73 20 72 65 61 63 68 65 64 2e 20 20 45 78 63  is reached.  Exc
b800: 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65  ept, if.  ** the
b810: 72 65 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20  re is a sorter, 
b820: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
b830: 65 20 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72  e sorter has alr
b840: 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a  eady limited.  *
b850: 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72  * the output for
b860: 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   us..  */.  if( 
b870: 70 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69  pSort==0 && p->i
b880: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
b890: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b8a0: 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
b8b0: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
b8c0: 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
b8d0: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  age(v);.  }.}../
b8e0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
b8f0: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73  KeyInfo object s
b900: 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e  ufficient for an
b910: 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20   index of N key 
b920: 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58  columns and.** X
b930: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a   extra columns..
b940: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
b950: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
b960: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
b970: 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e   N, int X){.  in
b980: 74 20 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29  t nExtra = (N+X)
b990: 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
b9a0: 2a 29 2b 31 29 20 2d 20 73 69 7a 65 6f 66 28 43  *)+1) - sizeof(C
b9b0: 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49  ollSeq*);.  KeyI
b9c0: 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  nfo *p = sqlite3
b9d0: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
b9e0: 2c 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f  , sizeof(KeyInfo
b9f0: 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  ) + nExtra);.  i
ba00: 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  f( p ){.    p->a
ba10: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
ba20: 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b  )&p->aColl[N+X];
ba30: 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c  .    p->nKeyFiel
ba40: 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20  d = (u16)N;.    
ba50: 70 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28  p->nAllField = (
ba60: 75 31 36 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70  u16)(N+X);.    p
ba70: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
ba80: 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  .    p->db = db;
ba90: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31  .    p->nRef = 1
baa0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 5b  ;.    memset(&p[
bab0: 31 5d 2c 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a  1], 0, nExtra);.
bac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
bad0: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
bae0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
baf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
bb00: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
bb10: 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73  object.*/.void s
bb20: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
bb30: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
bb40: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
bb50: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
bb60: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d   );.    p->nRef-
bb70: 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  -;.    if( p->nR
bb80: 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44  ef==0 ) sqlite3D
bb90: 62 46 72 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70  bFreeNN(p->db, p
bba0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
bbb0: 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74  Make a new point
bbc0: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
bbd0: 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66  object.*/.KeyInf
bbe0: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
bbf0: 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  oRef(KeyInfo *p)
bc00: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
bc10: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
bc20: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
bc30: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  f++;.  }.  retur
bc40: 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n p;.}..#ifdef S
bc50: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
bc60: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
bc70: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
bc80: 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e  t can be change.
bc90: 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62    The KeyInfo ob
bca0: 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79  ject.** can only
bcb0: 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20 74   be changed if t
bcc0: 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73 69  his is just a si
bcd0: 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74  ngle reference t
bce0: 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  o the object..**
bcf0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
bd00: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e   is used only in
bd10: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
bd20: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
bd30: 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  int sqlite3KeyIn
bd40: 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65  foIsWriteable(Ke
bd50: 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72  yInfo *p){ retur
bd60: 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a  n p->nRef==1; }.
bd70: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
bd80: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
bd90: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
bda0: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
bdb0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
bdc0: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
bdd0: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
bde0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
bdf0: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
be00: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
be10: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
be20: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
be30: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
be40: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
be50: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
be60: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
be70: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
be80: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
be90: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
bea0: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
beb0: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
bec0: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
bed0: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
bee0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
bef0: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
bf00: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
bf10: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
bf20: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
bf30: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
bf40: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
bf50: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
bf60: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
bf70: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
bf80: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
bf90: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
bfa0: 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63  m malloc.  The c
bfb0: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
bfc0: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
bfd0: 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61  e for seeing tha
bfe0: 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
bff0: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
c000: 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  * freed..*/.stat
c010: 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49  ic KeyInfo *keyI
c020: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
c030: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c040: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
c050: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
c060: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
c070: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65       /* Form the
c080: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
c090: 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69  from this ExprLi
c0a0: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  st */.  int iSta
c0b0: 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rt,          /* 
c0c0: 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20  Begin with this 
c0d0: 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20  column of pList 
c0e0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
c0f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
c100: 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61   this many extra
c110: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
c120: 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  end */.){.  int 
c130: 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f  nExpr;.  KeyInfo
c140: 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   *pInfo;.  struc
c150: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
c160: 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
c170: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
c180: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  db;.  int i;..  
c190: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
c1a0: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
c1b0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
c1c0: 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53  loc(db, nExpr-iS
c1d0: 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b  tart, nExtra+1);
c1e0: 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a  .  if( pInfo ){.
c1f0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
c200: 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
c210: 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a  eable(pInfo) );.
c220: 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74      for(i=iStart
c230: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
c240: 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72  +iStart; i<nExpr
c250: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
c260: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  .      pInfo->aC
c270: 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  oll[i-iStart] = 
c280: 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c  sqlite3ExprNNCol
c290: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
c2a0: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
c2b0: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
c2c0: 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  der[i-iStart] = 
c2d0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
c2e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
c2f0: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f  turn pInfo;.}../
c300: 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  *.** Name of the
c310: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72   connection oper
c320: 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65  ator, used for e
c330: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
c340: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
c350: 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d  har *selectOpNam
c360: 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61  e(int id){.  cha
c370: 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20  r *z;.  switch( 
c380: 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  id ){.    case T
c390: 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d  K_ALL:       z =
c3a0: 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20   "UNION ALL";   
c3b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
c3c0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20  TK_INTERSECT: z 
c3d0: 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20  = "INTERSECT";  
c3e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
c3f0: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a   TK_EXCEPT:    z
c400: 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20   = "EXCEPT";    
c410: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
c420: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
c430: 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20  z = "UNION";    
c440: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
c450: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66  return z;.}..#if
c460: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c470: 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55  _EXPLAIN./*.** U
c480: 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49  nless an "EXPLAI
c490: 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f  N QUERY PLAN" co
c4a0: 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70  mmand is being p
c4b0: 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66  rocessed, this f
c4c0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20  unction.** is a 
c4d0: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
c4e0: 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67  , it adds a sing
c4f0: 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  le row of output
c500: 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75   to the EQP resu
c510: 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  lt,.** where the
c520: 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74   caption is of t
c530: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
c540: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
c550: 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a  E FOR xxx".**.**
c560: 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e   where xxx is on
c570: 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c  e of "DISTINCT",
c580: 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22   "ORDER BY" or "
c590: 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74  GROUP BY". Exact
c5a0: 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ly which.** is d
c5b0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
c5c0: 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74   zUsage argument
c5d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c5e0: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
c5f0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
c600: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73   const char *zUs
c610: 61 67 65 29 7b 0a 20 20 45 78 70 6c 61 69 6e 51  age){.  ExplainQ
c620: 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
c630: 2c 20 30 2c 20 22 55 53 45 20 54 45 4d 50 20 42  , 0, "USE TEMP B
c640: 2d 54 52 45 45 20 46 4f 52 20 25 73 22 2c 20 7a  -TREE FOR %s", z
c650: 55 73 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Usage));.}../*.*
c660: 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65 73 73  * Assign express
c670: 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20  ion b to lvalue 
c680: 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d  a. A second, no-
c690: 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  op, version of t
c6a0: 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20  his macro.** is 
c6b0: 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51  provided when SQ
c6c0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
c6d0: 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68  N is defined. Th
c6e0: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f  is allows the co
c6f0: 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33  de.** in sqlite3
c700: 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69  Select() to assi
c710: 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72  gn values to str
c720: 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61  ucture member va
c730: 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20  riables that.** 
c740: 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53 51  only exist if SQ
c750: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
c760: 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  N is not defined
c770: 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69   without polluti
c780: 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  ng the.** code w
c790: 69 74 68 20 23 69 66 6e 64 65 66 20 64 69 72 65  ith #ifndef dire
c7a0: 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66  ctives..*/.# def
c7b0: 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  ine explainSetIn
c7c0: 74 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20  teger(a, b) a = 
c7d0: 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f  b..#else./* No-o
c7e0: 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  p versions of th
c7f0: 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66  e explainXXX() f
c800: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63  unctions and mac
c810: 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65  ros. */.# define
c820: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
c830: 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20  e(y,z).# define 
c840: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
c850: 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 0a  r(y,z).#endif...
c860: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
c870: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
c880: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
c890: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
c8a0: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
c8b0: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
c8c0: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
c8d0: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
c8e0: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
c8f0: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
c900: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
c910: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
c920: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
c930: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
c940: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
c950: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
c960: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
c970: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
c980: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72  eSortTail(.  Par
c990: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
c9a0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
c9b0: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
c9c0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
c9d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
c9e0: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
c9f0: 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72  Sort,   /* Infor
ca00: 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52  mation on the OR
ca10: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
ca20: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
ca30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ca40: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
ca50: 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
ca60: 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74  t *pDest /* Writ
ca70: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
ca80: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
ca90: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
caa0: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cac0: 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
cad0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
cae0: 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20 70 53  t addrBreak = pS
caf0: 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20  ort->labelDone; 
cb00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
cb10: 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74 20  mp here to exit 
cb20: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
cb30: 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c  drContinue = sql
cb40: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
cb50: 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68  l(v);  /* Jump h
cb60: 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63  ere for next cyc
cb70: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
cb80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cb90: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
cba0: 66 20 6f 75 74 70 75 74 20 6c 6f 6f 70 2e 20 4a  f output loop. J
cbb0: 75 6d 70 20 66 6f 72 20 4e 65 78 74 2e 20 2a 2f  ump for Next. */
cbc0: 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20  .  int addrOnce 
cbd0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
cbe0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
cbf0: 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70  derBy = pSort->p
cc00: 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65  OrderBy;.  int e
cc10: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
cc20: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
cc30: 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72   = pDest->iSDPar
cc40: 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b  m;.  int regRow;
cc50: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b  .  int regRowid;
cc60: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69  .  int iCol;.  i
cc70: 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20  nt nKey;        
cc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cc90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20  * Number of key 
cca0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 6f 72 74 65  columns in sorte
ccb0: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
ccc0: 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20  t iSortTab;     
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cce0: 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74   Sorter cursor t
ccf0: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
cd00: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53   int i;.  int bS
cd10: 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eq;             
cd20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
cd30: 65 20 69 66 20 73 6f 72 74 65 72 20 72 65 63 6f  e if sorter reco
cd40: 72 64 20 69 6e 63 6c 75 64 65 73 20 73 65 71 2e  rd includes seq.
cd50: 20 6e 6f 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   no. */.  int nR
cd60: 65 66 4b 65 79 20 3d 20 30 3b 0a 20 20 73 74 72  efKey = 0;.  str
cd70: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
cd80: 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70  m *aOutEx = p->p
cd90: 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20 20 61 73 73  EList->a;..  ass
cda0: 65 72 74 28 20 61 64 64 72 42 72 65 61 6b 3c 30  ert( addrBreak<0
cdb0: 20 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d   );.  if( pSort-
cdc0: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20  >labelBkOut ){. 
cdd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cde0: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
cdf0: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
ce00: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
ce10: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
ce20: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
ce30: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73  ddrBreak);.    s
ce40: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
ce50: 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d  eLabel(v, pSort-
ce60: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
ce70: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
ce80: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
ce90: 45 46 45 52 45 4e 43 45 53 0a 20 20 2f 2a 20 4f  EFERENCES.  /* O
cea0: 70 65 6e 20 61 6e 79 20 63 75 72 73 6f 72 73 20  pen any cursors 
ceb0: 6e 65 65 64 65 64 20 66 6f 72 20 73 6f 72 74 65  needed for sorte
cec0: 72 2d 72 65 66 65 72 65 6e 63 65 20 65 78 70 72  r-reference expr
ced0: 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72  essions */.  for
cee0: 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e  (i=0; i<pSort->n
cef0: 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  Defer; i++){.   
cf00: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
cf10: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e  Sort->aDefer[i].
cf20: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 44  pTab;.    int iD
cf30: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
cf40: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
cf50: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
cf60: 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ma);.    sqlite3
cf70: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
cf80: 2c 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b  , pSort->aDefer[
cf90: 69 5d 2e 69 43 73 72 2c 20 69 44 62 2c 20 70 54  i].iCsr, iDb, pT
cfa0: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
cfb0: 3b 0a 20 20 20 20 6e 52 65 66 4b 65 79 20 3d 20  ;.    nRefKey = 
cfc0: 4d 41 58 28 6e 52 65 66 4b 65 79 2c 20 70 53 6f  MAX(nRefKey, pSo
cfd0: 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e 4b  rt->aDefer[i].nK
cfe0: 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ey);.  }.#endif.
cff0: 0a 20 20 69 54 61 62 20 3d 20 70 53 6f 72 74 2d  .  iTab = pSort-
d000: 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  >iECursor;.  if(
d010: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
d020: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
d030: 5f 43 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44  _Coroutine || eD
d040: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a  est==SRT_Mem ){.
d050: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30      regRowid = 0
d060: 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 70  ;.    regRow = p
d070: 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 7d  Dest->iSdst;.  }
d080: 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77  else{.    regRow
d090: 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  id = sqlite3GetT
d0a0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
d0b0: 20 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c      regRow = sql
d0c0: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
d0d0: 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e  (pParse, nColumn
d0e0: 29 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20  );.  }.  nKey = 
d0f0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
d100: 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  - pSort->nOBSat;
d110: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f  .  if( pSort->so
d120: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
d130: 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  AG_UseSorter ){.
d140: 20 20 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f      int regSortO
d150: 75 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ut = ++pParse->n
d160: 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72 74 54 61  Mem;.    iSortTa
d170: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
d180: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72  ++;.    if( pSor
d190: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b  t->labelBkOut ){
d1a0: 0a 20 20 20 20 20 20 61 64 64 72 4f 6e 63 65 20  .      addrOnce 
d1b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
d1c0: 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
d1d0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
d1e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
d1f0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
d200: 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
d210: 69 53 6f 72 74 54 61 62 2c 20 72 65 67 53 6f 72  iSortTab, regSor
d220: 74 4f 75 74 2c 20 0a 20 20 20 20 20 20 20 20 6e  tOut, .        n
d230: 4b 65 79 2b 31 2b 6e 43 6f 6c 75 6d 6e 2b 6e 52  Key+1+nColumn+nR
d240: 65 66 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20  efKey);.    if( 
d250: 61 64 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74  addrOnce ) sqlit
d260: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
d270: 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20  , addrOnce);.   
d280: 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69   addr = 1 + sqli
d290: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
d2a0: 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
d2b0: 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29  iTab, addrBreak)
d2c0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
d2d0: 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f  ge(v);.    codeO
d2e0: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
d2f0: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
d300: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
d310: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d320: 53 6f 72 74 65 72 44 61 74 61 2c 20 69 54 61 62  SorterData, iTab
d330: 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 69 53  , regSortOut, iS
d340: 6f 72 74 54 61 62 29 3b 0a 20 20 20 20 62 53 65  ortTab);.    bSe
d350: 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  q = 0;.  }else{.
d360: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
d370: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d380: 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61  (v, OP_Sort, iTa
d390: 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56  b, addrBreak); V
d3a0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
d3b0: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
d3c0: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64  , p->iOffset, ad
d3d0: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20  drContinue);.   
d3e0: 20 69 53 6f 72 74 54 61 62 20 3d 20 69 54 61 62   iSortTab = iTab
d3f0: 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 31 3b 0a  ;.    bSeq = 1;.
d400: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 69    }.  for(i=0, i
d410: 43 6f 6c 3d 6e 4b 65 79 2b 62 53 65 71 2d 31 3b  Col=nKey+bSeq-1;
d420: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
d430: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
d440: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
d450: 46 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28  FERENCES.    if(
d460: 20 61 4f 75 74 45 78 5b 69 5d 2e 62 53 6f 72 74   aOutEx[i].bSort
d470: 65 72 52 65 66 20 29 20 63 6f 6e 74 69 6e 75 65  erRef ) continue
d480: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
d490: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
d4a0: 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20  OrderByCol==0 ) 
d4b0: 69 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 23 69 66 64  iCol++;.  }.#ifd
d4c0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d4d0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
d4e0: 45 53 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  ES.  if( pSort->
d4f0: 6e 44 65 66 65 72 20 29 7b 0a 20 20 20 20 69 6e  nDefer ){.    in
d500: 74 20 69 4b 65 79 20 3d 20 69 43 6f 6c 2b 31 3b  t iKey = iCol+1;
d510: 0a 20 20 20 20 69 6e 74 20 72 65 67 4b 65 79 20  .    int regKey 
d520: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
d530: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 52  Range(pParse, nR
d540: 65 66 4b 65 79 29 3b 0a 0a 20 20 20 20 66 6f 72  efKey);..    for
d550: 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e  (i=0; i<pSort->n
d560: 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  Defer; i++){.   
d570: 20 20 20 69 6e 74 20 69 43 73 72 20 3d 20 70 53     int iCsr = pS
d580: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 69  ort->aDefer[i].i
d590: 43 73 72 3b 0a 20 20 20 20 20 20 54 61 62 6c 65  Csr;.      Table
d5a0: 20 2a 70 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e   *pTab = pSort->
d5b0: 61 44 65 66 65 72 5b 69 5d 2e 70 54 61 62 3b 0a  aDefer[i].pTab;.
d5c0: 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d        int nKey =
d5d0: 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69   pSort->aDefer[i
d5e0: 5d 2e 6e 4b 65 79 3b 0a 0a 20 20 20 20 20 20 73  ].nKey;..      s
d5f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
d600: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
d610: 69 43 73 72 29 3b 0a 20 20 20 20 20 20 69 66 28  iCsr);.      if(
d620: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
d630: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d640: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
d650: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74  OP_Column, iSort
d660: 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20 72 65 67  Tab, iKey++, reg
d670: 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Key);.        sq
d680: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
d690: 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
d6a0: 20 69 43 73 72 2c 20 0a 20 20 20 20 20 20 20 20   iCsr, .        
d6b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
d6c0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 2c  urrentAddr(v)+1,
d6d0: 20 72 65 67 4b 65 79 29 3b 0a 20 20 20 20 20 20   regKey);.      
d6e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
d6f0: 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e  nt k;.        in
d700: 74 20 69 4a 6d 70 3b 0a 20 20 20 20 20 20 20 20  t iJmp;.        
d710: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d720: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
d730: 54 61 62 29 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e  Tab)->nKeyCol==n
d740: 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 66  Key );.        f
d750: 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20  or(k=0; k<nKey; 
d760: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
d770: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d780: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
d790: 69 53 6f 72 74 54 61 62 2c 20 69 4b 65 79 2b 2b  iSortTab, iKey++
d7a0: 2c 20 72 65 67 4b 65 79 2b 6b 29 3b 0a 20 20 20  , regKey+k);.   
d7b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
d7c0: 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Jmp = sqlite3Vdb
d7d0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
d7e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d7f0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
d800: 20 4f 50 5f 53 65 65 6b 47 45 2c 20 69 43 73 72   OP_SeekGE, iCsr
d810: 2c 20 69 4a 6d 70 2b 32 2c 20 72 65 67 4b 65 79  , iJmp+2, regKey
d820: 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  , nKey);.       
d830: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d840: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 4c  p4Int(v, OP_IdxL
d850: 45 2c 20 69 43 73 72 2c 20 69 4a 6d 70 2b 33 2c  E, iCsr, iJmp+3,
d860: 20 72 65 67 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a   regKey, nKey);.
d870: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d880: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
d890: 4e 75 6c 6c 52 6f 77 2c 20 69 43 73 72 29 3b 0a  NullRow, iCsr);.
d8a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d8b0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
d8c0: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
d8d0: 2c 20 72 65 67 4b 65 79 2c 20 6e 52 65 66 4b 65  , regKey, nRefKe
d8e0: 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  y);.  }.#endif. 
d8f0: 20 66 6f 72 28 69 3d 6e 43 6f 6c 75 6d 6e 2d 31   for(i=nColumn-1
d900: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 23 69  ; i>=0; i--){.#i
d910: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d920: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
d930: 4e 43 45 53 0a 20 20 20 20 69 66 28 20 61 4f 75  NCES.    if( aOu
d940: 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65  tEx[i].bSorterRe
d950: 66 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  f ){.      sqlit
d960: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
d970: 65 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 70 45 78  e, aOutEx[i].pEx
d980: 70 72 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20  pr, regRow+i);. 
d990: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
d9a0: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
d9b0: 69 52 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28  iRead;.      if(
d9c0: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
d9d0: 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20  OrderByCol ){.  
d9e0: 20 20 20 20 20 20 69 52 65 61 64 20 3d 20 61 4f        iRead = aO
d9f0: 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  utEx[i].u.x.iOrd
da00: 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20 20 20 20  erByCol-1;.     
da10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
da20: 69 52 65 61 64 20 3d 20 69 43 6f 6c 2d 2d 3b 0a  iRead = iCol--;.
da30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
da40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
da50: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
da60: 6f 72 74 54 61 62 2c 20 69 52 65 61 64 2c 20 72  ortTab, iRead, r
da70: 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 20 20  egRow+i);.      
da80: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
da90: 22 25 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e  "%s", aOutEx[i].
daa0: 7a 4e 61 6d 65 3f 61 4f 75 74 45 78 5b 69 5d 2e  zName?aOutEx[i].
dab0: 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69  zName : aOutEx[i
dac0: 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 20 20 7d  ].zSpan));.    }
dad0: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65  .  }.  switch( e
dae0: 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65  Dest ){.    case
daf0: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
db00: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
db10: 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b: {.      sqlit
db20: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
db30: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
db40: 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  rm, regRowid);. 
db50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
db60: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
db70: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
db80: 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  ow, regRowid);. 
db90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dba0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
dbb0: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
dbc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
dbd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
dbe0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
dbf0: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
dc00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
dc10: 6f 6c 75 6d 6e 3d 3d 73 71 6c 69 74 65 33 53 74  olumn==sqlite3St
dc20: 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41  rlen30(pDest->zA
dc30: 66 66 53 64 73 74 29 20 29 3b 0a 20 20 20 20 20  ffSdst) );.     
dc40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dc50: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
dc60: 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f  ord, regRow, nCo
dc70: 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 2c 0a  lumn, regRowid,.
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc90: 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a          pDest->z
dca0: 41 66 66 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e  AffSdst, nColumn
dcb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
dcc0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
dcd0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
dce0: 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29  regRow, nColumn)
dcf0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
dd00: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
dd10: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
dd20: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 2c 20 72  arm, regRowid, r
dd30: 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  egRow, nColumn);
dd40: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
dd50: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
dd60: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  _Mem: {.      /*
dd70: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
dd80: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
dd90: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
dda0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
ddb0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
ddc0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
ddd0: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
dde0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
ddf0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
de00: 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74  tine ); .      t
de10: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
de20: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
de30: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
de40: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
de50: 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ne );.      if( 
de60: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
de70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
de80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
de90: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
dea0: 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43  pDest->iSdst, nC
deb0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
dec0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
ded0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
dee0: 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53  Parse, pDest->iS
def0: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
df00: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
df10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
df20: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
df30: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
df40: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
df50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
df60: 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77 69   }.  if( regRowi
df70: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 65 44 65  d ){.    if( eDe
df80: 73 74 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a 20  st==SRT_Set ){. 
df90: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
dfa0: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
dfb0: 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f  rse, regRow, nCo
dfc0: 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lumn);.    }else
dfd0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
dfe0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
dff0: 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20  arse, regRow);. 
e000: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
e010: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
e020: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29  Parse, regRowid)
e030: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62  ;.  }.  /* The b
e040: 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
e050: 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
e060: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
e070: 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  (v, addrContinue
e080: 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  );.  if( pSort->
e090: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
e0a0: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29  FLAG_UseSorter )
e0b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
e0c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
e0d0: 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20  rterNext, iTab, 
e0e0: 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72  addr); VdbeCover
e0f0: 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b  age(v);.  }else{
e100: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
e110: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
e120: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20  t, iTab, addr); 
e130: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
e140: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74  .  }.  if( pSort
e150: 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73 71  ->regReturn ) sq
e160: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
e170: 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53  v, OP_Return, pS
e180: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  ort->regReturn);
e190: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
e1a0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
e1b0: 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a  drBreak);.}../*.
e1c0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
e1d0: 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
e1e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27  containing the '
e1f0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
e200: 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  ' of the.** expr
e210: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68  ession pExpr. Th
e220: 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20  e string may be 
e230: 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69  treated as stati
e240: 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  c by the caller.
e250: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20  .**.** Also try 
e260: 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
e270: 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75  size of the retu
e280: 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72  rned value and r
e290: 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65  eturn that.** re
e2a0: 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64  sult in *pEstWid
e2b0: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  th..**.** The de
e2c0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69  claration type i
e2d0: 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61  s the exact data
e2e0: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
e2f0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
e300: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43  he.** original C
e310: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
e320: 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70  ement if the exp
e330: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
e340: 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c  umn. The.** decl
e350: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
e360: 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69   a ROWID field i
e370: 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74  s INTEGER. Exact
e380: 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65  ly when an expre
e390: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73  ssion.** is cons
e3a0: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
e3b0: 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69  can be complex i
e3c0: 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  n the presence o
e3d0: 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68  f subqueries. Th
e3e0: 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20  e.** result-set 
e3f0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c  expression in al
e400: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
e410: 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ng SELECT statem
e420: 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73  ents is .** cons
e430: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
e440: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
e450: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  ..**.**   SELECT
e460: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
e470: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
e480: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
e490: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
e4a0: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
e4b0: 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  l);.**   SELECT 
e4c0: 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  abc FROM (SELECT
e4d0: 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d   col AS abc FROM
e4e0: 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68   tbl);.** .** Th
e4f0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
e500: 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65  pe for any expre
e510: 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ssion other than
e520: 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c   a column is NUL
e530: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  L..**.** This ro
e540: 75 74 69 6e 65 20 68 61 73 20 65 69 74 68 65 72  utine has either
e550: 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65   3 or 6 paramete
e560: 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  rs depending on 
e570: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
e580: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  * the SQLITE_ENA
e590: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
e5a0: 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ATA compile-time
e5b0: 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e   option is used.
e5c0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
e5d0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
e5e0: 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e  METADATA.# defin
e5f0: 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42  e columnType(A,B
e600: 2c 43 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79  ,C,D,E) columnTy
e610: 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45  peImpl(A,B,C,D,E
e620: 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21 64  ).#else /* if !d
e630: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
e640: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
e650: 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e  DATA) */.# defin
e660: 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42  e columnType(A,B
e670: 2c 43 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79  ,C,D,E) columnTy
e680: 70 65 49 6d 70 6c 28 41 2c 42 29 0a 23 65 6e 64  peImpl(A,B).#end
e690: 69 66 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  if.static const 
e6a0: 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65  char *columnType
e6b0: 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  Impl(.  NameCont
e6c0: 65 78 74 20 2a 70 4e 43 2c 20 0a 23 69 66 6e 64  ext *pNC, .#ifnd
e6d0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e6e0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
e6f0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 0a 23  .  Expr *pExpr.#
e700: 65 6c 73 65 0a 20 20 45 78 70 72 20 2a 70 45 78  else.  Expr *pEx
e710: 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pr,.  const char
e720: 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63   **pzOrigDb,.  c
e730: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
e740: 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63  igTab,.  const c
e750: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 0a  har **pzOrigCol.
e760: 23 65 6e 64 69 66 0a 29 7b 0a 20 20 63 68 61 72  #endif.){.  char
e770: 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20   const *zType = 
e780: 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 23 69 66 64  0;.  int j;.#ifd
e790: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e7a0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
e7b0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
e7c0: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 63 68  OrigDb = 0;.  ch
e7d0: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54  ar const *zOrigT
e7e0: 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  ab = 0;.  char c
e7f0: 6f 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d  onst *zOrigCol =
e800: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   0;.#endif..  as
e810: 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29  sert( pExpr!=0 )
e820: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d  ;.  assert( pNC-
e830: 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a  >pSrcList!=0 );.
e840: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
e850: 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op!=TK_AGG_COLU
e860: 4d 4e 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 72  MN );  /* This r
e870: 6f 75 74 69 6e 65 20 72 75 6e 65 73 20 62 65 66  outine runes bef
e880: 6f 72 65 20 61 67 67 72 65 67 61 74 65 73 0a 20  ore aggregates. 
e890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8b0: 20 20 20 20 20 20 2a 2a 20 61 72 65 20 70 72 6f        ** are pro
e8c0: 63 65 73 73 65 64 20 2a 2f 0a 20 20 73 77 69 74  cessed */.  swit
e8d0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
e8e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
e8f0: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
e900: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
e910: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61  s a column. Loca
e920: 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65  te the table the
e930: 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67   column is being
e940: 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63  .      ** extrac
e950: 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65  ted from in Name
e960: 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74  Context.pSrcList
e970: 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79  . This table may
e980: 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a   be real.      *
e990: 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  * database table
e9a0: 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
e9b0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
e9c0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
e9d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
e9e0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  ble structure co
e9f0: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
ea00: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
ea10: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20  Select *pS = 0; 
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
ea30: 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e  elect the column
ea40: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
ea50: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  om */.      int 
ea60: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
ea70: 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78  olumn;  /* Index
ea80: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54   of column in pT
ea90: 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  ab */.      whil
eaa0: 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20  e( pNC && !pTab 
eab0: 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69  ){.        SrcLi
eac0: 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
ead0: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
eae0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c        for(j=0;j<
eaf0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26  pTabList->nSrc &
eb00: 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  & pTabList->a[j]
eb10: 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d  .iCursor!=pExpr-
eb20: 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20  >iTable;j++);.  
eb30: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62        if( j<pTab
eb40: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20  List->nSrc ){.  
eb50: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
eb60: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
eb70: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ab;.          pS
eb80: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
eb90: 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ].pSelect;.     
eba0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ebb0: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
ebc0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
ebd0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
ebe0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
ebf0: 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20        /* At one 
ec00: 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68 20  time, code such 
ec10: 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78  as "SELECT new.x
ec20: 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67  " within a trigg
ec30: 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20  er would.       
ec40: 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20 63   ** cause this c
ec50: 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e  ondition to run.
ec60: 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77 65    Since then, we
ec70: 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75 72   have restructur
ec80: 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20 2a  ed how.        *
ec90: 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20 69  * trigger code i
eca0: 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64 20  s generated and 
ecb0: 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  so this conditio
ecc0: 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a  n is no longer .
ecd0: 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69          ** possi
ece0: 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 74  ble. However, it
ecf0: 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74 72   can still be tr
ed00: 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74  ue for statement
ed10: 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20 2a  s like.        *
ed20: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  * the following:
ed30: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
ed40: 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
ed50: 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54  TABLE t1(col INT
ed60: 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20 2a  EGER);.        *
ed70: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
ed80: 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20  CT t1.col) FROM 
ed90: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20  FROM t1;.       
eda0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   **.        ** w
edb0: 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29  hen columnType()
edc0: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
edd0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74 31  e expression "t1
ede0: 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20 20  .col" in the .  
edf0: 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c        ** sub-sel
ee00: 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ect. In this cas
ee10: 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75 6d  e, set the colum
ee20: 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20  n type to NULL, 
ee30: 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  even.        ** 
ee40: 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64  though it should
ee50: 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54 45   really be "INTE
ee60: 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a  GER"..        **
ee70: 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
ee80: 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65   is not a proble
ee90: 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e  m, as the column
eea0: 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c   type of "t1.col
eeb0: 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20 20  " is never.     
eec0: 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e     ** used. When
eed0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
eee0: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
eef0: 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20 20  xpression .     
ef00: 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20 74     ** "(SELECT t
ef10: 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72  1.col)", the cor
ef20: 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65 74  rect type is ret
ef30: 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20 54  urned (see the T
ef40: 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20  K_SELECT.       
ef50: 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f 77   ** branch below
ef60: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  .  */.        br
ef70: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
ef80: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
ef90: 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62 3d   && pExpr->pTab=
efa0: 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69  =pTab );.      i
efb0: 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20  f( pS ){.       
efc0: 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20   /* The "table" 
efd0: 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75  is actually a su
efe0: 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69  b-select or a vi
eff0: 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ew in the FROM c
f000: 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  lause.        **
f010: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
f020: 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e  tatement. Return
f030: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
f040: 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e   type and origin
f050: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
f060: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d   for the result-
f070: 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  set column of th
f080: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20  e sub-select..  
f090: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
f0a0: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
f0b0: 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d  iCol<pS->pEList-
f0c0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
f0d0: 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69      /* If iCol i
f0e0: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
f0f0: 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
f100: 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74  ssion requests t
f110: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
f120: 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62  rowid of the sub
f130: 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
f140: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
f150: 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a   is legal (see .
f160: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73            ** tes
f170: 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32  t case misc2.2.2
f180: 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76  ) - it always ev
f190: 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e  aluates to NULL.
f1a0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
f1b0: 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74          NameCont
f1c0: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20  ext sNC;.       
f1d0: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
f1e0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
f1f0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
f200: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
f210: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
f220: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
f230: 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   pNC;.          
f240: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
f250: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
f260: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
f270: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26  mnType(&sNC, p,&
f280: 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61  zOrigDb,&zOrigTa
f290: 62 2c 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20  b,&zOrigCol); . 
f2a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f2b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
f2c0: 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72   A real table or
f2d0: 20 61 20 43 54 45 20 74 61 62 6c 65 20 2a 2f 0a   a CTE table */.
f2e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f2f0: 21 70 53 20 29 3b 0a 23 69 66 64 65 66 20 53 51  !pS );.#ifdef SQ
f300: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
f310: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
f320: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
f330: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
f340: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Key;.        ass
f350: 65 72 74 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f  ert( iCol==XN_RO
f360: 57 49 44 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  WID || (iCol>=0 
f370: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
f380: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ol) );.        i
f390: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
f3a0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
f3b0: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20  INTEGER";.      
f3c0: 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22      zOrigCol = "
f3d0: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20  rowid";.        
f3e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
f3f0: 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62   zOrigCol = pTab
f400: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
f410: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  me;.          zT
f420: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c  ype = sqlite3Col
f430: 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d 3e 61  umnType(&pTab->a
f440: 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20  Col[iCol],0);.  
f450: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f460: 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d  zOrigTab = pTab-
f470: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
f480: 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20  if( pNC->pParse 
f490: 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  && pTab->pSchema
f4a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
f4b0: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
f4c0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43  chemaToIndex(pNC
f4d0: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  ->pParse->db, pT
f4e0: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
f4f0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20          zOrigDb 
f500: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pNC->pParse->d
f510: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
f520: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Name;.        }.
f530: 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 61 73  #else.        as
f540: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52  sert( iCol==XN_R
f550: 4f 57 49 44 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  OWID || (iCol>=0
f560: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
f570: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20  Col) );.        
f580: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
f590: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
f5a0: 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20  "INTEGER";.     
f5b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f5c0: 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69      zType = sqli
f5d0: 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70  te3ColumnType(&p
f5e0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c  Tab->aCol[iCol],
f5f0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  0);.        }.#e
f600: 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
f610: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f620: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f630: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
f640: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
f650: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
f660: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
f670: 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75  sub-select. Retu
f680: 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rn the declarati
f690: 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20  on type and.    
f6a0: 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f    ** origin info
f6b0: 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20   for the single 
f6c0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
f6d0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
f6e0: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20  SELECT.      ** 
f6f0: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
f700: 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f   */.      NameCo
f710: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
f720: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45   Select *pS = pE
f730: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
f740: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
f750: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  pS->pEList->a[0]
f760: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  .pExpr;.      as
f770: 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f  sert( ExprHasPro
f780: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
f790: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
f7a0: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
f7b0: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
f7c0: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
f7d0: 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50  NC;.      sNC.pP
f7e0: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
f7f0: 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20  se;.      zType 
f800: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
f810: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
f820: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
f830: 67 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72  gCol); .      br
f840: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
f850: 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  f.  }..#ifdef SQ
f860: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
f870: 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20 0a 20 20  MN_METADATA  .  
f880: 69 66 28 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a  if( pzOrigDb ){.
f890: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72      assert( pzOr
f8a0: 69 67 54 61 62 20 26 26 20 70 7a 4f 72 69 67 43  igTab && pzOrigC
f8b0: 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  ol );.    *pzOri
f8c0: 67 44 62 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20  gDb = zOrigDb;. 
f8d0: 20 20 20 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20     *pzOrigTab = 
f8e0: 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20 20 2a 70  zOrigTab;.    *p
f8f0: 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67  zOrigCol = zOrig
f900: 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  Col;.  }.#endif.
f910: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
f920: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
f930: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
f940: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
f950: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
f960: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
f970: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
f980: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
f990: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
f9a0: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
f9b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
f9c0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
f9d0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
f9e0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
f9f0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
fa00: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
fa10: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
fa20: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
fa30: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
fa40: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
fa50: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a  E_OMIT_DECLTYPE.
fa60: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
fa70: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
fa80: 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
fa90: 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72  t sNC;.  sNC.pSr
faa0: 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
fab0: 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
fac0: 20 70 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70   pParse;.  sNC.p
fad0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Next = 0;.  for(
fae0: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
faf0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
fb00: 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
fb10: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
fb20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
fb30: 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ype;.#ifdef SQLI
fb40: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
fb50: 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f  _METADATA.    co
fb60: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44  nst char *zOrigD
fb70: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
fb80: 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20   char *zOrigTab 
fb90: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
fba0: 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20  har *zOrigCol = 
fbb0: 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63  0;.    zType = c
fbc0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
fbd0: 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f  p, &zOrigDb, &zO
fbe0: 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f  rigTab, &zOrigCo
fbf0: 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  l);..    /* The 
fc00: 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69  vdbe must make i
fc10: 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74  ts own copy of t
fc20: 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61  he column-type a
fc30: 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a  nd other .    **
fc40: 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63   column specific
fc50: 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73   strings, in cas
fc60: 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  e the schema is 
fc70: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
fc80: 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  s.    ** virtual
fc90: 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65   machine is dele
fca0: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
fcb0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
fcc0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
fcd0: 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f  AME_DATABASE, zO
fce0: 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52  rigDb, SQLITE_TR
fcf0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
fd00: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
fd10: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
fd20: 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61  E_TABLE, zOrigTa
fd30: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
fd40: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
fd50: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
fd60: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f  v, i, COLNAME_CO
fd70: 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20  LUMN, zOrigCol, 
fd80: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
fd90: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79  );.#else.    zTy
fda0: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
fdb0: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
fdc0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
fdd0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
fde0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
fdf0: 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70  E_DECLTYPE, zTyp
fe00: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
fe10: 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ENT);.  }.#endif
fe20: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
fe30: 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
fe40: 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E) */.}.../*.** 
fe50: 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75  Compute the colu
fe60: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 53  mn names for a S
fe70: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
fe80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  .**.** The only 
fe90: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 53  guarantee that S
fea0: 51 4c 69 74 65 20 6d 61 6b 65 73 20 61 62 6f 75  QLite makes abou
feb0: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  t column names i
fec0: 73 20 74 68 61 74 20 69 66 20 74 68 65 0a 2a 2a  s that if the.**
fed0: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20 41   column has an A
fee0: 53 20 63 6c 61 75 73 65 20 61 73 73 69 67 6e 69  S clause assigni
fef0: 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c 20 74 68  ng it a name, th
ff00: 61 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 6e  at will be the n
ff10: 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54 68 61  ame used..** Tha
ff20: 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f  t is the only do
ff30: 63 75 6d 65 6e 74 65 64 20 67 75 61 72 61 6e 74  cumented guarant
ff40: 65 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 63 6f  ee.  However, co
ff50: 75 6e 74 6c 65 73 73 20 61 70 70 6c 69 63 61 74  untless applicat
ff60: 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f 70 65  ions.** develope
ff70: 64 20 6f 76 65 72 20 74 68 65 20 79 65 61 72 73  d over the years
ff80: 20 68 61 76 65 20 6d 61 64 65 20 62 61 73 65 6c   have made basel
ff90: 65 73 73 20 61 73 73 75 6d 70 74 69 6f 6e 73 20  ess assumptions 
ffa0: 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  about column nam
ffb0: 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c 20 62  es.** and will b
ffc0: 72 65 61 6b 20 69 66 20 74 68 6f 73 65 20 61 73  reak if those as
ffd0: 73 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e 67 65  sumptions change
ffe0: 73 2e 20 20 48 65 6e 63 65 2c 20 75 73 65 20 65  s.  Hence, use e
fff0: 78 74 72 65 6d 65 20 63 61 75 74 69 6f 6e 0a 2a  xtreme caution.*
10000 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67  * when modifying
10010 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
10020 20 61 76 6f 69 64 20 62 72 65 61 6b 69 6e 67 20   avoid breaking 
10030 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65  legacy..**.** Se
10040 65 20 41 6c 73 6f 3a 20 73 71 6c 69 74 65 33 43  e Also: sqlite3C
10050 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
10060 73 74 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  st().**.** The P
10070 52 41 47 4d 41 20 73 68 6f 72 74 5f 63 6f 6c 75  RAGMA short_colu
10080 6d 6e 5f 6e 61 6d 65 73 20 61 6e 64 20 50 52 41  mn_names and PRA
10090 47 4d 41 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f  GMA full_column_
100a0 6e 61 6d 65 73 20 73 65 74 74 69 6e 67 73 20 61  names settings a
100b0 72 65 0a 2a 2a 20 64 65 70 72 65 63 61 74 65 64  re.** deprecated
100c0 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 73  .  The default s
100d0 65 74 74 69 6e 67 20 69 73 20 73 68 6f 72 74 3d  etting is short=
100e0 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 2e 20 20 39  ON, full=OFF.  9
100f0 39 2e 39 25 20 6f 66 20 61 6c 6c 0a 2a 2a 20 61  9.9% of all.** a
10100 70 70 6c 69 63 61 74 69 6f 6e 73 20 73 68 6f 75  pplications shou
10110 6c 64 20 6f 70 65 72 61 74 65 20 74 68 69 73 20  ld operate this 
10120 77 61 79 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  way.  Neverthele
10130 73 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 73  ss, we need to s
10140 75 70 70 6f 72 74 20 74 68 65 0a 2a 2a 20 6f 74  upport the.** ot
10150 68 65 72 20 6d 6f 64 65 73 20 66 6f 72 20 6c 65  her modes for le
10160 67 61 63 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73  gacy:.**.**    s
10170 68 6f 72 74 3d 4f 46 46 2c 20 66 75 6c 6c 3d 4f  hort=OFF, full=O
10180 46 46 3a 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20  FF:      Column 
10190 6e 61 6d 65 20 69 73 20 74 68 65 20 74 65 78 74  name is the text
101a0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
101b0 6f 6e 20 68 61 73 20 69 74 0a 2a 2a 20 20 20 20  on has it.**    
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101d0 20 20 20 20 20 20 20 20 20 20 6f 72 69 67 69 6e            origin
101e0 61 6c 6c 79 20 61 70 70 65 61 72 73 20 69 6e 20  ally appears in 
101f0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
10200 6d 65 6e 74 2e 20 20 49 6e 0a 2a 2a 20 20 20 20  ment.  In.**    
10210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10220 20 20 20 20 20 20 20 20 20 20 6f 74 68 65 72 20            other 
10230 77 6f 72 64 73 2c 20 74 68 65 20 7a 53 70 61 6e  words, the zSpan
10240 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 65   of the result e
10250 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
10260 20 20 20 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75      short=ON, fu
10270 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20 20 28 54  ll=OFF:       (T
10280 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
10290 6c 74 20 73 65 74 74 69 6e 67 29 2e 20 20 49 66  lt setting).  If
102a0 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20   the result.**  
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102c0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66 65              refe
102d0 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61  rs directly to a
102e0 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74   table column, t
102f0 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  hen the.**      
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10310 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 63          result c
10320 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6a 75  olumn name is ju
10330 73 74 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  st the table col
10340 75 6d 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  umn.**          
10350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10360 20 20 20 20 6e 61 6d 65 3a 20 43 4f 4c 55 4d 4e      name: COLUMN
10370 2e 20 20 4f 74 68 65 72 77 69 73 65 20 75 73 65  .  Otherwise use
10380 20 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20   zSpan..**.**   
10390 20 66 75 6c 6c 3d 4f 4e 2c 20 73 68 6f 72 74 3d   full=ON, short=
103a0 41 4e 59 3a 20 20 20 20 20 20 20 49 66 20 74 68  ANY:       If th
103b0 65 20 72 65 73 75 6c 74 20 72 65 66 65 72 73 20  e result refers 
103c0 64 69 72 65 63 74 6c 79 20 74 6f 20 61 20 74 61  directly to a ta
103d0 62 6c 65 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 20  ble column,.**  
103e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103f0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 6e              then
10400 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75   the result colu
10410 6d 6e 20 6e 61 6d 65 20 77 69 74 68 20 74 68 65  mn name with the
10420 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20   table name.**  
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10440 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66              pref
10450 69 78 2c 20 65 78 3a 20 54 41 42 4c 45 2e 43 4f  ix, ex: TABLE.CO
10460 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73 65  LUMN.  Otherwise
10470 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2f 0a 73   use zSpan..*/.s
10480 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
10490 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a  ateColumnNames(.
104a0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
104b0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
104c0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
104d0 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
104e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 6c   /* Generate col
104f0 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 74 68  umn names for th
10500 69 73 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  is SELECT statem
10510 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ent */.){.  Vdbe
10520 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
10530 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
10540 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 53  Table *pTab;.  S
10550 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
10560 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
10570 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  List;.  sqlite3 
10580 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
10590 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65  ;.  int fullName
105a0 3b 20 20 20 20 2f 2a 20 54 41 42 4c 45 2e 43 4f  ;    /* TABLE.CO
105b0 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c  LUMN if no AS cl
105c0 61 75 73 65 20 61 6e 64 20 69 73 20 61 20 64 69  ause and is a di
105d0 72 65 63 74 20 74 61 62 6c 65 20 72 65 66 20 2a  rect table ref *
105e0 2f 0a 20 20 69 6e 74 20 73 72 63 4e 61 6d 65 3b  /.  int srcName;
105f0 20 20 20 20 20 2f 2a 20 43 4f 4c 55 4d 4e 20 6f       /* COLUMN o
10600 72 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69  r TABLE.COLUMN i
10610 66 20 6e 6f 20 41 53 20 63 6c 61 75 73 65 20 61  f no AS clause a
10620 6e 64 20 69 73 20 64 69 72 65 63 74 20 2a 2f 0a  nd is direct */.
10630 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10640 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f  OMIT_EXPLAIN.  /
10650 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
10660 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68  EXPLAIN, skip th
10670 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28  is step */.  if(
10680 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
10690 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
106a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
106b0 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d  ( pParse->colNam
106c0 65 73 53 65 74 20 29 20 72 65 74 75 72 6e 3b 0a  esSet ) return;.
106d0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
106e0 73 20 61 72 65 20 64 65 74 65 72 6d 69 6e 65 64  s are determined
106f0 20 62 79 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   by the left-mos
10700 74 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70  t term of a comp
10710 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a 2f 0a 20  ound select */. 
10720 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
10730 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63  >pPrior ) pSelec
10740 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  t = pSelect->pPr
10750 69 6f 72 3b 0a 20 20 53 45 4c 45 43 54 54 52 41  ior;.  SELECTTRA
10760 43 45 28 31 2c 70 50 61 72 73 65 2c 70 53 65 6c  CE(1,pParse,pSel
10770 65 63 74 2c 28 22 67 65 6e 65 72 61 74 69 6e 67  ect,("generating
10780 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 5c 6e 22   column names\n"
10790 29 29 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  ));.  pTabList =
107a0 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
107b0 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
107c0 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73  ct->pEList;.  as
107d0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
107e0 61 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74  assert( pTabList
107f0 21 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  !=0 );.  pParse-
10800 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
10810 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 20 3d 20 28  ;.  fullName = (
10820 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
10830 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
10840 21 3d 30 3b 0a 20 20 73 72 63 4e 61 6d 65 20 3d  !=0;.  srcName =
10850 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
10860 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
10870 65 73 29 21 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61  es)!=0 || fullNa
10880 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  me;.  sqlite3Vdb
10890 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70  eSetNumCols(v, p
108a0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
108b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
108c0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
108d0 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
108e0 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
108f0 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  r;..    assert( 
10900 70 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  p!=0 );.    asse
10910 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47  rt( p->op!=TK_AG
10920 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20  G_COLUMN );  /* 
10930 41 67 67 20 70 72 6f 63 65 73 73 69 6e 67 20 68  Agg processing h
10940 61 73 20 6e 6f 74 20 72 75 6e 20 79 65 74 20 2a  as not run yet *
10950 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
10960 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
10970 7c 20 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 20  | p->pTab!=0 ); 
10980 2f 2a 20 43 6f 76 65 72 69 6e 67 20 69 64 78 20  /* Covering idx 
10990 6e 6f 74 20 79 65 74 20 63 6f 64 65 64 20 2a 2f  not yet coded */
109a0 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d  .    if( pEList-
109b0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
109c0 20 20 20 20 20 2f 2a 20 41 6e 20 41 53 20 63 6c       /* An AS cl
109d0 61 75 73 65 20 61 6c 77 61 79 73 20 74 61 6b 65  ause always take
109e0 73 20 66 69 72 73 74 20 70 72 69 6f 72 69 74 79  s first priority
109f0 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
10a00 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
10a10 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[i].zName;.    
10a20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
10a30 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
10a40 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
10a50 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
10a60 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ENT);.    }else 
10a70 69 66 28 20 73 72 63 4e 61 6d 65 20 26 26 20 70  if( srcName && p
10a80 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
10a90 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
10aa0 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Col;.      int i
10ab0 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e  Col = p->iColumn
10ac0 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
10ad0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 61 73  ->pTab;.      as
10ae0 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
10af0 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
10b00 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
10b10 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
10b20 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
10b30 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
10b40 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
10b50 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
10b60 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  <0 ){.        zC
10b70 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
10b80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10b90 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     zCol = pTab->
10ba0 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
10bb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10bc0 69 66 28 20 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a  if( fullName ){.
10bd0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
10be0 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
10bf0 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
10c00 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
10c10 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
10c20 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , zCol);.       
10c30 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
10c40 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
10c50 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
10c60 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
10c70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
10c80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10c90 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
10ca0 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
10cb0 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  , zCol, SQLITE_T
10cc0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
10cd0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
10ce0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10cf0 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  z = pEList->a[i]
10d00 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20  .zSpan;.      z 
10d10 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33  = z==0 ? sqlite3
10d20 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c  MPrintf(db, "col
10d30 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73  umn%d", i+1) : s
10d40 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
10d50 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  b, z);.      sql
10d60 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
10d70 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
10d80 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45  _NAME, z, SQLITE
10d90 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
10da0 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43  .  }.  generateC
10db0 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
10dc0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
10dd0 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ist);.}../*.** G
10de0 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
10df0 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20 69  on list (which i
10e00 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73  s really the lis
10e10 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
10e20 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68  .** that form th
10e30 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
10e40 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
10e50 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72  nt) compute appr
10e60 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d  opriate.** colum
10e70 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61  n names for a ta
10e80 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68  ble that would h
10e90 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
10ea0 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  on list..**.** A
10eb0 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ll column names 
10ec0 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a  will be unique..
10ed0 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63  **.** Only the c
10ee0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20  olumn names are 
10ef0 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d  computed.  Colum
10f00 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e  n.zType, Column.
10f10 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74  zColl,.** and ot
10f20 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f  her fields of Co
10f30 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e  lumn are zeroed.
10f40 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
10f50 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
10f60 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  ss.  If a memory
10f70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
10f80 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f  r occurs,.** sto
10f90 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f  re NULL in *paCo
10fa0 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f  l and 0 in *pnCo
10fb0 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  l and return SQL
10fc0 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a  ITE_NOMEM..**.**
10fd0 20 54 68 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e   The only guaran
10fe0 74 65 65 20 74 68 61 74 20 53 51 4c 69 74 65 20  tee that SQLite 
10ff0 6d 61 6b 65 73 20 61 62 6f 75 74 20 63 6f 6c 75  makes about colu
11000 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74 68 61 74  mn names is that
11010 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   if the.** colum
11020 6e 20 68 61 73 20 61 6e 20 41 53 20 63 6c 61 75  n has an AS clau
11030 73 65 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20  se assigning it 
11040 61 20 6e 61 6d 65 2c 20 74 68 61 74 20 77 69 6c  a name, that wil
11050 6c 20 62 65 20 74 68 65 20 6e 61 6d 65 20 75 73  l be the name us
11060 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69 73 20 74  ed..** That is t
11070 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74  he only document
11080 65 64 20 67 75 61 72 61 6e 74 65 65 2e 20 20 48  ed guarantee.  H
11090 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73  owever, countles
110a0 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a  s applications.*
110b0 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f 76 65 72  * developed over
110c0 20 74 68 65 20 79 65 61 72 73 20 68 61 76 65 20   the years have 
110d0 6d 61 64 65 20 62 61 73 65 6c 65 73 73 20 61 73  made baseless as
110e0 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20  sumptions about 
110f0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20  column names.** 
11100 61 6e 64 20 77 69 6c 6c 20 62 72 65 61 6b 20 69  and will break i
11110 66 20 74 68 6f 73 65 20 61 73 73 75 6d 70 74 69  f those assumpti
11120 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20 20 48 65  ons changes.  He
11130 6e 63 65 2c 20 75 73 65 20 65 78 74 72 65 6d 65  nce, use extreme
11140 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e   caution.** when
11150 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 69 73 20   modifying this 
11160 72 6f 75 74 69 6e 65 20 74 6f 20 61 76 6f 69 64  routine to avoid
11170 20 62 72 65 61 6b 69 6e 67 20 6c 65 67 61 63 79   breaking legacy
11180 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f  ..**.** See Also
11190 3a 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  : generateColumn
111a0 4e 61 6d 65 73 28 29 0a 2a 2f 0a 69 6e 74 20 73  Names().*/.int s
111b0 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
111c0 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
111d0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
111e0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
111f0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
11200 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
11210 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73       /* Expr lis
11220 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  t from which to 
11230 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61  derive column na
11240 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e  mes */.  i16 *pn
11250 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
11260 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
11270 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
11280 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  here */.  Column
11290 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20   **paCol        
112a0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
112b0 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  ew column list h
112c0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
112d0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
112e0 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62  ->db;   /* Datab
112f0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
11300 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
11310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11320 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
11330 20 2a 2f 0a 20 20 75 33 32 20 63 6e 74 3b 20 20   */.  u32 cnt;  
11340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11350 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64    /* Index added
11360 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d   to make the nam
11370 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f  e unique */.  Co
11380 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f  lumn *aCol, *pCo
11390 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  l;        /* For
113a0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65   looping over re
113b0 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
113c0 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
113e0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
113f0 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
11400 20 73 65 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a   set */.  char *
11410 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
11420 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
11430 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
11440 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
11450 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
11460 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
11470 20 2a 2f 0a 20 20 48 61 73 68 20 68 74 3b 20 20   */.  Hash ht;  
11480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11490 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
114a0 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
114b0 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 48 61 73  */..  sqlite3Has
114c0 68 49 6e 69 74 28 26 68 74 29 3b 0a 20 20 69 66  hInit(&ht);.  if
114d0 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20  ( pEList ){.    
114e0 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
114f0 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d  Expr;.    aCol =
11500 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
11510 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
11520 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a  aCol[0])*nCol);.
11530 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 43      testcase( aC
11540 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ol==0 );.    if(
11550 20 6e 43 6f 6c 3e 33 32 37 36 37 20 29 20 6e 43   nCol>32767 ) nC
11560 6f 6c 20 3d 20 33 32 37 36 37 3b 0a 20 20 7d 65  ol = 32767;.  }e
11570 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
11580 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b  0;.    aCol = 0;
11590 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
115a0 43 6f 6c 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29  Col==(i16)nCol )
115b0 3b 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f  ;.  *pnCol = nCo
115c0 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43  l;.  *paCol = aC
115d0 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ol;..  for(i=0, 
115e0 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f  pCol=aCol; i<nCo
115f0 6c 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  l && !db->malloc
11600 46 61 69 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f  Failed; i++, pCo
11610 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74  l++){.    /* Get
11620 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
11630 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c  name for the col
11640 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  umn.    */.    i
11650 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  f( (zName = pELi
11660 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21  st->a[i].zName)!
11670 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
11680 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e  f the column con
11690 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61  tains an "AS <na
116a0 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65  me>" phrase, use
116b0 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e   <name> as the n
116c0 61 6d 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ame */.    }else
116d0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
116e0 6f 6c 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  olExpr = sqlite3
116f0 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
11700 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
11710 70 72 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  pr);.      while
11720 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
11730 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
11740 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f    pColExpr = pCo
11750 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  lExpr->pRight;. 
11760 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
11770 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ColExpr!=0 );.  
11780 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
11790 72 74 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  rt( pColExpr->op
117a0 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
117b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
117c0 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  lExpr->op==TK_CO
117d0 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
117e0 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75  /* For columns u
117f0 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  se the column na
11800 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  me name */.     
11810 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43     int iCol = pC
11820 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  olExpr->iColumn;
11830 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
11840 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d  pTab = pColExpr-
11850 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61  >pTab;.        a
11860 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
11870 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
11880 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
11890 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
118a0 20 20 20 7a 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e     zName = iCol>
118b0 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  =0 ? pTab->aCol[
118c0 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72  iCol].zName : "r
118d0 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
118e0 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d  se if( pColExpr-
118f0 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
11900 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
11910 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
11920 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  ColExpr, EP_IntV
11930 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
11940 20 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 45 78 70   zName = pColExp
11950 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
11960 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11970 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69    /* Use the ori
11980 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68  ginal text of th
11990 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  e column express
119a0 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20  ion as its name 
119b0 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  */.        zName
119c0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
119d0 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  zSpan;.      }. 
119e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e 61     }.    if( zNa
119f0 6d 65 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  me ){.      zNam
11a00 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
11a10 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  Dup(db, zName);.
11a20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11a30 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
11a40 4d 50 72 69 6e 74 66 28 64 62 2c 22 63 6f 6c 75  MPrintf(db,"colu
11a50 6d 6e 25 64 22 2c 69 2b 31 29 3b 0a 20 20 20 20  mn%d",i+1);.    
11a60 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
11a70 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ure the column n
11a80 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20  ame is unique.  
11a90 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e  If the name is n
11aa0 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a  ot unique,.    *
11ab0 2a 20 61 70 70 65 6e 64 20 61 6e 20 69 6e 74 65  * append an inte
11ac0 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20  ger to the name 
11ad0 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d  so that it becom
11ae0 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a  es unique..    *
11af0 2f 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20  /.    cnt = 0;. 
11b00 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 20     while( zName 
11b10 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 46 69  && sqlite3HashFi
11b20 6e 64 28 26 68 74 2c 20 7a 4e 61 6d 65 29 21 3d  nd(&ht, zName)!=
11b30 30 20 29 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65  0 ){.      nName
11b40 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
11b50 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  30(zName);.     
11b60 20 69 66 28 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a   if( nName>0 ){.
11b70 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 6e 4e          for(j=nN
11b80 61 6d 65 2d 31 3b 20 6a 3e 30 20 26 26 20 73 71  ame-1; j>0 && sq
11b90 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61  lite3Isdigit(zNa
11ba0 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20  me[j]); j--){}. 
11bb0 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
11bc0 5b 6a 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65  [j]==':' ) nName
11bd0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = j;.      }.  
11be0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
11bf0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
11c00 25 2e 2a 7a 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c  %.*z:%u", nName,
11c10 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a   zName, ++cnt);.
11c20 20 20 20 20 20 20 69 66 28 20 63 6e 74 3e 33 20        if( cnt>3 
11c30 29 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d  ) sqlite3_random
11c40 6e 65 73 73 28 73 69 7a 65 6f 66 28 63 6e 74 29  ness(sizeof(cnt)
11c50 2c 20 26 63 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  , &cnt);.    }. 
11c60 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
11c70 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69   zName;.    sqli
11c80 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74  te3ColumnPropert
11c90 69 65 73 46 72 6f 6d 4e 61 6d 65 28 30 2c 20 70  iesFromName(0, p
11ca0 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  Col);.    if( zN
11cb0 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48 61  ame && sqlite3Ha
11cc0 73 68 49 6e 73 65 72 74 28 26 68 74 2c 20 7a 4e  shInsert(&ht, zN
11cd0 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c  ame, pCol)==pCol
11ce0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11cf0 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
11d00 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
11d10 65 33 48 61 73 68 43 6c 65 61 72 28 26 68 74 29  e3HashClear(&ht)
11d20 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
11d30 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
11d40 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  for(j=0; j<i; j+
11d50 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
11d60 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
11d70 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [j].zName);.    
11d80 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
11d90 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20  ree(db, aCol);. 
11da0 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20     *paCol = 0;. 
11db0 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20     *pnCol = 0;. 
11dc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11dd0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
11de0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11df0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
11e00 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  d type and colla
11e10 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
11e20 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73   to a column lis
11e30 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20  t based on.** a 
11e40 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11e50 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c  ..** .** The col
11e60 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61  umn list presuma
11e70 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65  bly came from se
11e80 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46  lectColumnNamesF
11e90 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a  romExprList()..*
11ea0 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
11eb0 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73  t has only names
11ec0 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63  , not types or c
11ed0 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73  ollations.  This
11ee0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  .** routine goes
11ef0 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64   through and add
11f00 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64 20  s the types and 
11f10 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  collations..**.*
11f20 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
11f30 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c  equires that all
11f40 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   identifiers in 
11f50 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  the SELECT.** st
11f60 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c  atement be resol
11f70 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ved..*/.void sql
11f80 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c  ite3SelectAddCol
11f90 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
11fa0 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
11fb0 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
11fc0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73  Parsing contexts
11fd0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
11fe0 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  b,          /* A
11ff0 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69  dd column type i
12000 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
12010 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65  is table */.  Se
12020 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
12030 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73      /* SELECT us
12040 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
12050 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
12060 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ions */.){.  sql
12070 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
12080 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e  e->db;.  NameCon
12090 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75  text sNC;.  Colu
120a0 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c  mn *pCol;.  Coll
120b0 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
120c0 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a  t i;.  Expr *p;.
120d0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
120e0 74 5f 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73  t_item *a;..  as
120f0 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30  sert( pSelect!=0
12100 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
12110 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
12120 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21   & SF_Resolved)!
12130 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
12140 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c  pTab->nCol==pSel
12150 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
12160 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
12170 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
12180 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12190 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d   ) return;.  mem
121a0 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
121b0 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
121c0 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c  .pSrcList = pSel
121d0 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d  ect->pSrc;.  a =
121e0 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
121f0 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ->a;.  for(i=0, 
12200 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
12210 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
12220 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
12230 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
12240 70 65 3b 0a 20 20 20 20 69 6e 74 20 6e 2c 20 6d  pe;.    int n, m
12250 3b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70  ;.    p = a[i].p
12260 45 78 70 72 3b 0a 20 20 20 20 7a 54 79 70 65 20  Expr;.    zType 
12270 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
12280 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  C, p, 0, 0, 0);.
12290 20 20 20 20 2f 2a 20 70 43 6f 6c 2d 3e 73 7a 45      /* pCol->szE
122a0 73 74 20 3d 20 2e 2e 2e 20 2f 2f 20 43 6f 6c 75  st = ... // Colu
122b0 6d 6e 20 73 69 7a 65 20 65 73 74 20 66 6f 72 20  mn size est for 
122c0 53 45 4c 45 43 54 20 74 61 62 6c 65 73 20 6e 65  SELECT tables ne
122d0 76 65 72 20 75 73 65 64 20 2a 2f 0a 20 20 20 20  ver used */.    
122e0 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
122f0 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
12300 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28  nity(p);.    if(
12310 20 7a 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20   zType ){.      
12320 6d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  m = sqlite3Strle
12330 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20  n30(zType);.    
12340 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
12350 6c 65 6e 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  len30(pCol->zNam
12360 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e  e);.      pCol->
12370 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
12380 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64  bReallocOrFree(d
12390 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  b, pCol->zName, 
123a0 6e 2b 6d 2b 32 29 3b 0a 20 20 20 20 20 20 69 66  n+m+2);.      if
123b0 28 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b  ( pCol->zName ){
123c0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
123d0 26 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31  &pCol->zName[n+1
123e0 5d 2c 20 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a  ], zType, m+1);.
123f0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f          pCol->co
12400 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
12410 47 5f 48 41 53 54 59 50 45 3b 0a 20 20 20 20 20  G_HASTYPE;.     
12420 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
12430 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
12440 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  =0 ) pCol->affin
12450 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
12460 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c  _BLOB;.    pColl
12470 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
12480 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
12490 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
124a0 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d  && pCol->zColl==
124b0 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  0 ){.      pCol-
124c0 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >zColl = sqlite3
124d0 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f  DbStrDup(db, pCo
124e0 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
124f0 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a  }.  }.  pTab->sz
12500 54 61 62 52 6f 77 20 3d 20 31 3b 20 2f 2a 20 41  TabRow = 1; /* A
12510 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ny non-zero valu
12520 65 20 77 6f 72 6b 73 20 2a 2f 0a 7d 0a 0a 2f 2a  e works */.}../*
12530 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45  .** Given a SELE
12540 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65  CT statement, ge
12550 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73  nerate a Table s
12560 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
12570 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72  scribes.** the r
12580 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61  esult set of tha
12590 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62  t SELECT..*/.Tab
125a0 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c  le *sqlite3Resul
125b0 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72  tSetOfSelect(Par
125c0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
125d0 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
125e0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73  Table *pTab;.  s
125f0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
12600 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73  rse->db;.  int s
12610 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61  avedFlags;..  sa
12620 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66  vedFlags = db->f
12630 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  lags;.  db->flag
12640 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c  s &= ~SQLITE_Ful
12650 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d  lColNames;.  db-
12660 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
12670 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a  _ShortColNames;.
12680 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
12690 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c  rep(pParse, pSel
126a0 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ect, 0);.  if( p
126b0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
126c0 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28  turn 0;.  while(
126d0 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
126e0 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65   ) pSelect = pSe
126f0 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
12700 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65  db->flags = save
12710 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d  dFlags;.  pTab =
12720 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
12730 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
12740 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20  Table) );.  if( 
12750 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pTab==0 ){.    r
12760 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f  eturn 0;.  }.  /
12770 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52 65 73  * The sqlite3Res
12780 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
12790 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20   is only used n 
127a0 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c  contexts where l
127b0 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73  ookaside.  ** is
127c0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61   disabled */.  a
127d0 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61  ssert( db->looka
127e0 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20 29 3b  side.bDisable );
127f0 0a 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66  .  pTab->nTabRef
12800 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e   = 1;.  pTab->zN
12810 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d  ame = 0;.  pTab-
12820 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
12830 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
12840 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
12850 34 38 35 37 36 29 20 29 3b 0a 20 20 73 71 6c 69  48576) );.  sqli
12860 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
12870 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
12880 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20  Select->pEList, 
12890 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
128a0 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c  ab->aCol);.  sql
128b0 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c  ite3SelectAddCol
128c0 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
128d0 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
128e0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54  , pSelect);.  pT
128f0 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
12900 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
12910 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
12920 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
12930 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
12940 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
12950 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
12960 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45  /*.** Get a VDBE
12970 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
12980 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20  arser context.  
12990 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
129a0 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
129b0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
129c0 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c  curs, return NUL
129d0 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65  L and leave a me
129e0 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
129f0 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65  .*/.Vdbe *sqlite
12a00 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a  3GetVdbe(Parse *
12a10 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
12a20 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a  Parse->pVdbe ){.
12a30 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 72 73      return pPars
12a40 65 2d 3e 70 56 64 62 65 3b 0a 20 20 7d 0a 20 20  e->pVdbe;.  }.  
12a50 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70  if( pParse->pTop
12a60 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f  level==0.   && O
12a70 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
12a80 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 53 51  ed(pParse->db,SQ
12a90 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f  LITE_FactorOutCo
12aa0 6e 73 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 50  nst).  ){.    pP
12ab0 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63  arse->okConstFac
12ac0 74 6f 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  tor = 1;.  }.  r
12ad0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
12ae0 65 43 72 65 61 74 65 28 70 50 61 72 73 65 29 3b  eCreate(pParse);
12af0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
12b00 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
12b10 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
12b20 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
12b30 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
12b40 4c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e  Limit expression
12b50 73 2e 20 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  s.  pLimit->pLef
12b60 74 20 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52  t and pLimit->pR
12b70 69 67 68 74 20 68 6f 6c 64 20 74 68 65 20 65 78  ight hold the ex
12b80 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
12b90 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
12ba0 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
12bb0 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65  tement after the
12bc0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
12bd0 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20  T.** keywords.  
12be0 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65  Or NULL if those
12bf0 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d   keywords are om
12c00 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e  itted. iLimit an
12c10 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72  d iOffset .** ar
12c20 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65  e the integer me
12c30 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75  mory register nu
12c40 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65  mbers for counte
12c50 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  rs used to compu
12c60 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74  te .** the limit
12c70 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66   and offset.  If
12c80 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d   there is no lim
12c90 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74  it and/or offset
12ca0 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69  , then .** iLimi
12cb0 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
12cc0 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  e negative..**.*
12cd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
12ce0 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65  hanges the value
12cf0 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20  s of iLimit and 
12d00 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a  iOffset only if.
12d10 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66  ** a limit or of
12d20 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20  fset is defined 
12d30 62 79 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  by pLimit->pLeft
12d40 20 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69   and pLimit->pRi
12d50 67 68 74 2e 20 20 69 4c 69 6d 69 74 0a 2a 2a 20  ght.  iLimit.** 
12d60 61 6e 64 20 69 4f 66 66 73 65 74 20 73 68 6f 75  and iOffset shou
12d70 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
12d80 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
12d90 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
12da0 73 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f  s (zero).** prio
12db0 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
12dc0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
12dd0 20 54 68 65 20 69 4f 66 66 73 65 74 20 72 65 67   The iOffset reg
12de0 69 73 74 65 72 20 28 69 66 20 69 74 20 65 78 69  ister (if it exi
12df0 73 74 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69  sts) is initiali
12e00 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  zed to the value
12e10 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45  .** of the OFFSE
12e20 54 2e 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72  T.  The iLimit r
12e30 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69  egister is initi
12e40 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e  alized to LIMIT.
12e50 20 20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f    Register.** iO
12e60 66 66 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69  ffset+1 is initi
12e70 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b  alized to LIMIT+
12e80 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  OFFSET..**.** On
12e90 6c 79 20 69 66 20 70 4c 69 6d 69 74 2d 3e 70 4c  ly if pLimit->pL
12ea0 65 66 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69  eft!=0 do the li
12eb0 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65  mit registers ge
12ec0 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20  t.** redefined. 
12ed0 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
12ee0 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69  perator uses thi
12ef0 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f  s property to fo
12f00 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65  rce.** the reuse
12f10 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d   of the same lim
12f20 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65  it and offset re
12f30 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d  gisters across m
12f40 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43  ultiple.** SELEC
12f50 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  T statements..*/
12f60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
12f70 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
12f80 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
12f90 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
12fa0 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65   iBreak){.  Vdbe
12fb0 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *v = 0;.  int i
12fc0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Limit = 0;.  int
12fd0 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20   iOffset;.  int 
12fe0 6e 3b 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  n;.  Expr *pLimi
12ff0 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a  t = p->pLimit;..
13000 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
13010 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
13020 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22  .  ** "LIMIT -1"
13030 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c   always shows al
13040 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69  l rows.  There i
13050 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74  s some.  ** cont
13060 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77 68  roversy about wh
13070 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
13080 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62  ehavior should b
13090 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72  e..  ** The curr
130a0 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
130b0 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c  on interprets "L
130c0 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a  IMIT 0" to mean.
130d0 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20    ** no rows..  
130e0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
130f0 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
13100 65 29 3b 0a 20 20 69 66 28 20 70 4c 69 6d 69 74  e);.  if( pLimit
13110 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
13120 70 4c 69 6d 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c  pLimit->op==TK_L
13130 49 4d 49 54 20 29 3b 0a 20 20 20 20 61 73 73 65  IMIT );.    asse
13140 72 74 28 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  rt( pLimit->pLef
13150 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69  t!=0 );.    p->i
13160 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d  Limit = iLimit =
13170 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
13180 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
13190 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
131a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d  .    assert( v!=
131b0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 );.    if( sql
131c0 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
131d0 72 28 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c  r(pLimit->pLeft,
131e0 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71   &n) ){.      sq
131f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13200 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e  v, OP_Integer, n
13210 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
13220 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
13230 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
13240 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d  ));.      if( n=
13250 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
13260 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
13270 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
13280 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26  }else if( n>=0 &
13290 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  & p->nSelectRow>
132a0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75  sqlite3LogEst((u
132b0 36 34 29 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  64)n) ){.       
132c0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
132d0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
132e0 75 36 34 29 6e 29 3b 0a 20 20 20 20 20 20 20 20  u64)n);.        
132f0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
13300 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a 20 20  F_FixedLimit;.  
13310 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
13320 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
13330 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
13340 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 69 4c  Limit->pLeft, iL
13350 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  imit);.      sql
13360 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
13370 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
13380 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
13390 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
133a0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
133b0 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29  "LIMIT counter")
133c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
133d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
133e0 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20  _IfNot, iLimit, 
133f0 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
13400 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
13410 20 20 20 20 69 66 28 20 70 4c 69 6d 69 74 2d 3e      if( pLimit->
13420 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
13430 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66  p->iOffset = iOf
13440 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  fset = ++pParse-
13450 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
13460 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f  rse->nMem++;   /
13470 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78  * Allocate an ex
13480 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72  tra register for
13490 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f   limit+offset */
134a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
134b0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
134c0 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2c 20 69  Limit->pRight, i
134d0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
134e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
134f0 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
13500 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65  , iOffset); Vdbe
13510 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
13520 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
13530 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74  v, "OFFSET count
13540 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  er"));.      sql
13550 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
13560 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74  , OP_OffsetLimit
13570 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65  , iLimit, iOffse
13580 74 2b 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  t+1, iOffset);. 
13590 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
135a0 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53  ((v, "LIMIT+OFFS
135b0 45 54 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ET"));.    }.  }
135c0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
135d0 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
135e0 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65  _SELECT./*.** Re
135f0 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
13600 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  iate collating s
13610 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
13620 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
13630 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  f.** the result 
13640 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  set for the comp
13650 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74  ound-select stat
13660 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75  ement "p".  Retu
13670 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68  rn NULL if.** th
13680 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20  e column has no 
13690 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
136a0 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
136b0 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
136c0 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
136d0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
136e0 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
136f0 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
13700 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65  term of the sele
13710 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  ct that has a co
13720 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
13730 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ..*/.static Coll
13740 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  Seq *multiSelect
13750 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
13760 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
13770 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43  , int iCol){.  C
13780 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20  ollSeq *pRet;.  
13790 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
137a0 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74  .    pRet = mult
137b0 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
137c0 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72  Parse, p->pPrior
137d0 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  , iCol);.  }else
137e0 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  {.    pRet = 0;.
137f0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43    }.  assert( iC
13800 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43  ol>=0 );.  /* iC
13810 6f 6c 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20  ol must be less 
13820 74 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  than p->pEList->
13830 6e 45 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73  nExpr.  Otherwis
13840 65 20 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64  e an error would
13850 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
13860 74 68 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61  thrown during na
13870 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e  me resolution an
13880 64 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68  d we would not h
13890 61 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20  ave gotten.  ** 
138a0 74 68 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66  this far */.  if
138b0 28 20 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57  ( pRet==0 && ALW
138c0 41 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69  AYS(iCol<p->pELi
138d0 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
138e0 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
138f0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
13900 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
13910 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20  [iCol].pExpr);. 
13920 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
13930 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
13940 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
13950 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
13960 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
13970 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
13980 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f  ECT.** with an O
13990 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
139a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
139b0 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75  locates and retu
139c0 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a  rns a KeyInfo.**
139d0 20 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61   structure suita
139e0 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e  ble for implemen
139f0 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
13a00 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  Y..**.** Space t
13a10 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e  o hold the KeyIn
13a20 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
13a30 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
13a40 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e  lloc. The callin
13a50 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  g.** function is
13a60 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
13a70 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74   ensuring that t
13a80 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
13a90 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
13aa0 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reed..*/.static 
13ab0 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65  KeyInfo *multiSe
13ac0 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
13ad0 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
13ae0 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
13af0 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72   nExtra){.  Expr
13b00 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
13b10 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
13b20 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  int nOrderBy = p
13b30 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
13b40 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r;.  sqlite3 *db
13b50 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
13b60 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d   KeyInfo *pRet =
13b70 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
13b80 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42  lloc(db, nOrderB
13b90 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20  y+nExtra, 1);.  
13ba0 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
13bb0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
13bc0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
13bd0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
13be0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
13bf0 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65   *pItem = &pOrde
13c00 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  rBy->a[i];.     
13c10 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70   Expr *pTerm = p
13c20 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
13c30 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
13c40 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54  l;..      if( pT
13c50 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  erm->flags & EP_
13c60 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
13c70 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
13c80 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
13c90 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20  arse, pTerm);.  
13ca0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13cb0 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69     pColl = multi
13cc0 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
13cd0 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e  arse, p, pItem->
13ce0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d  u.x.iOrderByCol-
13cf0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
13d00 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c  pColl==0 ) pColl
13d10 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
13d20 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
13d30 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  By->a[i].pExpr =
13d40 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13d50 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
13d60 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70  String(pParse, p
13d70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  Term, pColl->zNa
13d80 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
13d90 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
13da0 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
13db0 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20  able(pRet) );.  
13dc0 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b      pRet->aColl[
13dd0 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
13de0 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64    pRet->aSortOrd
13df0 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
13e00 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
13e10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
13e20 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23  eturn pRet;.}..#
13e30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13e40 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69  IT_CTE./*.** Thi
13e50 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
13e60 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f  tes VDBE code to
13e70 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e   compute the con
13e80 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52  tent of a WITH R
13e90 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72  ECURSIVE.** quer
13ea0 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  y of the form:.*
13eb0 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76  *.**   <recursiv
13ec0 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65  e-table> AS (<se
13ed0 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e  tup-query> UNION
13ee0 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76   [ALL] <recursiv
13ef0 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20  e-query>).**    
13f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f10 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
13f20 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  _/             \
13f30 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
13f40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
13f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
13f60 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20  >pPrior         
13f70 20 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a               p.*
13f80 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  *.**.** There is
13f90 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66   exactly one ref
13fa0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65  erence to the re
13fb0 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e  cursive-table in
13fc0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
13fd0 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65  .** of recursive
13fe0 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77  -query, marked w
13ff0 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d  ith the SrcList-
14000 3e 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73  >a[].fg.isRecurs
14010 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20  ive flag..**.** 
14020 54 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20  The setup-query 
14030 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e  runs once to gen
14040 65 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c  erate an initial
14050 20 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61   set of rows tha
14060 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51  t go.** into a Q
14070 75 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77  ueue table.  Row
14080 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20  s are extracted 
14090 66 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74  from the Queue t
140a0 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f  able one by.** o
140b0 6e 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78  ne.  Each row ex
140c0 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65  tracted from Que
140d0 75 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20  ue is output to 
140e0 70 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65  pDest.  Then the
140f0 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61   single.** extra
14100 63 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e  cted row (now in
14110 20 74 68 65 20 69 43 75 72 72 65 6e 74 20 74 61   the iCurrent ta
14120 62 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65  ble) becomes the
14130 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a   content of the.
14140 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61 62  ** recursive-tab
14150 6c 65 20 66 6f 72 20 61 20 72 65 63 75 72 73 69  le for a recursi
14160 76 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54  ve-query run.  T
14170 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
14180 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
14190 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61 63  .** is added bac
141a0 6b 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65  k into the Queue
141b0 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e   table.  Then an
141c0 6f 74 68 65 72 20 72 6f 77 20 69 73 20 65 78 74  other row is ext
141d0 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75  racted from Queu
141e0 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65  e.** and the ite
141f0 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ration continues
14200 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65   until the Queue
14210 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
14220 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
14230 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65  mpound query ope
14240 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74  rator is UNION t
14250 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65  hen no duplicate
14260 20 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a   rows are ever.*
14270 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
14280 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e  the Queue table.
14290 20 20 54 68 65 20 69 44 69 73 74 69 6e 63 74 20    The iDistinct 
142a0 74 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f  table keeps a co
142b0 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a  py of all rows.*
142c0 2a 20 74 68 61 74 20 68 61 76 65 20 65 76 65 72  * that have ever
142d0 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69   been inserted i
142e0 6e 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61  nto Queue and ca
142f0 75 73 65 73 20 64 75 70 6c 69 63 61 74 65 73 20  uses duplicates 
14300 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64  to be.** discard
14310 65 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72  ed.  If the oper
14320 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c  ator is UNION AL
14330 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74  L, then duplicat
14340 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  es are allowed..
14350 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75  ** .** If the qu
14360 65 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52  ery has an ORDER
14370 20 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65   BY, then entrie
14380 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 74  s in the Queue t
14390 61 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e  able are kept in
143a0 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64  .** ORDER BY ord
143b0 65 72 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  er and the first
143c0 20 65 6e 74 72 79 20 69 73 20 65 78 74 72 61 63   entry is extrac
143d0 74 65 64 20 66 6f 72 20 65 61 63 68 20 63 79 63  ted for each cyc
143e0 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20  le.  Without.** 
143f0 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  an ORDER BY, the
14400 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20   Queue table is 
14410 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a  just a FIFO..**.
14420 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c  ** If a LIMIT cl
14430 61 75 73 65 20 69 73 20 70 72 6f 76 69 64 65 64  ause is provided
14440 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61  , then the itera
14450 74 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72  tion stops after
14460 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68   LIMIT rows.** h
14470 61 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20  ave been output 
14480 74 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d  to pDest.  A LIM
14490 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73  IT of zero means
144a0 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f   to output no ro
144b0 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61  ws and a.** nega
144c0 74 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73  tive LIMIT means
144d0 20 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72   to output all r
144e0 6f 77 73 2e 20 20 49 66 20 74 68 65 72 65 20 69  ows.  If there i
144f0 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54  s also an OFFSET
14500 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20   clause.** with 
14510 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
14520 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
14530 20 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73 20   OFFSET outputs 
14540 61 72 65 20 64 69 73 63 61 72 64 65 64 20 72 61  are discarded ra
14550 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69  ther.** than bei
14560 6e 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74  ng sent to pDest
14570 2e 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75  .  The LIMIT cou
14580 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  nt does not begi
14590 6e 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46  n until after OF
145a0 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76  FSET.** rows hav
145b0 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a  e been skipped..
145c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
145d0 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72  enerateWithRecur
145e0 73 69 76 65 51 75 65 72 79 28 0a 20 20 50 61 72  siveQuery(.  Par
145f0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
14600 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
14610 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
14620 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
14630 20 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69 76   /* The recursiv
14640 65 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63  e SELECT to be c
14650 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
14660 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
14670 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
14680 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
14690 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
146a0 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
146b0 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
146c0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
146d0 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79   recursive query
146e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d   */.  int nCol =
146f0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
14700 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  r;  /* Number of
14710 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
14720 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 20  recursive table 
14730 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
14740 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
14750 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
14760 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64  ed statement und
14770 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
14780 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
14790 74 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  tup = p->pPrior;
147a0 20 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20     /* The setup 
147b0 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61  query */.  int a
147c0 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20  ddrTop;         
147d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
147e0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
147f0 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61   int addrCont, a
14800 64 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f  ddrBreak;      /
14810 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42  * CONTINUE and B
14820 52 45 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a  REAK addresses *
14830 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74  /.  int iCurrent
14840 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
14850 20 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74    /* The Current
14860 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
14870 72 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20  regCurrent;     
14880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
14890 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75  ister holding Cu
148a0 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  rrent table */. 
148b0 20 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20   int iQueue;    
148c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
148d0 2a 20 54 68 65 20 51 75 65 75 65 20 74 61 62 6c  * The Queue tabl
148e0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74  e */.  int iDist
148f0 69 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20  inct = 0;       
14900 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72       /* To ensur
14910 65 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73  e unique results
14920 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69   if UNION */.  i
14930 6e 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46  nt eDest = SRT_F
14940 69 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ifo;         /* 
14950 48 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20  How to write to 
14960 51 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63  Queue */.  Selec
14970 74 44 65 73 74 20 64 65 73 74 51 75 65 75 65 3b  tDest destQueue;
14980 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
14990 63 74 44 65 73 74 20 74 61 72 67 65 74 74 69 6e  ctDest targettin
149a0 67 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  g the Queue tabl
149b0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149d0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
149e0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
149f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14a00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
14a10 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72  t code */.  Expr
14a20 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
14a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14a40 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
14a50 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d   */.  Expr *pLim
14a60 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
14a70 20 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d      /* Saved LIM
14a80 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f  IT and OFFSET */
14a90 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c  .  int regLimit,
14aa0 20 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20   regOffset;     
14ab0 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75 73   /* Registers us
14ac0 65 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20  ed by LIMIT and 
14ad0 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20  OFFSET */..  /* 
14ae0 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61  Obtain authoriza
14af0 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63  tion to do a rec
14b00 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
14b10 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
14b20 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
14b30 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c  QLITE_RECURSIVE,
14b40 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
14b50 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73  rn;..  /* Proces
14b60 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  s the LIMIT and 
14b70 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20  OFFSET clauses, 
14b80 69 66 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f  if they exist */
14b90 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73  .  addrBreak = s
14ba0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
14bb0 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65  bel(v);.  p->nSe
14bc0 6c 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20  lectRow = 320;  
14bd0 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77  /* 4 billion row
14be0 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69  s */.  computeLi
14bf0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
14c00 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61  rse, p, addrBrea
14c10 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70  k);.  pLimit = p
14c20 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4c  ->pLimit;.  regL
14c30 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
14c40 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20  ;.  regOffset = 
14c50 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d  p->iOffset;.  p-
14c60 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >pLimit = 0;.  p
14c70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f  ->iLimit = p->iO
14c80 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72  ffset = 0;.  pOr
14c90 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
14ca0 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  rBy;..  /* Locat
14cb0 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  e the cursor num
14cc0 62 65 72 20 6f 66 20 74 68 65 20 43 75 72 72 65  ber of the Curre
14cd0 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f  nt table */.  fo
14ce0 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c  r(i=0; ALWAYS(i<
14cf0 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b  pSrc->nSrc); i++
14d00 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  ){.    if( pSrc-
14d10 3e 61 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75 72  >a[i].fg.isRecur
14d20 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43  sive ){.      iC
14d30 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61  urrent = pSrc->a
14d40 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20  [i].iCursor;.   
14d50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
14d60 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
14d70 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65  te cursors numbe
14d80 72 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64  rs for Queue and
14d90 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20   Distinct.  The 
14da0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
14db0 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69  r.  ** the Disti
14dc0 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62  nct table must b
14dd0 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72  e exactly one gr
14de0 65 61 74 65 72 20 74 68 61 6e 20 51 75 65 75 65  eater than Queue
14df0 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66   in order.  ** f
14e00 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73 74 46  or the SRT_DistF
14e10 69 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74  ifo and SRT_Dist
14e20 51 75 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f  Queue destinatio
14e30 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20  ns to work. */. 
14e40 20 69 51 75 65 75 65 20 3d 20 70 50 61 72 73 65   iQueue = pParse
14e50 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20  ->nTab++;.  if( 
14e60 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
14e70 29 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70  ){.    eDest = p
14e80 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69  OrderBy ? SRT_Di
14e90 73 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69  stQueue : SRT_Di
14ea0 73 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73  stFifo;.    iDis
14eb0 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
14ec0 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  nTab++;.  }else{
14ed0 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72  .    eDest = pOr
14ee0 64 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75  derBy ? SRT_Queu
14ef0 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20  e : SRT_Fifo;.  
14f00 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  }.  sqlite3Selec
14f10 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 51  tDestInit(&destQ
14f20 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75  ueue, eDest, iQu
14f30 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  eue);..  /* Allo
14f40 63 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72  cate cursors for
14f50 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c   Current, Queue,
14f60 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a   and Distinct. *
14f70 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d  /.  regCurrent =
14f80 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
14f90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14fa0 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
14fb0 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c  seudo, iCurrent,
14fc0 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f   regCurrent, nCo
14fd0 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72  l);.  if( pOrder
14fe0 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  By ){.    KeyInf
14ff0 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75  o *pKeyInfo = mu
15000 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
15010 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
15020 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, 1);.    sqlit
15030 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
15040 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
15050 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72  , iQueue, pOrder
15060 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a  By->nExpr+2, 0,.
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15080 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
15090 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
150a0 4f 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75  O);.    destQueu
150b0 65 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  e.pOrderBy = pOr
150c0 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a  derBy;.  }else{.
150d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
150e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
150f0 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75  Ephemeral, iQueu
15100 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20  e, nCol);.  }.  
15110 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
15120 22 51 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b  "Queue table"));
15130 0a 20 20 69 66 28 20 69 44 69 73 74 69 6e 63 74  .  if( iDistinct
15140 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f   ){.    p->addrO
15150 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c  penEphm[0] = sql
15160 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15170 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
15180 61 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30  al, iDistinct, 0
15190 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  );.    p->selFla
151a0 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
151b0 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f  emeral;.  }..  /
151c0 2a 20 44 65 74 61 63 68 20 74 68 65 20 4f 52 44  * Detach the ORD
151d0 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f  ER BY clause fro
151e0 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53  m the compound S
151f0 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f  ELECT */.  p->pO
15200 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f  rderBy = 0;..  /
15210 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
15220 6c 74 73 20 6f 66 20 74 68 65 20 73 65 74 75 70  lts of the setup
15230 2d 71 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e  -query in Queue.
15240 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e   */.  pSetup->pN
15250 65 78 74 20 3d 20 30 3b 0a 20 20 45 78 70 6c 61  ext = 0;.  Expla
15260 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
15270 72 73 65 2c 20 31 2c 20 22 53 45 54 55 50 22 29  rse, 1, "SETUP")
15280 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
15290 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
152a0 70 53 65 74 75 70 2c 20 26 64 65 73 74 51 75 65  pSetup, &destQue
152b0 75 65 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70  ue);.  pSetup->p
152c0 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69 66 28 20  Next = p;.  if( 
152d0 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66  rc ) goto end_of
152e0 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79  _recursive_query
152f0 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ;..  /* Find the
15300 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65   next row in the
15310 20 51 75 65 75 65 20 61 6e 64 20 6f 75 74 70 75   Queue and outpu
15320 74 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20  t that row */.  
15330 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
15340 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15350 50 5f 52 65 77 69 6e 64 2c 20 69 51 75 65 75 65  P_Rewind, iQueue
15360 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64  , addrBreak); Vd
15370 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
15380 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68    /* Transfer th
15390 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 51 75  e next row in Qu
153a0 65 75 65 20 6f 76 65 72 20 74 6f 20 43 75 72 72  eue over to Curr
153b0 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ent */.  sqlite3
153c0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
153d0 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65  _NullRow, iCurre
153e0 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74  nt); /* To reset
153f0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f   column cache */
15400 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
15410 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
15420 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
15430 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70  olumn, iQueue, p
15440 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31  OrderBy->nExpr+1
15450 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20  , regCurrent);. 
15460 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
15470 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15480 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 51 75   OP_RowData, iQu
15490 65 75 65 2c 20 72 65 67 43 75 72 72 65 6e 74 29  eue, regCurrent)
154a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
154b0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
154c0 44 65 6c 65 74 65 2c 20 69 51 75 65 75 65 29 3b  Delete, iQueue);
154d0 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68  ..  /* Output th
154e0 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20  e single row in 
154f0 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64  Current */.  add
15500 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  rCont = sqlite3V
15510 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
15520 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c  .  codeOffset(v,
15530 20 72 65 67 4f 66 66 73 65 74 2c 20 61 64 64 72   regOffset, addr
15540 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74 49  Cont);.  selectI
15550 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
15560 20 70 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20   p, iCurrent,.  
15570 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c      0, 0, pDest,
15580 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
15590 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67  reak);.  if( reg
155a0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
155b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
155c0 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
155d0 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64  o, regLimit, add
155e0 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
155f0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15600 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
15610 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
15620 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20  ddrCont);..  /* 
15630 45 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75  Execute the recu
15640 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b  rsive SELECT tak
15650 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72  ing the single r
15660 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73  ow in Current as
15670 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
15680 66 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76  for the recursiv
15690 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74  e-table. Store t
156a0 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
156b0 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20  e Queue..  */.  
156c0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
156d0 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  & SF_Aggregate )
156e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
156f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
15700 65 63 75 72 73 69 76 65 20 61 67 67 72 65 67 61  ecursive aggrega
15710 74 65 20 71 75 65 72 69 65 73 20 6e 6f 74 20 73  te queries not s
15720 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65  upported");.  }e
15730 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69  lse{.    p->pPri
15740 6f 72 20 3d 20 30 3b 0a 20 20 20 20 45 78 70 6c  or = 0;.    Expl
15750 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
15760 61 72 73 65 2c 20 31 2c 20 22 52 45 43 55 52 53  arse, 1, "RECURS
15770 49 56 45 20 53 54 45 50 22 29 29 3b 0a 20 20 20  IVE STEP"));.   
15780 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
15790 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51  Parse, p, &destQ
157a0 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72  ueue);.    asser
157b0 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
157c0 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  );.    p->pPrior
157d0 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a   = pSetup;.  }..
157e0 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e    /* Keep runnin
157f0 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c  g the loop until
15800 20 74 68 65 20 51 75 65 75 65 20 69 73 20 65 6d   the Queue is em
15810 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  pty */.  sqlite3
15820 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
15830 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Top);.  sqlite3V
15840 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15850 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a  v, addrBreak);..
15860 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65  end_of_recursive
15870 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65  _query:.  sqlite
15880 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
15890 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
158a0 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70  OrderBy);.  p->p
158b0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
158c0 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  By;.  p->pLimit 
158d0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 72 65 74 75  = pLimit;.  retu
158e0 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
158f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20  SQLITE_OMIT_CTE 
15900 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  */../* Forward r
15910 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61  eferences */.sta
15920 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
15930 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
15940 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
15950 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
15960 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
15970 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
15980 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
15990 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
159a0 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
159b0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
159c0 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
159d0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
159e0 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a  esults */.);../*
159f0 0a 2a 2a 20 48 61 6e 64 6c 65 20 74 68 65 20 73  .** Handle the s
15a00 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61  pecial case of a
15a10 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
15a20 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
15a30 20 66 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45   from a.** VALUE
15a40 53 20 63 6c 61 75 73 65 2e 20 20 42 79 20 68 61  S clause.  By ha
15a50 6e 64 6c 69 6e 67 20 74 68 69 73 20 61 73 20 61  ndling this as a
15a60 20 73 70 65 63 69 61 6c 20 63 61 73 65 2c 20 77   special case, w
15a70 65 20 61 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20  e avoid deep.** 
15a80 72 65 63 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74  recursion, and t
15a90 68 75 73 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20  hus do not need 
15aa0 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 65 20 53  to enforce the S
15ab0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
15ac0 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f  OUND_SELECT.** o
15ad0 6e 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73  n a VALUES claus
15ae0 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65  e..**.** Because
15af0 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65   the Select obje
15b00 63 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  ct originates fr
15b10 6f 6d 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75  om a VALUES clau
15b20 73 65 3a 0a 2a 2a 20 20 20 28 31 29 20 54 68 65  se:.**   (1) The
15b30 72 65 20 69 73 20 6e 6f 20 4c 49 4d 49 54 20 6f  re is no LIMIT o
15b40 72 20 4f 46 46 53 45 54 20 6f 72 20 65 6c 73 65  r OFFSET or else
15b50 20 74 68 65 72 65 20 69 73 20 61 20 4c 49 4d 49   there is a LIMI
15b60 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 0a 2a  T of exactly 1.*
15b70 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d  *   (2) All term
15b80 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a  s are UNION ALL.
15b90 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65 20 69  **   (3) There i
15ba0 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
15bb0 61 75 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  ause.**.** The "
15bc0 4c 49 4d 49 54 20 6f 66 20 65 78 61 63 74 6c 79  LIMIT of exactly
15bd0 20 31 22 20 63 61 73 65 20 6f 66 20 63 6f 6e 64   1" case of cond
15be0 69 74 69 6f 6e 20 28 31 29 20 63 6f 6d 65 73 20  ition (1) comes 
15bf0 61 62 6f 75 74 20 77 68 65 6e 20 61 20 56 41 4c  about when a VAL
15c00 55 45 53 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 63  UES.** clause oc
15c10 63 75 72 73 20 77 69 74 68 69 6e 20 73 63 61 6c  curs within scal
15c20 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65  ar expression (e
15c30 78 3a 20 22 53 45 4c 45 43 54 20 28 56 41 4c 55  x: "SELECT (VALU
15c40 45 53 28 31 29 2c 28 32 29 2c 28 33 29 29 22 29  ES(1),(2),(3))")
15c50 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  ..** The sqlite3
15c60 43 6f 64 65 53 75 62 73 65 6c 65 63 74 20 77 69  CodeSubselect wi
15c70 6c 6c 20 68 61 76 65 20 61 64 64 65 64 20 74 68  ll have added th
15c80 65 20 4c 49 4d 49 54 20 31 20 63 6c 61 75 73 65  e LIMIT 1 clause
15c90 20 69 6e 20 74 68 74 20 63 61 73 65 2e 0a 2a 2a   in tht case..**
15ca0 20 53 69 6e 63 65 20 74 68 65 20 6c 69 6d 69 74   Since the limit
15cb0 20 69 73 20 65 78 61 63 74 6c 79 20 31 2c 20 77   is exactly 1, w
15cc0 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 65  e only need to e
15cd0 76 61 6c 75 74 65 73 20 74 68 65 20 6c 65 66 74  valutes the left
15ce0 2d 6d 6f 73 74 20 56 41 4c 55 45 53 2e 0a 2a 2f  -most VALUES..*/
15cf0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
15d00 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 0a 20  iSelectValues(. 
15d10 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
15d20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
15d30 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
15d40 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
15d50 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
15d60 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
15d70 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
15d80 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
15d90 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
15da0 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
15db0 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
15dc0 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a    int nRow = 1;.
15dd0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
15de0 69 6e 74 20 62 53 68 6f 77 41 6c 6c 20 3d 20 70  int bShowAll = p
15df0 2d 3e 70 4c 69 6d 69 74 3d 3d 30 3b 0a 20 20 61  ->pLimit==0;.  a
15e00 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61  ssert( p->selFla
15e10 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c  gs & SF_MultiVal
15e20 75 65 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  ue );.  do{.    
15e30 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
15e40 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20  ags & SF_Values 
15e50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15e60 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
15e70 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  (p->op==TK_SELEC
15e80 54 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  T && p->pPrior==
15e90 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
15ea0 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c  ( p->pNext==0 ||
15eb0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
15ec0 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c  r==p->pNext->pEL
15ed0 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
15ee0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d    if( p->pPrior=
15ef0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
15f00 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f  assert( p->pPrio
15f10 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20  r->pNext==p );. 
15f20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72     p = p->pPrior
15f30 3b 0a 20 20 20 20 6e 52 6f 77 20 2b 3d 20 62 53  ;.    nRow += bS
15f40 68 6f 77 41 6c 6c 3b 0a 20 20 7d 77 68 69 6c 65  howAll;.  }while
15f50 28 31 29 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75  (1);.  ExplainQu
15f60 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
15f70 20 30 2c 20 22 53 43 41 4e 20 25 64 20 43 4f 4e   0, "SCAN %d CON
15f80 53 54 41 4e 54 20 52 4f 57 25 73 22 2c 20 6e 52  STANT ROW%s", nR
15f90 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
15fa0 20 20 20 20 20 20 20 20 6e 52 6f 77 3d 3d 31 20          nRow==1 
15fb0 3f 20 22 22 20 3a 20 22 53 22 29 29 3b 0a 20 20  ? "" : "S"));.  
15fc0 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
15fd0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
15fe0 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30  pParse, p, -1, 0
15ff0 2c 20 30 2c 20 70 44 65 73 74 2c 20 31 2c 20 31  , 0, pDest, 1, 1
16000 29 3b 0a 20 20 20 20 69 66 28 20 21 62 53 68 6f  );.    if( !bSho
16010 77 41 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20  wAll ) break;.  
16020 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
16030 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20  = nRow;.    p = 
16040 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
16050 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16060 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16070 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
16080 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ocess a compound
16090 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d   query form from
160a0 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  .** two or more 
160b0 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73  separate queries
160c0 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e   using UNION, UN
160d0 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c  ION ALL, EXCEPT,
160e0 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54   or.** INTERSECT
160f0 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
16100 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
16110 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
16120 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65  ueries.  the que
16130 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66  ry on the.** lef
16140 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20  t is p->pPrior. 
16150 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20   The left query 
16160 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20  could also be a 
16170 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a  compound query.*
16180 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  * in which case 
16190 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
161a0 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75  l be called recu
161b0 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20  rsively. .**.** 
161c0 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  The results of t
161d0 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61  he total query a
161e0 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  re to be written
161f0 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74   into a destinat
16200 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65  ion.** of type e
16210 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
16220 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ter iParm..**.**
16230 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e   Example 1:  Con
16240 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61  sider a three-wa
16250 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73  y compound SQL s
16260 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
16270 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
16280 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
16290 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
162a0 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20  N SELECT c FROM 
162b0 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74  t3.**.** This st
162c0 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
162d0 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d up as follows:
162e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
162f0 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20  T c FROM t3.**  
16300 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d      |.**      `-
16310 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20  ---->  SELECT b 
16320 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20  FROM t2.**      
16330 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d                `-
16350 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61  ----->  SELECT a
16360 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54   FROM t1.**.** T
16370 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65  he arrows in the
16380 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72   diagram above r
16390 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c  epresent the Sel
163a0 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74  ect.pPrior point
163b0 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69  er..** So if thi
163c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
163d0 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c  led with p equal
163e0 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79   to the t3 query
163f0 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72  , then.** pPrior
16400 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20   will be the t2 
16410 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69  query.  p->op wi
16420 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69  ll be TK_UNION i
16430 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
16440 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62  ** Notice that b
16450 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
16460 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  y SQLite parses 
16470 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
16480 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  , the.** individ
16490 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61  ual selects alwa
164a0 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65  ys group from le
164b0 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a  ft to right..*/.
164c0 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
164d0 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
164e0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
164f0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
16500 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
16510 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
16520 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
16530 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
16540 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
16550 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
16560 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
16570 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
16580 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ts */.){.  int r
16590 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
165a0 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
165b0 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
165c0 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
165d0 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
165e0 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
165f0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
16600 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
16610 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
16620 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
16630 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
16640 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
16650 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41   dest;      /* A
16660 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20  lternative data 
16670 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
16680 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65   Select *pDelete
16690 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20   = 0;  /* Chain 
166a0 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  of simple select
166b0 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
166c0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
166d0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
166e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
166f0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
16700 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
16710 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
16720 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
16730 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
16740 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
16750 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
16760 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
16770 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
16780 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
16790 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
167a0 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
167b0 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
167c0 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
167d0 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73  is much */.  ass
167e0 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
167f0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
16800 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  )==0 || p->op==T
16810 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  K_ALL || p->op==
16820 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62  TK_UNION );.  db
16830 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
16840 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
16850 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70  ior;.  dest = *p
16860 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69  Dest;.  if( pPri
16870 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20  or->pOrderBy || 
16880 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
16890 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
168a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73  orMsg(pParse,"%s
168b0 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
168c0 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
168d0 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
168e0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
168f0 21 3d 30 20 3f 20 22 4f 52 44 45 52 20 42 59 22  !=0 ? "ORDER BY"
16900 20 3a 20 22 4c 49 4d 49 54 22 2c 20 73 65 6c 65   : "LIMIT", sele
16910 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
16920 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
16930 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
16940 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
16950 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
16960 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
16970 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f  sert( v!=0 );  /
16980 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61  * The VDBE alrea
16990 64 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61  dy created by ca
169a0 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
169b0 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  /..  /* Create t
169c0 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
169d0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
169e0 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f  f necessary.  */
169f0 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73  .  if( dest.eDes
16a00 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
16a10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16a20 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
16a30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16a40 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
16a50 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50  meral, dest.iSDP
16a60 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  arm, p->pEList->
16a70 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74  nExpr);.    dest
16a80 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62  .eDest = SRT_Tab
16a90 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  le;.  }..  /* Sp
16aa0 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66  ecial handling f
16ab0 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  or a compound-se
16ac0 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e  lect that origin
16ad0 61 74 65 73 20 61 73 20 61 20 56 41 4c 55 45 53  ates as a VALUES
16ae0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
16af0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
16b00 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
16b10 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  ){.    rc = mult
16b20 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70 50  iSelectValues(pP
16b30 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
16b40 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
16b50 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
16b60 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
16b70 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74  all SELECTs in t
16b80 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76  he statement hav
16b90 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
16ba0 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20  r of elements.  
16bb0 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75  ** in their resu
16bc0 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20  lt sets..  */.  
16bd0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
16be0 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c  t && pPrior->pEL
16bf0 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ist );.  assert(
16c00 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
16c10 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r==pPrior->pELis
16c20 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66  t->nExpr );..#if
16c30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16c40 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65  _CTE.  if( p->se
16c50 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
16c60 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e  rsive ){.    gen
16c70 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
16c80 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c 20  veQuery(pParse, 
16c90 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c  p, &dest);.  }el
16ca0 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  se.#endif..  /* 
16cb0 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  Compound SELECTs
16cc0 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52   that have an OR
16cd0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
16ce0 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61  e handled separa
16cf0 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
16d00 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
16d10 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
16d20 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50  SelectOrderBy(pP
16d30 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
16d40 0a 20 20 7d 65 6c 73 65 7b 0a 0a 23 69 66 6e 64  .  }else{..#ifnd
16d50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
16d60 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70  XPLAIN.    if( p
16d70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30  Prior->pPrior==0
16d80 20 29 7b 0a 20 20 20 20 20 20 45 78 70 6c 61 69   ){.      Explai
16d90 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
16da0 73 65 2c 20 31 2c 20 22 43 4f 4d 50 4f 55 4e 44  se, 1, "COMPOUND
16db0 20 51 55 45 52 59 22 29 29 3b 0a 20 20 20 20 20   QUERY"));.     
16dc0 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
16dd0 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4c  n((pParse, 1, "L
16de0 45 46 54 2d 4d 4f 53 54 20 53 55 42 51 55 45 52  EFT-MOST SUBQUER
16df0 59 22 29 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Y"));.    }.#end
16e00 69 66 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  if..    /* Gener
16e10 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
16e20 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
16e30 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
16e40 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 77  s..    */.    sw
16e50 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
16e60 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c       case TK_ALL
16e70 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  : {.        int 
16e80 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
16e90 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20    int nLimit;.  
16ea0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
16eb0 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b  Prior->pLimit );
16ec0 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d  .        pPrior-
16ed0 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  >iLimit = p->iLi
16ee0 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72  mit;.        pPr
16ef0 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70  ior->iOffset = p
16f00 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
16f10 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69     pPrior->pLimi
16f20 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
16f30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16f40 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
16f50 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29  , pPrior, &dest)
16f60 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69  ;.        p->pLi
16f70 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
16f80 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
16f90 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
16fa0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
16fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
16fc0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
16fd0 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
16fe0 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b   pPrior->iLimit;
16ff0 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  .        p->iOff
17000 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f  set = pPrior->iO
17010 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69  ffset;.        i
17020 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
17030 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d            addr =
17040 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17050 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
17060 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  p->iLimit); Vdbe
17070 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
17080 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
17090 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65  nt((v, "Jump ahe
170a0 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63  ad if LIMIT reac
170b0 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20  hed"));.        
170c0 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74    if( p->iOffset
170d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
170e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
170f0 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69  3(v, OP_OffsetLi
17100 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mit,.           
17110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17120 20 20 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d     p->iLimit, p-
17130 3e 69 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69  >iOffset+1, p->i
17140 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
17150 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
17160 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75         ExplainQu
17170 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
17180 20 31 2c 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 29   1, "UNION ALL")
17190 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
171a0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
171b0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
171c0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
171d0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
171e0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c   );.        pDel
171f0 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
17200 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69  .        p->pPri
17210 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
17220 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
17230 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
17240 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74  stAdd(p->nSelect
17250 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65  Row, pPrior->nSe
17260 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  lectRow);.      
17270 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
17280 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20 26 26  imit.         &&
17290 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
172a0 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c  teger(pPrior->pL
172b0 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c  imit->pLeft, &nL
172c0 69 6d 69 74 29 0a 20 20 20 20 20 20 20 20 20 26  imit).         &
172d0 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d  & nLimit>0 && p-
172e0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 73 71  >nSelectRow > sq
172f0 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
17300 29 6e 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20  )nLimit) .      
17310 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
17320 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
17330 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
17340 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  4)nLimit);.     
17350 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
17360 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20   addr ){.       
17370 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
17380 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
17390 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
173a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
173b0 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  }.      case TK_
173c0 45 58 43 45 50 54 3a 0a 20 20 20 20 20 20 63 61  EXCEPT:.      ca
173d0 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
173e0 20 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e         int union
173f0 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f  Tab;    /* Curso
17400 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
17410 74 65 6d 70 20 74 61 62 6c 65 20 68 6f 6c 64 69  temp table holdi
17420 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
17430 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20       u8 op = 0; 
17440 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
17450 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
17460 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
17470 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 20 20  self */.        
17480 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20  int priorOp;    
17490 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65   /* The SRT_ ope
174a0 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20  ration to apply 
174b0 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73  to prior selects
174c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
174d0 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20   *pLimit;    /* 
174e0 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
174f0 70 2d 3e 6e 4c 69 6d 69 74 20 20 2a 2f 0a 20 20  p->nLimit  */.  
17500 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
17510 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65          SelectDe
17520 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 20 20  st uniondest;.  
17530 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
17540 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43  e( p->op==TK_EXC
17550 45 50 54 20 29 3b 0a 20 20 20 20 20 20 20 20 74  EPT );.        t
17560 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
17570 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
17580 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52      priorOp = SR
17590 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 20  T_Union;.       
175a0 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
175b0 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
175c0 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20        /* We can 
175d0 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72  reuse a temporar
175e0 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  y table generate
175f0 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f  d by a SELECT to
17600 20 6f 75 72 0a 20 20 20 20 20 20 20 20 20 20 2a   our.          *
17610 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
17620 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
17630 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69  assert( p->pLimi
17640 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  t==0 );      /* 
17650 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
17660 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
17670 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e   */.          un
17680 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53  ionTab = dest.iS
17690 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 7d  DParm;.        }
176a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
176b0 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20  /* We will need 
176c0 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77  to create our ow
176d0 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
176e0 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20  e to hold the.  
176f0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
17700 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
17710 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
17720 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
17730 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
17740 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  +;.          ass
17750 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
17760 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
17770 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
17780 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17790 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75  OpenEphemeral, u
177a0 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
177b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
177c0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
177d0 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
177e0 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
177f0 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
17800 20 20 20 20 20 20 20 20 20 20 66 69 6e 64 52 69            findRi
17810 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46  ghtmost(p)->selF
17820 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
17830 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
17840 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
17850 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20  EList );.       
17860 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a   }.  .        /*
17870 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
17880 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
17890 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20  ur left.        
178a0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
178b0 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64  t( !pPrior->pOrd
178c0 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 20 20  erBy );.        
178d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
178e0 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74  tInit(&uniondest
178f0 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e  , priorOp, union
17900 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 72 63  Tab);.        rc
17910 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
17920 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
17930 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
17940 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
17950 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
17960 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
17970 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
17980 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
17990 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
179a0 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
179b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
179c0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45  ( p->op==TK_EXCE
179d0 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  PT ){.          
179e0 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
179f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
17a00 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17a10 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
17a20 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  N );.          o
17a30 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
17a40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17a50 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
17a60 20 20 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d          pLimit =
17a70 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
17a80 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
17a90 30 3b 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  0;.        union
17aa0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b  dest.eDest = op;
17ab0 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e  .        Explain
17ac0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
17ad0 65 2c 20 31 2c 20 22 25 73 20 55 53 49 4e 47 20  e, 1, "%s USING 
17ae0 54 45 4d 50 20 42 2d 54 52 45 45 22 2c 0a 20 20  TEMP B-TREE",.  
17af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b00 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70          selectOp
17b10 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20  Name(p->op)));. 
17b20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17b30 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
17b40 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  , p, &uniondest)
17b50 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
17b60 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
17b70 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K );.        /* 
17b80 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  Query flattening
17b90 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
17ba0 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c  t() might refill
17bb0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20   p->pOrderBy..  
17bc0 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
17bd0 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
17be0 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
17bf0 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
17c00 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
17c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17c20 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
17c30 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
17c40 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
17c50 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
17c60 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
17c70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70  Prior;.        p
17c80 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
17c90 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f          if( p->o
17ca0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
17cb0 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c           p->nSel
17cc0 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
17cd0 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
17ce0 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
17cf0 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
17d00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17d10 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
17d20 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
17d30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69  ;.        p->pLi
17d40 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
17d50 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
17d60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
17d70 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 0a  iOffset = 0;.  .
17d80 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65          /* Conve
17d90 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
17da0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
17db0 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
17dc0 20 66 6f 72 6d 0a 20 20 20 20 20 20 20 20 2a 2a   form.        **
17dd0 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63   it is that we c
17de0 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20  urrently need.. 
17df0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17e00 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54    assert( unionT
17e10 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d  ab==dest.iSDParm
17e20 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d   || dest.eDest!=
17e30 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20  priorOp );.     
17e40 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
17e50 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20  t!=priorOp ){.  
17e60 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
17e70 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
17e80 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  t;.          ass
17e90 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
17ea0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 42 72 65  ;.          iBre
17eb0 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
17ec0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
17ed0 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20          iCont = 
17ee0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
17ef0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
17f00 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
17f10 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
17f20 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
17f30 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17f40 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
17f50 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
17f60 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
17f70 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
17f80 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
17f90 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
17fa0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
17fb0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
17fc0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 75 6e  op(pParse, p, un
17fd0 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ionTab,.        
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ff0 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69    0, 0, &dest, i
18000 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
18010 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
18020 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
18030 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
18040 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
18050 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
18060 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
18070 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72  tart); VdbeCover
18080 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
18090 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
180a0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
180b0 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eak);.          
180c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
180d0 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  2(v, OP_Close, u
180e0 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
180f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
18100 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
18110 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
18120 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ert( p->op==TK_I
18130 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20  NTERSECT ); {.  
18140 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20        int tab1, 
18150 74 61 62 32 3b 0a 20 20 20 20 20 20 20 20 69 6e  tab2;.        in
18160 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
18170 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   iStart;.       
18180 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 0a 20   Expr *pLimit;. 
18190 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b         int addr;
181a0 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44  .        SelectD
181b0 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
181c0 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  t;.        int r
181d0 31 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a  1;.  .        /*
181e0 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
181f0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
18200 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
18210 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
18220 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
18230 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
18240 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
18250 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
18260 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f        ** by allo
18270 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65  cating the table
18280 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a  s we will need..
18290 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
182a0 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65     tab1 = pParse
182b0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
182c0 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
182d0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
182e0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
182f0 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  erBy==0 );.  .  
18300 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
18310 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18320 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
18330 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
18340 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
18350 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
18360 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
18370 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
18380 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
18390 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f       findRightmo
183a0 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20  st(p)->selFlags 
183b0 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
183c0 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ral;.        ass
183d0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
183e0 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  ;.  .        /* 
183f0 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73  Code the SELECTs
18400 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74   to our left int
18410 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
18420 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20  e "tab1"..      
18430 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
18440 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
18450 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73  it(&intersectdes
18460 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  t, SRT_Union, ta
18470 62 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  b1);.        rc 
18480 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
18490 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
184a0 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
184b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
184c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
184d0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
184e0 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
184f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  .        /* Code
18500 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
18510 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  ECT into tempora
18520 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a  ry table "tab2".
18530 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
18540 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
18550 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18560 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
18570 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
18580 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
18590 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
185a0 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70   -1 );.        p
185b0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
185c0 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
185d0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
185e0 0a 20 20 20 20 20 20 20 20 70 4c 69 6d 69 74 20  .        pLimit 
185f0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
18600 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
18610 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 65   0;.        inte
18620 72 73 65 63 74 64 65 73 74 2e 69 53 44 50 61 72  rsectdest.iSDPar
18630 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20  m = tab2;.      
18640 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
18650 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
18660 25 73 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  %s USING TEMP B-
18670 54 52 45 45 22 2c 0a 20 20 20 20 20 20 20 20 20  TREE",.         
18680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18690 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
186a0 3e 6f 70 29 29 29 3b 0a 20 20 20 20 20 20 20 20  >op)));.        
186b0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
186c0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69  ct(pParse, p, &i
186d0 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20  ntersectdest);. 
186e0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
186f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18700 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c 65 74  ;.        pDelet
18710 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
18720 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
18730 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
18740 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
18750 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65  tRow>pPrior->nSe
18760 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20  lectRow ){.     
18770 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
18780 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
18790 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 20  lectRow;.       
187a0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
187b0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
187c0 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
187d0 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
187e0 20 70 4c 69 6d 69 74 3b 0a 20 20 0a 20 20 20 20   pLimit;.  .    
187f0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
18800 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65  code to take the
18810 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
18820 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61   the two tempora
18830 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  ry.        ** ta
18840 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bles..        */
18850 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18860 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
18870 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
18880 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
18890 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
188a0 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
188b0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
188c0 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65  .        compute
188d0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
188e0 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b  Parse, p, iBreak
188f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18900 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18910 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
18920 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
18930 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
18940 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
18950 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
18960 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
18970 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
18980 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44  ddOp2(v, OP_RowD
18990 61 74 61 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a  ata, tab1, r1);.
189a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
189b0 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
189c0 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62  OP_NotFound, tab
189d0 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29  2, iCont, r1, 0)
189e0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
189f0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
18a00 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
18a10 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
18a20 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 65   r1);.        se
18a30 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
18a40 61 72 73 65 2c 20 70 2c 20 74 61 62 31 2c 0a 20  arse, p, tab1,. 
18a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a60 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
18a70 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
18a80 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
18a90 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
18aa0 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
18ab0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18ac0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
18ad0 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72  ext, tab1, iStar
18ae0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
18af0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
18b00 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
18b10 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
18b20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18b30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18b40 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29  _Close, tab2, 0)
18b50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18b60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18b70 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30  P_Close, tab1, 0
18b80 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
18b90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18ba0 20 20 0a 20 20 23 69 66 6e 64 65 66 20 53 51 4c    .  #ifndef SQL
18bb0 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
18bc0 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  .    if( p->pNex
18bd0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  t==0 ){.      Ex
18be0 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f  plainQueryPlanPo
18bf0 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  p(pParse);.    }
18c00 0a 20 20 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  .  #endif.  }.  
18c10 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f  .  /* Compute co
18c20 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
18c30 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  s used by .  ** 
18c40 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
18c50 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65   needed to imple
18c60 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e  ment the compoun
18c70 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41  d select..  ** A
18c80 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66  ttach the KeyInf
18c90 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61  o structure to a
18ca0 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ll temporary tab
18cb0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
18cc0 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72  his section is r
18cd0 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d  un by the right-
18ce0 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
18cf0 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a  ement only..  **
18d00 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
18d10 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  ts to the left a
18d20 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20  lways skip this 
18d30 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74  part.  The right
18d40 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43  -most.  ** SELEC
18d50 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69  T might also ski
18d60 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69  p this part if i
18d70 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42  t has no ORDER B
18d80 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a  Y clause and.  *
18d90 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73  * no temp tables
18da0 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20   are required.. 
18db0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
18dc0 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45  Flags & SF_UsesE
18dd0 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20  phemeral ){.    
18de0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
18df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18e00 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
18e10 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
18e20 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyInfo;         
18e30 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
18e40 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
18e50 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
18e60 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
18e70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18e80 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
18e90 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73  through SELECT s
18ea0 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  tatements */.   
18eb0 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c   CollSeq **apCol
18ec0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
18ed0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
18ee0 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e  rough pKeyInfo->
18ef0 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69  aColl[] */.    i
18f00 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
18f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18f20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
18f30 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20  s in result set 
18f40 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
18f50 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20  p->pNext==0 );. 
18f60 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c     nCol = p->pEL
18f70 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
18f80 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
18f90 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
18fa0 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20  b, nCol, 1);.   
18fb0 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29   if( !pKeyInfo )
18fc0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
18fd0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
18fe0 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
18ff0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
19000 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20   }.    for(i=0, 
19010 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d  apColl=pKeyInfo-
19020 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  >aColl; i<nCol; 
19030 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a  i++, apColl++){.
19040 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
19050 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
19060 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
19070 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a  ;.      if( 0==*
19080 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  apColl ){.      
19090 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e    *apColl = db->
190a0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
190b0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
190c0 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
190d0 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
190e0 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f  Prior){.      fo
190f0 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
19100 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
19110 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  dr = pLoop->addr
19120 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20  OpenEphm[i];.   
19130 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20       if( addr<0 
19140 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
19150 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  If [0] is unused
19160 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73   then [1] is als
19170 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65  o unused.  So we
19180 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a   can.          *
19190 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20  * always safely 
191a0 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73  abort as soon as
191b0 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65   the first unuse
191c0 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20  d slot is found 
191d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
191e0 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  ert( pLoop->addr
191f0 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b  OpenEphm[1]<0 );
19200 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
19210 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19220 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
19230 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
19240 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
19250 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
19260 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP4(v, addr, (ch
19270 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
19280 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
19290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
192a0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
192b0 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
192c0 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65    pLoop->addrOpe
192d0 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20  nEphm[i] = -1;. 
192e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
192f0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
19300 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  nref(pKeyInfo);.
19310 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63    }..multi_selec
19320 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e  t_end:.  pDest->
19330 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64  iSdst = dest.iSd
19340 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64  st;.  pDest->nSd
19350 73 74 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b  st = dest.nSdst;
19360 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
19370 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65  Delete(db, pDele
19380 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  te);.  return rc
19390 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
193a0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
193b0 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
193c0 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67  .** Error messag
193d0 65 20 66 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f  e for when two o
193e0 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20  r more terms of 
193f0 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
19400 74 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74  t have different
19410 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c 74 20  .** size result 
19420 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  sets..*/.void sq
19430 6c 69 74 65 33 53 65 6c 65 63 74 57 72 6f 6e 67  lite3SelectWrong
19440 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 50 61  NumTermsError(Pa
19450 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
19460 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ect *p){.  if( p
19470 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
19480 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 73 71  Values ){.    sq
19490 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
194a0 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45  arse, "all VALUE
194b0 53 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20  S must have the 
194c0 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  same number of t
194d0 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  erms");.  }else{
194e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
194f0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
19500 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
19510 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
19520 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  s".      " do no
19530 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
19540 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
19550 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
19560 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
19570 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
19580 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62  de an output sub
19590 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f  routine for a co
195a0 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
195b0 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53  tation of a.** S
195c0 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a  ELECT statment..
195d0 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74  **.** The data t
195e0 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20 63  o be output is c
195f0 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d  ontained in pIn-
19600 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65 20 61  >iSdst.  There a
19610 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74  re.** pIn->nSdst
19620 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f   columns to be o
19630 75 74 70 75 74 2e 20 20 70 44 65 73 74 20 69 73  utput.  pDest is
19640 20 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 75   where the outpu
19650 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
19660 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65  ent..**.** regRe
19670 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  turn is the numb
19680 65 72 20 6f 66 20 74 68 65 20 72 65 67 69 73 74  er of the regist
19690 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  er holding the s
196a0 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  ubroutine.** ret
196b0 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a  urn address..**.
196c0 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  ** If regPrev>0 
196d0 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 66  then it is the f
196e0 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
196f0 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a   a vector that.*
19700 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72  * records the pr
19710 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20  evious output.  
19720 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20  mem[regPrev] is 
19730 61 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66  a flag that is f
19740 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65  alse.** if there
19750 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65   has been no pre
19760 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49  vious output.  I
19770 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
19780 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65   code is.** gene
19790 72 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73  rated to suppres
197a0 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70  s duplicates.  p
197b0 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20  KeyInfo is used 
197c0 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a  for comparing.**
197d0 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   keys..**.** If 
197e0 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20  the LIMIT found 
197f0 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20  in p->iLimit is 
19800 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d  reached, jump im
19810 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20  mediately to.** 
19820 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69  iBreak..*/.stati
19830 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75  c int generateOu
19840 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a  tputSubroutine(.
19850 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
19860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
19870 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
19880 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
19890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
198a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
198b0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  t */.  SelectDes
198c0 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f  t *pIn,        /
198d0 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70  * Coroutine supp
198e0 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  lying data */.  
198f0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
19900 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  t,      /* Where
19910 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74   to send the dat
19920 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  a */.  int regRe
19930 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  turn,          /
19940 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64  * The return add
19950 72 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f  ress register */
19960 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20  .  int regPrev, 
19970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
19980 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65  evious result re
19990 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71  gister.  No uniq
199a0 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20  ueness if 0 */. 
199b0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
199c0 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  fo,      /* For 
199d0 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70  comparing with p
199e0 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f  revious entry */
199f0 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
19a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
19a10 6d 70 20 68 65 72 65 20 69 66 20 77 65 20 68 69  mp here if we hi
19a20 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29  t the LIMIT */.)
19a30 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
19a40 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
19a50 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  nt iContinue;.  
19a60 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64  int addr;..  add
19a70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
19a80 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
19a90 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
19aa0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
19ab0 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  l(v);..  /* Supp
19ac0 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 20  ress duplicates 
19ad0 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  for UNION, EXCEP
19ae0 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
19af0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67   .  */.  if( reg
19b00 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20  Prev ){.    int 
19b10 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20  addr1, addr2;.  
19b20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
19b30 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
19b40 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76  P_IfNot, regPrev
19b50 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
19b60 76 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  v);.    addr2 = 
19b70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19b80 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
19b90 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
19ba0 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
19bb0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
19bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bd0 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
19be0 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
19bf0 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
19c00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19c10 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
19c20 75 6d 70 2c 20 61 64 64 72 32 2b 32 2c 20 69 43  ump, addr2+2, iC
19c30 6f 6e 74 69 6e 75 65 2c 20 61 64 64 72 32 2b 32  ontinue, addr2+2
19c40 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
19c50 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
19c60 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
19c70 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddr1);.    sqlit
19c80 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
19c90 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53  OP_Copy, pIn->iS
19ca0 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  dst, regPrev+1, 
19cb0 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20  pIn->nSdst-1);. 
19cc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
19cd0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
19ce0 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b  er, 1, regPrev);
19cf0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
19d00 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
19d10 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
19d20 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74  .  /* Suppress t
19d30 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20  he first OFFSET 
19d40 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72 65  entries if there
19d50 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c   is an OFFSET cl
19d60 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65  ause.  */.  code
19d70 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
19d80 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
19d90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 65  ;..  assert( pDe
19da0 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 45  st->eDest!=SRT_E
19db0 78 69 73 74 73 20 29 3b 0a 20 20 61 73 73 65 72  xists );.  asser
19dc0 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  t( pDest->eDest!
19dd0 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
19de0 73 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65  switch( pDest->e
19df0 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53  Dest ){.    /* S
19e00 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
19e10 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
19e20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
19e30 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
19e40 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
19e50 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
19e60 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
19e70 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  rse);.      int 
19e80 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
19e90 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
19ea0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19eb0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
19ec0 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69  keRecord, pIn->i
19ed0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
19ee0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
19ef0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19f00 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70  , OP_NewRowid, p
19f10 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
19f20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
19f30 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19f40 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  P_Insert, pDest-
19f50 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72 32  >iSDParm, r1, r2
19f60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19f70 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
19f80 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
19f90 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
19fa0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
19fb0 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  se, r2);.      s
19fc0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
19fd0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
19fe0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
19ff0 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
1a000 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
1a010 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
1a020 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
1a030 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
1a040 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
1a050 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1a060 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
1a070 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
1a080 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e   testcase( pIn->
1a090 6e 53 64 73 74 3e 31 20 29 3b 0a 20 20 20 20 20  nSdst>1 );.     
1a0a0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
1a0b0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1a0c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a0d0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
1a0e0 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
1a0f0 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
1a100 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 72 31  t, .          r1
1a110 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  , pDest->zAffSds
1a120 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
1a130 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1a140 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
1a150 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
1a160 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
1a170 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
1a180 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
1a190 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
1a1a0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
1a1b0 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , r1,.          
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1d0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
1a1e0 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
1a1f0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1a200 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
1a210 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a220 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1a230 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
1a240 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
1a250 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
1a260 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
1a270 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
1a280 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
1a290 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
1a2a0 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
1a2b0 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
1a2c0 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
1a2d0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
1a2e0 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
1a2f0 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d  ert( pIn->nSdst=
1a300 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =1 || pParse->nE
1a310 72 72 3e 30 20 29 3b 20 20 74 65 73 74 63 61 73  rr>0 );  testcas
1a320 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 21 3d 31  e( pIn->nSdst!=1
1a330 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1a340 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
1a350 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
1a360 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
1a370 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
1a380 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
1a390 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
1a3a0 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
1a3b0 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
1a3c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1a3d0 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
1a3e0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
1a3f0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ..    /* The res
1a400 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
1a410 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
1a420 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
1a430 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44  * starting at pD
1a440 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  est->iSdst.  The
1a450 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
1a460 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a   yields..    */.
1a470 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
1a480 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  outine: {.      
1a490 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74  if( pDest->iSdst
1a4a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
1a4b0 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71  Dest->iSdst = sq
1a4c0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
1a4d0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e  e(pParse, pIn->n
1a4e0 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Sdst);.        p
1a4f0 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49  Dest->nSdst = pI
1a500 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20  n->nSdst;.      
1a510 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
1a520 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
1a530 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
1a540 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 49  pDest->iSdst, pI
1a550 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
1a560 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a570 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
1a580 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
1a590 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a5a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1a5b0 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65  one of the above
1a5c0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
1a5d0 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75  t destination mu
1a5e0 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54  st be.    ** SRT
1a5f0 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72  _Output.  This r
1a600 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
1a610 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20  called with any 
1a620 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73  other.    ** des
1a630 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74  tination other t
1a640 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e  han the ones han
1a650 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52  dled above or SR
1a660 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a  T_Output..    **
1a670 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f  .    ** For SRT_
1a680 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20  Output, results 
1a690 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
1a6a0 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
1a6b0 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20  sters.  .    ** 
1a6c0 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75  Then the OP_Resu
1a6d0 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20  ltRow opcode is 
1a6e0 75 73 65 64 20 74 6f 20 63 61 75 73 65 20 73 71  used to cause sq
1a6f0 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a  lite3_step() to.
1a700 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68      ** return th
1a710 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65  e next row of re
1a720 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sult..    */.   
1a730 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
1a740 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
1a750 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
1a760 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ut );.      sqli
1a770 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a780 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
1a790 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
1a7a0 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
1a7b0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
1a7c0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
1a7d0 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
1a7e0 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
1a7f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a800 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
1a810 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1a820 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
1a830 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a  MIT is reached..
1a840 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
1a850 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
1a860 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a870 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
1a880 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
1a890 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
1a8a0 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
1a8b0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75   Generate the su
1a8c0 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a  broutine return.
1a8d0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
1a8e0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
1a8f0 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
1a900 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a910 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
1a920 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72  regReturn);..  r
1a930 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
1a940 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65  *.** Alternative
1a950 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1a960 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
1a970 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74  for cases when t
1a980 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52  here.** is an OR
1a990 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
1a9a0 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61  *.** We assume a
1a9b0 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
1a9c0 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
1a9d0 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74  .**      <select
1a9e0 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20  A>  <operator>  
1a9f0 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52  <selectB>  ORDER
1aa00 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74   BY <orderbylist
1aa10 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  >.**.** <operato
1aa20 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49  r> is one of UNI
1aa30 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45  ON ALL, UNION, E
1aa40 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
1aa50 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a  ECT.  The idea.*
1aa60 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74  * is to code bot
1aa70 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20  h <selectA> and 
1aa80 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74  <selectB> with t
1aa90 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1aaa0 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74  se as.** co-rout
1aab0 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20  ines.  Then run 
1aac0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20  the co-routines 
1aad0 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20  in parallel and 
1aae0 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74  merge the result
1aaf0 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75  s.** into the ou
1ab00 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69  tput.  In additi
1ab10 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f  on to the two co
1ab20 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64  routines (called
1ab30 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20   selectA and.** 
1ab40 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61  selectB) there a
1ab50 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73  re 7 subroutines
1ab60 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a  :.**.**    outA:
1ab70 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
1ab80 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
1ab90 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tA coroutine int
1aba0 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
1abb0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
1abc0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
1abd0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42  y..**.**    outB
1abe0 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
1abf0 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
1ac00 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctB coroutine in
1ac10 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
1ac20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
1ac30 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
1ac40 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72  ry.  (Only gener
1ac50 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61  ated for UNION a
1ac60 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
1ac70 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58    UNION ALL.  EX
1ac80 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53  CEPT and INSERTS
1ac90 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74  ECT never output
1aca0 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20   a row that.**  
1acb0 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61             appea
1acc0 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a  rs only in B.).*
1acd0 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20  *.**    AltB:   
1ace0 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
1acf0 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
1ad00 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
1ad10 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A<B..**.**  
1ad20 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65    AeqB:    Calle
1ad30 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
1ad40 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
1ad50 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d  oroutines and A=
1ad60 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74  =B..**.**    Agt
1ad70 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
1ad80 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
1ad90 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
1ada0 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a  ines and A>B..**
1adb0 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20  .**    EofA:    
1adc0 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
1add0 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
1ade0 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a  om selectA..**.*
1adf0 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61  *    EofB:    Ca
1ae00 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
1ae10 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
1ae20 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20   selectB..**.** 
1ae30 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
1ae40 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72  on of the latter
1ae50 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65   five subroutine
1ae60 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63  s depend on whic
1ae70 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  h .** <operator>
1ae80 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a   is used:.**.**.
1ae90 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
1aea0 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20  NION ALL        
1aeb0 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20   UNION          
1aec0 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20    EXCEPT        
1aed0 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20    INTERSECT.**  
1aee0 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
1aef0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
1af00 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
1af10 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
1af20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
1af30 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AltB:   outA, n
1af40 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
1af50 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
1af60 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
1af70 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65  nextA.**.**   Ae
1af80 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  qB:   outA, next
1af90 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20  A         nextA 
1afa0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
1afb0 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20  A         outA, 
1afc0 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67  nextA.**.**   Ag
1afd0 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  tB:   outB, next
1afe0 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
1aff0 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  tB          next
1b000 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  B            nex
1b010 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a  tB.**.**   EofA:
1b020 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
1b030 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
1b040 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20           halt   
1b050 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a            halt.*
1b060 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f  *.**   EofB:   o
1b070 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
1b080 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
1b090 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1b0a0 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
1b0b0 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65   In the AltB, Ae
1b0c0 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62  qB, and AgtB sub
1b0d0 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46  routines, an EOF
1b0e0 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20   on A following 
1b0f0 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20  nextA.** causes 
1b100 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
1b110 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e  p to EofA and an
1b120 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77   EOF on B follow
1b130 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73  ing nextB causes
1b140 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  .** an immediate
1b150 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20   jump to EofB.  
1b160 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20  Within EofA and 
1b170 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e  EofB, and EOF on
1b180 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c   entry or.** fol
1b190 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75  lowing nextX cau
1b1a0 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68  ses a jump to th
1b1b0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c  e end of the sel
1b1c0 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  ect processing..
1b1d0 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20  **.** Duplicate 
1b1e0 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55  removal in the U
1b1f0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
1b200 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65  d INTERSECT case
1b210 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20  s is handled.** 
1b220 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75  within the outpu
1b230 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
1b240 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73  he regPrev regis
1b250 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68  ter set holds th
1b260 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  e previously.** 
1b270 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41  output value.  A
1b280 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   comparison is m
1b290 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73  ade against this
1b2a0 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f   value and the o
1b2b0 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70  utput.** is skip
1b2c0 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20  ped if the next 
1b2d0 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65  results would be
1b2e0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1b2f0 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a   previous..**.**
1b300 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
1b310 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69  ion plan is to i
1b320 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f  mplement the two
1b330 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
1b340 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74  seven.** subrout
1b350 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e  ines first, then
1b360 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c   put the control
1b370 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f   logic at the bo
1b380 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73  ttom.  Like this
1b390 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1b3a0 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20   goto Init.**   
1b3b0 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65    coA: coroutine
1b3c0 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20   for left query 
1b3d0 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20  (A).**     coB: 
1b3e0 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
1b3f0 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a  ght query (B).**
1b400 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74      outA: output
1b410 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a   one row of A.**
1b420 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74      outB: output
1b430 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55   one row of B (U
1b440 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41  NION and UNION A
1b450 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45  LL only).**    E
1b460 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45  ofA: ....**    E
1b470 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ofB: ....**    A
1b480 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ltB: ....**    A
1b490 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  eqB: ....**    A
1b4a0 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49  gtB: ....**    I
1b4b0 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20  nit: initialize 
1b4c0 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  coroutine regist
1b4d0 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ers.**          
1b4e0 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20  yield coA.**    
1b4f0 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20        if eof(A) 
1b500 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20  goto EofA.**    
1b510 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a        yield coB.
1b520 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
1b530 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a  of(B) goto EofB.
1b540 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70  **    Cmpr: Comp
1b550 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20  are A, B.**     
1b560 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20       Jump AltB, 
1b570 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20  AeqB, AgtB.**   
1b580 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a    End: ....**.**
1b590 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41   We call AltB, A
1b5a0 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c  eqB, AgtB, EofA,
1b5b0 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f   and EofB "subro
1b5c0 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79  utines" but they
1b5d0 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75   are not.** actu
1b5e0 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e  ally called usin
1b5f0 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79  g Gosub and they
1b600 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20   do not Return. 
1b610 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c   EofA and EofB l
1b620 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c  oop.** until all
1b630 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
1b640 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ed then jump to 
1b650 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20  the "end" labe. 
1b660 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20   AltB, AeqB,.** 
1b670 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f  and AgtB jump to
1b680 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f   either L2 or to
1b690 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20   one of EofA or 
1b6a0 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  EofB..*/.#ifndef
1b6b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
1b6c0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61  POUND_SELECT.sta
1b6d0 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
1b6e0 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
1b6f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1b700 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1b710 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
1b720 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1b730 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
1b740 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
1b750 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
1b760 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
1b770 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
1b780 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
1b790 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
1b7a0 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
1b7b0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1b7c0 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63  nters */.  Selec
1b7d0 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
1b7e0 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
1b7f0 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
1b800 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
1b810 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
1b820 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
1b830 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
1b840 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
1b850 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f  est destA;     /
1b860 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
1b870 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f  r coroutine A */
1b880 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
1b890 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stB;     /* Dest
1b8a0 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
1b8b0 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74  utine B */.  int
1b8c0 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20   regAddrA;      
1b8d0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
1b8e0 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
1b8f0 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
1b900 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b  .  int regAddrB;
1b910 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1b920 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
1b930 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
1b940 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1b950 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f  rSelectA;      /
1b960 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1b970 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
1b980 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1b990 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f  rSelectB;      /
1b9a0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1b9b0 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
1b9c0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
1b9d0 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f  OutA;          /
1b9e0 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
1b9f0 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
1ba00 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
1ba10 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b  /.  int regOutB;
1ba20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1ba30 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
1ba40 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  r the output-B s
1ba50 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1ba60 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20  nt addrOutA;    
1ba70 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1ba80 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  of the output-A 
1ba90 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1baa0 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30  int addrOutB = 0
1bab0 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
1bac0 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42   of the output-B
1bad0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1bae0 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20   int addrEofA;  
1baf0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1bb00 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
1bb10 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  A-exhausted subr
1bb20 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1bb30 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20  addrEofA_noB;   
1bb40 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20 61    /* Alternate a
1bb50 64 64 72 45 6f 66 41 20 69 66 20 42 20 69 73 20  ddrEofA if B is 
1bb60 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  uninitialized */
1bb70 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b  .  int addrEofB;
1bb80 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1bb90 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
1bba0 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-B-exhausted su
1bbb0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
1bbc0 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20  t addrAltB;     
1bbd0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1bbe0 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75  f the A<B subrou
1bbf0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1bc00 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20  drAeqB;         
1bc10 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1bc20 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e  e A==B subroutin
1bc30 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
1bc40 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  gtB;         /* 
1bc50 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
1bc60 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  >B subroutine */
1bc70 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41  .  int regLimitA
1bc80 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
1bc90 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
1bca0 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
1bcb0 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20   regLimitB;     
1bcc0 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
1bcd0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
1bce0 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  A */.  int regPr
1bcf0 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev;          /* 
1bd00 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  A range of regis
1bd10 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65  ters to hold pre
1bd20 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a  vious output */.
1bd30 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74    int savedLimit
1bd40 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
1bd50 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69   value of p->iLi
1bd60 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  mit */.  int sav
1bd70 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  edOffset;      /
1bd80 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
1bd90 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20   p->iOffset */. 
1bda0 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20   int labelCmpr; 
1bdb0 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
1bdc0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
1bdd0 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72   the merge algor
1bde0 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  ithm */.  int la
1bdf0 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20  belEnd;         
1be00 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
1be10 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   end of the over
1be20 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20  all SELECT stmt 
1be30 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20  */.  int addr1; 
1be40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
1be50 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
1be60 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65  that get retarge
1be70 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tted */.  int op
1be80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1be90 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c  /* One of TK_ALL
1bea0 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  , TK_UNION, TK_E
1beb0 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53  XCEPT, TK_INTERS
1bec0 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ECT */.  KeyInfo
1bed0 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f   *pKeyDup = 0; /
1bee0 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
1bef0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  ormation for dup
1bf00 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a  licate removal *
1bf10 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
1bf20 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d  yMerge;   /* Com
1bf30 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
1bf40 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20  ion for merging 
1bf50 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rows */.  sqlite
1bf60 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
1bf70 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
1bf80 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
1bf90 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
1bfa0 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
1bfb0 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
1bfc0 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
1bfd0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1bfe0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
1bff0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
1c000 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65  .  int *aPermute
1c010 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70  ;        /* Mapp
1c020 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42  ing from ORDER B
1c030 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c  Y terms to resul
1c040 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  t set columns */
1c050 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
1c060 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
1c070 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d  assert( pKeyDup=
1c080 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65  =0 ); /* "Manage
1c090 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68  d" code needs th
1c0a0 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38  is.  Ticket #338
1c0b0 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  2. */.  db = pPa
1c0c0 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70  rse->db;.  v = p
1c0d0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1c0e0 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
1c0f0 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79        /* Already
1c100 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f   thrown the erro
1c110 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20  r if VDBE alloc 
1c120 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65  failed */.  labe
1c130 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  lEnd = sqlite3Vd
1c140 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1c150 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71    labelCmpr = sq
1c160 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1c170 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61  el(v);...  /* Pa
1c180 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45 52  tch up the ORDER
1c190 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a   BY clause.  */.
1c1a0 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a    op = p->op;  .
1c1b0 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
1c1c0 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rior;.  assert( 
1c1d0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
1c1e0 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42  ==0 );.  pOrderB
1c1f0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
1c200 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
1c210 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42  rBy );.  nOrderB
1c220 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y = pOrderBy->nE
1c230 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f  xpr;..  /* For o
1c240 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74  perators other t
1c250 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65  han UNION ALL we
1c260 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75   have to make su
1c270 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  re that.  ** the
1c280 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c290 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74 65   covers every te
1c2a0 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rm of the result
1c2b0 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20   set.  Add.  ** 
1c2c0 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44  terms to the ORD
1c2d0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 20  ER BY clause as 
1c2e0 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
1c2f0 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c    if( op!=TK_ALL
1c300 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
1c310 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1c320 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45  d==0 && i<=p->pE
1c330 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1c340 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1c350 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1c360 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Item;.      for(
1c370 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  j=0, pItem=pOrde
1c380 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72  rBy->a; j<nOrder
1c390 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b  By; j++, pItem++
1c3a0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1c3b0 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
1c3c0 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20  rderByCol>0 );. 
1c3d0 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
1c3e0 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
1c3f0 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==i ) break;.  
1c400 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c410 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  j==nOrderBy ){. 
1c420 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65         Expr *pNe
1c430 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  w = sqlite3Expr(
1c440 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  db, TK_INTEGER, 
1c450 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
1c460 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
1c470 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1c480 50 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  PT;.        pNew
1c490 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e  ->flags |= EP_In
1c4a0 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20  tValue;.        
1c4b0 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d  pNew->u.iValue =
1c4c0 20 69 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   i;.        p->p
1c4d0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
1c4e0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
1c4f0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
1c500 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65  e, pOrderBy, pNe
1c510 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  w);.        if( 
1c520 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64 65  pOrderBy ) pOrde
1c530 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b  rBy->a[nOrderBy+
1c540 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  +].u.x.iOrderByC
1c550 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20  ol = (u16)i;.   
1c560 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1c570 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
1c580 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d   comparison perm
1c590 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69  utation and keyi
1c5a0 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65 64  nfo that is used
1c5b0 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70   with.  ** the p
1c5c0 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20  ermutation used 
1c5d0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
1c5e0 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f  the next.  ** ro
1c5f0 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d  w of results com
1c600 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20  es from selectA 
1c610 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73  or selectB.  Als
1c620 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20  o add explicit. 
1c630 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74   ** collations t
1c640 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
1c650 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74  lause terms so t
1c660 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75 62  hat when the sub
1c670 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20  queries.  ** to 
1c680 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74 68  the right and th
1c690 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75  e left are evalu
1c6a0 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20 74  ated, they use t
1c6b0 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20  he correct.  ** 
1c6c0 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  collation..  */.
1c6d0 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c    aPermute = sql
1c6e0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
1c6f0 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74  N(db, sizeof(int
1c700 29 2a 28 6e 4f 72 64 65 72 42 79 20 2b 20 31 29  )*(nOrderBy + 1)
1c710 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74  );.  if( aPermut
1c720 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  e ){.    struct 
1c730 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1c740 49 74 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75  Item;.    aPermu
1c750 74 65 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79  te[0] = nOrderBy
1c760 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70  ;.    for(i=1, p
1c770 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Item=pOrderBy->a
1c780 3b 20 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69  ; i<=nOrderBy; i
1c790 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1c7a0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1c7b0 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
1c7c0 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  ol>0 );.      as
1c7d0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78  sert( pItem->u.x
1c7e0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d  .iOrderByCol<=p-
1c7f0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
1c800 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65  ;.      aPermute
1c810 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78  [i] = pItem->u.x
1c820 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31  .iOrderByCol - 1
1c830 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79  ;.    }.    pKey
1c840 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c  Merge = multiSel
1c850 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
1c860 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b  o(pParse, p, 1);
1c870 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b  .  }else{.    pK
1c880 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d  eyMerge = 0;.  }
1c890 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20  ..  /* Reattach 
1c8a0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1c8b0 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79  use to the query
1c8c0 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ..  */.  p->pOrd
1c8d0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
1c8e0 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  .  pPrior->pOrde
1c8f0 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
1c900 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d  rListDup(pParse-
1c910 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30  >db, pOrderBy, 0
1c920 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
1c930 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d  e a range of tem
1c940 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
1c950 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f   and the KeyInfo
1c960 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72   needed.  ** for
1c970 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
1c980 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74  removes duplicat
1c990 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68  e result rows wh
1c9a0 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72  en the.  ** oper
1c9b0 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45  ator is UNION, E
1c9c0 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
1c9d0 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49  ECT (but not UNI
1c9e0 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20  ON ALL)..  */.  
1c9f0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
1ca00 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  {.    regPrev = 
1ca10 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1ca20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70  int nExpr = p->p
1ca30 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
1ca40 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72    assert( nOrder
1ca50 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d  By>=nExpr || db-
1ca60 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1ca70 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70  .    regPrev = p
1ca80 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
1ca90 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
1caa0 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20  += nExpr+1;.    
1cab0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cac0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1cad0 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   0, regPrev);.  
1cae0 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69    pKeyDup = sqli
1caf0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
1cb00 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20  db, nExpr, 1);. 
1cb10 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29     if( pKeyDup )
1cb20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1cb30 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
1cb40 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75  Writeable(pKeyDu
1cb50 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  p) );.      for(
1cb60 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  i=0; i<nExpr; i+
1cb70 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  +){.        pKey
1cb80 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Dup->aColl[i] = 
1cb90 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
1cba0 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
1cbb0 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75  ;.        pKeyDu
1cbc0 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  p->aSortOrder[i]
1cbd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1cbe0 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53    }.  }. .  /* S
1cbf0 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74  eparate the left
1cc00 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71   and the right q
1cc10 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e  uery from one an
1cc20 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e  other.  */.  p->
1cc30 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50  pPrior = 0;.  pP
1cc40 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  rior->pNext = 0;
1cc50 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
1cc60 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
1cc70 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  arse, p, p->pOrd
1cc80 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
1cc90 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50    if( pPrior->pP
1cca0 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rior==0 ){.    s
1ccb0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
1ccc0 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
1ccd0 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72  , pPrior, pPrior
1cce0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
1ccf0 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ER");.  }..  /* 
1cd00 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69  Compute the limi
1cd10 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  t registers */. 
1cd20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
1cd30 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
1cd40 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69  , labelEnd);.  i
1cd50 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20  f( p->iLimit && 
1cd60 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
1cd70 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b    regLimitA = ++
1cd80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1cd90 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b    regLimitB = ++
1cda0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1cdb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cdc0 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
1cdd0 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e  p->iOffset ? p->
1cde0 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69  iOffset+1 : p->i
1cdf0 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20  Limit,.         
1ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce10 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69           regLimi
1ce20 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
1ce30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1ce40 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41  _Copy, regLimitA
1ce50 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20  , regLimitB);.  
1ce60 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69  }else{.    regLi
1ce70 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42  mitA = regLimitB
1ce80 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
1ce90 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1cea0 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
1ceb0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a  p->pLimit = 0;..
1cec0 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70    regAddrA = ++p
1ced0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
1cee0 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72  egAddrB = ++pPar
1cef0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
1cf00 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utA = ++pParse->
1cf10 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20  nMem;.  regOutB 
1cf20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1cf30 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1cf40 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41  tDestInit(&destA
1cf50 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
1cf60 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
1cf70 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
1cf80 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f  nit(&destB, SRT_
1cf90 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
1cfa0 64 72 42 29 3b 0a 0a 20 20 45 78 70 6c 61 69 6e  drB);..  Explain
1cfb0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
1cfc0 65 2c 20 31 2c 20 22 4d 45 52 47 45 20 28 25 73  e, 1, "MERGE (%s
1cfd0 29 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  )", selectOpName
1cfe0 28 70 2d 3e 6f 70 29 29 29 3b 0a 0a 20 20 2f 2a  (p->op)));..  /*
1cff0 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f   Generate a coro
1d000 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74  utine to evaluat
1d010 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
1d020 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20  tement to the.  
1d030 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63  ** left of the c
1d040 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72  ompound operator
1d050 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63   - the "A" selec
1d060 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65  t..  */.  addrSe
1d070 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56  lectA = sqlite3V
1d080 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1d090 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d  ) + 1;.  addr1 =
1d0a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d0b0 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
1d0c0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
1d0d0 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41  , 0, addrSelectA
1d0e0 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
1d0f0 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43  ((v, "left SELEC
1d100 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  T"));.  pPrior->
1d110 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
1d120 74 41 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65  tA;.  ExplainQue
1d130 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
1d140 31 2c 20 22 4c 45 46 54 22 29 29 3b 0a 20 20 73  1, "LEFT"));.  s
1d150 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1d160 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
1d170 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  stA);.  sqlite3V
1d180 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
1d190 76 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  v, regAddrA);.  
1d1a0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1d1b0 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
1d1c0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1d1d0 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
1d1e0 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
1d1f0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20   statement on . 
1d200 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20   ** the right - 
1d210 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20  the "B" select. 
1d220 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
1d230 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
1d240 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
1d250 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  1;.  addr1 = sql
1d260 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1d270 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
1d280 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c  ne, regAddrB, 0,
1d290 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20   addrSelectB);. 
1d2a0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1d2b0 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29   "right SELECT")
1d2c0 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20  );.  savedLimit 
1d2d0 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73  = p->iLimit;.  s
1d2e0 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e  avedOffset = p->
1d2f0 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c  iOffset;.  p->iL
1d300 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42  imit = regLimitB
1d310 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
1d320 20 30 3b 20 20 0a 20 20 45 78 70 6c 61 69 6e 51   0;  .  ExplainQ
1d330 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
1d340 2c 20 31 2c 20 22 52 49 47 48 54 22 29 29 3b 0a  , 1, "RIGHT"));.
1d350 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
1d360 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
1d370 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  B);.  p->iLimit 
1d380 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20  = savedLimit;.  
1d390 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76  p->iOffset = sav
1d3a0 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69  edOffset;.  sqli
1d3b0 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
1d3c0 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72 42 29  ine(v, regAddrB)
1d3d0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1d3e0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
1d3f0 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
1d400 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
1d410 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e A.  ** select 
1d420 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
1d430 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
1d440 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
1d450 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
1d460 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
1d470 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22  t routine for A"
1d480 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d  ));.  addrOutA =
1d490 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
1d4a0 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
1d4b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d4c0 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44     p, &destA, pD
1d4d0 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20  est, regOutA,.  
1d4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1d4f0 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
1d500 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20   labelEnd);.  . 
1d510 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1d520 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
1d530 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
1d540 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a  nt row of the B.
1d550 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
1d560 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
1d570 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
1d580 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
1d590 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1d5a0 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
1d5b0 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70   ){.    VdbeNoop
1d5c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
1d5d0 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
1d5e0 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75  B"));.    addrOu
1d5f0 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tB = generateOut
1d600 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
1d610 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
1d620 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42         p, &destB
1d630 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42  , pDest, regOutB
1d640 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d650 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
1d660 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  Dup, labelEnd);.
1d670 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79    }.  sqlite3Key
1d680 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75  InfoUnref(pKeyDu
1d690 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  p);..  /* Genera
1d6a0 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1d6b0 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
1d6c0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
1d6d0 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65  ect A.  ** are e
1d6e0 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
1d6f0 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
1d700 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   B remains..  */
1d710 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58  .  if( op==TK_EX
1d720 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  CEPT || op==TK_I
1d730 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
1d740 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61  addrEofA_noB = a
1d750 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45  ddrEofA = labelE
1d760 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  nd;.  }else{  . 
1d770 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1d780 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75  nt((v, "eof-A su
1d790 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
1d7a0 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69   addrEofA = sqli
1d7b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d7c0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1d7d0 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
1d7e0 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20     addrEofA_noB 
1d7f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1d800 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1d810 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c   regAddrB, label
1d820 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  End);.          
1d830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d840 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
1d850 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1d860 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1d870 76 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  v, addrEofA);.  
1d880 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
1d890 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
1d8a0 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
1d8b0 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
1d8c0 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  tRow);.  }..  /*
1d8d0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1d8e0 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
1d8f0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
1d900 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a  rom select B.  *
1d910 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
1d920 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
1d930 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e   select A remain
1d940 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  s..  */.  if( op
1d950 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
1d960 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  {.    addrEofB =
1d970 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69   addrEofA;.    i
1d980 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
1d990 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   > pPrior->nSele
1d9a0 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
1d9b0 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
1d9c0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65  nSelectRow;.  }e
1d9d0 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
1d9e0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1d9f0 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  eof-B subroutine
1da00 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
1da10 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
1da20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1da30 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
1da40 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  OutA);.    sqlit
1da50 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1da60 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1da70 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56  rA, labelEnd); V
1da80 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1da90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1daa0 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 42 29  oto(v, addrEofB)
1dab0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
1dac0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
1dad0 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
1dae0 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A<B.  */.  VdbeN
1daf0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1db00 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-lt-B subroutin
1db10 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42  e"));.  addrAltB
1db20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1db30 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1db40 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
1db50 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  utA);.  sqlite3V
1db60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1db70 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1db80 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65   addrEofA); Vdbe
1db90 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
1dba0 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1dbb0 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
1dbc0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1dbd0 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1dbe0 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a  case of A==B.  *
1dbf0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
1dc00 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65  LL ){.    addrAe
1dc10 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20  qB = addrAltB;. 
1dc20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
1dc30 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
1dc40 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
1dc50 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72  drAltB;.    addr
1dc60 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  AltB++;.  }else{
1dc70 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1dc80 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42  ment((v, "A-eq-B
1dc90 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1dca0 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20      addrAeqB =. 
1dcb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1dcc0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1dcd0 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1dce0 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72  EofA); VdbeCover
1dcf0 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1dd00 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1dd10 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a  abelCmpr);.  }..
1dd20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1dd30 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
1dd40 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a   case of A>B.  *
1dd50 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
1dd60 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20  ent((v, "A-gt-B 
1dd70 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1dd80 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69   addrAgtB = sqli
1dd90 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1dda0 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d  dr(v);.  if( op=
1ddb0 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54  =TK_ALL || op==T
1ddc0 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73  K_UNION ){.    s
1ddd0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1dde0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1ddf0 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
1de00 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
1de10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1de20 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
1de30 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65   addrEofB); Vdbe
1de40 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
1de50 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1de60 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
1de70 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75   /* This code ru
1de80 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69  ns once to initi
1de90 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67  alize everything
1dea0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1deb0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
1dec0 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  addr1);.  sqlite
1ded0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1dee0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1def0 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29  A, addrEofA_noB)
1df00 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1df10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1df20 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1df30 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ld, regAddrB, ad
1df40 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76  drEofB); VdbeCov
1df50 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
1df60 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61  Implement the ma
1df70 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20  in merge loop.  
1df80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1df90 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1dfa0 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71  labelCmpr);.  sq
1dfb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1dfc0 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f  v, OP_Permutatio
1dfd0 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  n, 0, 0, 0, (cha
1dfe0 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f  r*)aPermute, P4_
1dff0 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c  INTARRAY);.  sql
1e000 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1e010 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65  , OP_Compare, de
1e020 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42  stA.iSdst, destB
1e030 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79  .iSdst, nOrderBy
1e040 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e050 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1e060 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f  *)pKeyMerge, P4_
1e070 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69  KEYINFO);.  sqli
1e080 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1e090 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54  v, OPFLAG_PERMUT
1e0a0 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  E);.  sqlite3Vdb
1e0b0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
1e0c0 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64  mp, addrAltB, ad
1e0d0 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42  drAeqB, addrAgtB
1e0e0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1e0f0 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  v);..  /* Jump t
1e100 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74  o the this point
1e110 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72   in order to ter
1e120 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79  minate the query
1e130 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1e140 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1e150 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a  (v, labelEnd);..
1e160 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20    /* Reassembly 
1e170 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
1e180 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ry so that it wi
1e190 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72 72  ll be freed corr
1e1a0 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68  ectly.  ** by th
1e1b0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1e1c0 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  on */.  if( p->p
1e1d0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  Prior ){.    sql
1e1e0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
1e1f0 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b  (db, p->pPrior);
1e200 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72  .  }.  p->pPrior
1e210 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72   = pPrior;.  pPr
1e220 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  ior->pNext = p;.
1e230 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e  .  /*** TBD:  In
1e240 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20  sert subroutine 
1e250 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63  calls to close c
1e260 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70  ursors on incomp
1e270 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71  lete.  **** subq
1e280 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 45  ueries ****/.  E
1e290 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50  xplainQueryPlanP
1e2a0 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65  op(pParse);.  re
1e2b0 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72  turn pParse->nEr
1e2c0 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  r!=0;.}.#endif..
1e2d0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1e2e0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1e2f0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1e300 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1e310 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  ../* An instance
1e320 20 6f 66 20 74 68 65 20 53 75 62 73 74 43 6f 6e   of the SubstCon
1e330 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65 73 63  text object desc
1e340 72 69 62 65 73 20 61 6e 20 73 75 62 73 74 69 74  ribes an substit
1e350 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74 6f  ution edit.** to
1e360 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   be performed on
1e370 20 61 20 70 61 72 73 65 20 74 72 65 65 2e 0a 2a   a parse tree..*
1e380 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65 6e  *.** All referen
1e390 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
1e3a0 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20 61  n table iTable a
1e3b0 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  re to be replace
1e3c0 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e 64 69  d by correspondi
1e3d0 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  ng.** expression
1e3e0 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a  s in pEList..*/.
1e3f0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
1e400 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20 20  ubstContext {.  
1e410 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
1e420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e430 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
1e440 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1e450 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e460 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66 65 72  /* Replace refer
1e470 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61  ences to this ta
1e480 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65  ble */.  int iNe
1e490 77 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  wTable;         
1e4a0 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65 20     /* New table 
1e4b0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
1e4c0 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20 20  isLeftJoin;     
1e4d0 20 20 20 20 20 20 2f 2a 20 41 64 64 20 54 4b 5f        /* Add TK_
1e4e0 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f  IF_NULL_ROW opco
1e4f0 64 65 73 20 6f 6e 20 65 61 63 68 20 72 65 70 6c  des on each repl
1e500 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  acement */.  Exp
1e510 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
1e520 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63         /* Replac
1e530 65 6d 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  ement expression
1e540 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f 6e 74  s */.} SubstCont
1e550 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  ext;../* Forward
1e560 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   Declarations */
1e570 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1e580 73 74 45 78 70 72 4c 69 73 74 28 53 75 62 73 74  stExprList(Subst
1e590 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72 4c 69  Context*, ExprLi
1e5a0 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  st*);.static voi
1e5b0 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 75  d substSelect(Su
1e5c0 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53 65 6c  bstContext*, Sel
1e5d0 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  ect*, int);../*.
1e5e0 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
1e5f0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
1e600 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
1e610 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
1e620 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
1e630 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
1e640 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
1e650 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d   of the iColumn-
1e660 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  th.** entry in p
1e670 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
1e680 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
1e690 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
1e6a0 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
1e6b0 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ).**.** This rou
1e6c0 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20  tine is part of 
1e6d0 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70  the flattening p
1e6e0 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62  rocedure.  A sub
1e6f0 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72  query.** whose r
1e700 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66  esult set is def
1e710 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61  ined by pEList a
1e720 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20  ppears as entry 
1e730 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  in the.** FROM c
1e740 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
1e750 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  T such that the 
1e760 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69  VDBE cursor assi
1e770 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20  gned to that.** 
1e780 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FORM clause entr
1e790 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68  y is iTable.  Th
1e7a0 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  is routine makes
1e7b0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a   the necessary .
1e7c0 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45  ** changes to pE
1e7d0 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72  xpr so that it r
1e7e0 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
1e7f0 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  o the source tab
1e800 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62  le.** of the sub
1e810 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65  query rather the
1e820 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
1e830 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  he subquery..*/.
1e840 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62  static Expr *sub
1e850 73 74 45 78 70 72 28 0a 20 20 53 75 62 73 74 43  stExpr(.  SubstC
1e860 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20  ontext *pSubst, 
1e870 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1e880 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75 74  of the substitut
1e890 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ion */.  Expr *p
1e8a0 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
1e8b0 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68  /* Expr in which
1e8c0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63   substitution oc
1e8d0 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  curs */.){.  if(
1e8e0 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
1e8f0 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72  rn 0;.  if( Expr
1e900 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1e910 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
1e920 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 52 69     && pExpr->iRi
1e930 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53  ghtJoinTable==pS
1e940 75 62 73 74 2d 3e 69 54 61 62 6c 65 0a 20 20 29  ubst->iTable.  )
1e950 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 52 69  {.    pExpr->iRi
1e960 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70  ghtJoinTable = p
1e970 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65  Subst->iNewTable
1e980 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70  ;.  }.  if( pExp
1e990 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
1e9a0 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
1e9b0 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c  e==pSubst->iTabl
1e9c0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
1e9d0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
1e9e0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
1e9f0 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
1ea00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
1ea10 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45  r *pNew;.      E
1ea20 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 70 53 75  xpr *pCopy = pSu
1ea30 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70  bst->pEList->a[p
1ea40 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  Expr->iColumn].p
1ea50 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72  Expr;.      Expr
1ea60 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20   ifNullRow;.    
1ea70 20 20 61 73 73 65 72 74 28 20 70 53 75 62 73 74    assert( pSubst
1ea80 2d 3e 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ->pEList!=0 && p
1ea90 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53  Expr->iColumn<pS
1eaa0 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  ubst->pEList->nE
1eab0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  xpr );.      ass
1eac0 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
1ead0 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
1eae0 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
1eaf0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1eb00 72 49 73 56 65 63 74 6f 72 28 70 43 6f 70 79 29  rIsVector(pCopy)
1eb10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1eb20 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73  te3VectorErrorMs
1eb30 67 28 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65  g(pSubst->pParse
1eb40 2c 20 70 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , pCopy);.      
1eb50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1eb60 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 53 75  qlite3 *db = pSu
1eb70 62 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  bst->pParse->db;
1eb80 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75  .        if( pSu
1eb90 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20  bst->isLeftJoin 
1eba0 26 26 20 70 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b  && pCopy->op!=TK
1ebb0 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
1ebc0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 69 66 4e       memset(&ifN
1ebd0 75 6c 6c 52 6f 77 2c 20 30 2c 20 73 69 7a 65 6f  ullRow, 0, sizeo
1ebe0 66 28 69 66 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20  f(ifNullRow));. 
1ebf0 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52           ifNullR
1ec00 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f 4e 55  ow.op = TK_IF_NU
1ec10 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20 20  LL_ROW;.        
1ec20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66    ifNullRow.pLef
1ec30 74 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20  t = pCopy;.     
1ec40 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 69       ifNullRow.i
1ec50 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e  Table = pSubst->
1ec60 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 20  iNewTable;.     
1ec70 20 20 20 20 20 70 43 6f 70 79 20 3d 20 26 69 66       pCopy = &if
1ec80 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 20  NullRow;.       
1ec90 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20   }.        pNew 
1eca0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
1ecb0 28 64 62 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a  (db, pCopy, 0);.
1ecc0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1ecd0 20 26 26 20 70 53 75 62 73 74 2d 3e 69 73 4c 65   && pSubst->isLe
1ece0 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
1ecf0 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
1ed00 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e  rty(pNew, EP_Can
1ed10 42 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  BeNull);.       
1ed20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
1ed30 4e 65 77 20 26 26 20 45 78 70 72 48 61 73 50 72  New && ExprHasPr
1ed40 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
1ed50 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
1ed60 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 52 69         pNew->iRi
1ed70 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70  ghtJoinTable = p
1ed80 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
1ed90 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
1eda0 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
1edb0 28 70 4e 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f  (pNew, EP_FromJo
1edc0 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  in);.        }. 
1edd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1ede0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
1edf0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  pr);.        pEx
1ee00 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  pr = pNew;.     
1ee10 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
1ee20 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1ee30 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  >op==TK_IF_NULL_
1ee40 52 4f 57 20 26 26 20 70 45 78 70 72 2d 3e 69 54  ROW && pExpr->iT
1ee50 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54  able==pSubst->iT
1ee60 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 45  able ){.      pE
1ee70 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53  xpr->iTable = pS
1ee80 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b  ubst->iNewTable;
1ee90 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 78 70 72  .    }.    pExpr
1eea0 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45  ->pLeft = substE
1eeb0 78 70 72 28 70 53 75 62 73 74 2c 20 70 45 78 70  xpr(pSubst, pExp
1eec0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70  r->pLeft);.    p
1eed0 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73  Expr->pRight = s
1eee0 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1eef0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
1ef00 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
1ef10 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1ef20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
1ef30 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1ef40 63 74 28 70 53 75 62 73 74 2c 20 70 45 78 70 72  ct(pSubst, pExpr
1ef50 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b  ->x.pSelect, 1);
1ef60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ef70 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1ef80 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78  pSubst, pExpr->x
1ef90 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
1efa0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
1efb0 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  r;.}.static void
1efc0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a   substExprList(.
1efd0 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a    SubstContext *
1efe0 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72  pSubst, /* Descr
1eff0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  iption of the su
1f000 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20  bstitution */.  
1f010 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
1f020 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
1f030 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69   scan and in whi
1f040 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
1f050 69 74 75 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  itutes */.){.  i
1f060 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1f070 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1f080 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1f090 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1f0a0 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
1f0b0 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78 70  pExpr = substExp
1f0c0 72 28 70 53 75 62 73 74 2c 20 70 4c 69 73 74 2d  r(pSubst, pList-
1f0d0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1f0e0 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1f0f0 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 53  substSelect(.  S
1f100 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75  ubstContext *pSu
1f110 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74  bst, /* Descript
1f120 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1f130 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  itution */.  Sel
1f140 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1f150 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
1f160 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20  tement in which 
1f170 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1f180 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64  tions */.  int d
1f190 6f 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  oPrior          
1f1a0 20 2f 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74   /* Do substitut
1f1b0 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20  es on p->pPrior 
1f1c0 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  too */.){.  SrcL
1f1d0 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72  ist *pSrc;.  str
1f1e0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1f1f0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
1f200 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
1f210 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73  urn;.  do{.    s
1f220 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1f230 62 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  bst, p->pEList);
1f240 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1f250 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 47  st(pSubst, p->pG
1f260 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 75 62  roupBy);.    sub
1f270 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1f280 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  t, p->pOrderBy);
1f290 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
1f2a0 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62  = substExpr(pSub
1f2b0 73 74 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  st, p->pHaving);
1f2c0 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
1f2d0 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73   substExpr(pSubs
1f2e0 74 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  t, p->pWhere);. 
1f2f0 20 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72     pSrc = p->pSr
1f300 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
1f310 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  Src!=0 );.    fo
1f320 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20  r(i=pSrc->nSrc, 
1f330 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69  pItem=pSrc->a; i
1f340 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
1f350 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1f360 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70 49 74  lect(pSubst, pIt
1f370 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b  em->pSelect, 1);
1f380 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1f390 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
1f3a0 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73 74 45  {.        substE
1f3b0 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1f3c0 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  pItem->u1.pFuncA
1f3d0 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
1f3e0 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50   }.  }while( doP
1f3f0 72 69 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e  rior && (p = p->
1f400 70 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a  pPrior)!=0 );.}.
1f410 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
1f420 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1f430 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1f440 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1f450 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21  _VIEW) */..#if !
1f460 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1f470 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1f480 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1f490 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a  _OMIT_VIEW)./*.*
1f4a0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1f4b0 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
1f4c0 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 73  en subqueries as
1f4d0 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f   a performance o
1f4e0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20  ptimization..** 
1f4f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1f500 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b  urns 1 if it mak
1f510 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30  es changes and 0
1f520 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e   if no flattenin
1f530 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  g occurs..**.** 
1f540 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  To understand th
1f550 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61  e concept of fla
1f560 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65  ttening, conside
1f570 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  r the following.
1f580 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  ** query:.**.** 
1f590 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
1f5a0 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53  M (SELECT x+y AS
1f5b0 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
1f5c0 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e   z<100) WHERE a>
1f5d0 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  5.**.** The defa
1f5e0 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65  ult way of imple
1f5f0 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65  menting this que
1f600 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65  ry is to execute
1f610 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79   the.** subquery
1f620 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65   first and store
1f630 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
1f640 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
1f650 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74  e, then.** run t
1f660 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f  he outer query o
1f670 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
1f680 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65   table.  This re
1f690 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61  quires two.** pa
1f6a0 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61  sses over the da
1f6b0 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65  ta.  Furthermore
1f6c0 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65  , because the te
1f6d0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a  mporary table.**
1f6e0 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c   has no indices,
1f6f0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1f700 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e on the outer q
1f710 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  uery cannot be.*
1f720 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a  * optimized..**.
1f730 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f740 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72  attempts to rewr
1f750 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68  ite queries such
1f760 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e   as the above in
1f770 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66  to.** a single f
1f780 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65  lat select, like
1f790 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1f7a0 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61   SELECT x+y AS a
1f7b0 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
1f7c0 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a  <100 AND a>5.**.
1f7d0 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
1f7e0 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73  rated for this s
1f7f0 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69  implification gi
1f800 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73  ves the same res
1f810 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20  ult.** but only 
1f820 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20  has to scan the 
1f830 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20  data once.  And 
1f840 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20  because indices 
1f850 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20  might .** exist 
1f860 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c  on the table t1,
1f870 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e   a complete scan
1f880 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67   of the data mig
1f890 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64  ht be.** avoided
1f8a0 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69  ..**.** Flatteni
1f8b0 6e 67 20 69 73 20 73 75 62 6a 65 63 74 20 74 6f  ng is subject to
1f8c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
1f8d0 6f 6e 73 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a  onstraints:.**.*
1f8e0 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c  *  (**)  We no l
1f8f0 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f  onger attempt to
1f900 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61   flatten aggrega
1f910 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 57  te subqueries. W
1f920 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  as:.**        Th
1f930 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
1f940 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63  he outer query c
1f950 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 61 67  annot both be ag
1f960 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1f970 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e   (**)  We no lon
1f980 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66  ger attempt to f
1f990 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65  latten aggregate
1f9a0 20 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73   subqueries. Was
1f9b0 3a 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 29 20  :.**        (2) 
1f9c0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1f9d0 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
1f9e0 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28  then.**        (
1f9f0 32 61 29 20 74 68 65 20 6f 75 74 65 72 20 71 75  2a) the outer qu
1fa00 65 72 79 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ery must not be 
1fa10 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20  a join and.**   
1fa20 20 20 20 20 20 28 32 62 29 20 74 68 65 20 6f 75       (2b) the ou
1fa30 74 65 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e  ter query must n
1fa40 6f 74 20 75 73 65 20 73 75 62 71 75 65 72 69 65  ot use subquerie
1fa50 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
1fa60 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
1fa70 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  one FROM-clause 
1fa80 73 75 62 71 75 65 72 79 20 74 68 61 74 20 69 73  subquery that is
1fa90 20 61 20 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20   a candidate.** 
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
1fab0 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28 54 68  flattening.  (Th
1fac0 69 73 20 69 73 20 64 75 65 20 74 6f 20 74 69 63  is is due to tic
1fad0 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33 62 66  ket [2f7170d73bf
1fae0 39 61 62 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20  9abf80].**      
1faf0 20 20 20 20 20 20 20 66 72 6f 6d 20 32 30 31 35         from 2015
1fb00 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20  -02-09.).**.**  
1fb10 20 28 33 29 20 20 49 66 20 74 68 65 20 73 75 62   (3)  If the sub
1fb20 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
1fb30 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
1fb40 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a  LEFT JOIN then.*
1fb50 2a 20 20 20 20 20 20 20 20 28 33 61 29 20 74 68  *        (3a) th
1fb60 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
1fb70 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64  ot be a join and
1fb80 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 62 29 20  .**        (3b) 
1fb90 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1fba0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1fbb0 6d 61 79 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  may not contain 
1fbc0 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20  a virtual.**    
1fbd0 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 61           table a
1fbe0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 63  nd.**        (3c
1fbf0 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1fc00 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20  y may not be an 
1fc10 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a  aggregate..**.**
1fc20 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
1fc30 75 65 72 79 20 63 61 6e 20 6e 6f 74 20 62 65 20  uery can not be 
1fc40 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1fc50 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f   (**)  At one po
1fc60 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  int restrictions
1fc70 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66   (4) and (5) def
1fc80 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66  ined a subset of
1fc90 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20   DISTINCT.**    
1fca0 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20      sub-queries 
1fcb0 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64  that were exclud
1fcc0 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74  ed from this opt
1fcd0 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72  imization. Restr
1fce0 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20  iction .**      
1fcf0 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20    (4) has since 
1fd00 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f  been expanded to
1fd10 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53   exclude all DIS
1fd20 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73  TINCT subqueries
1fd30 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57  ..**.**  (**)  W
1fd40 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65  e no longer atte
1fd50 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61  mpt to flatten a
1fd60 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
1fd70 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20  ies.  Was:.**   
1fd80 20 20 20 20 20 49 66 20 74 68 65 20 73 75 62 71       If the subq
1fd90 75 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74  uery is aggregat
1fda0 65 2c 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  e, the outer que
1fdb0 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 44 49  ry may not be DI
1fdc0 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
1fdd0 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
1fde0 79 20 6d 75 73 74 20 68 61 76 65 20 61 20 46 52  y must have a FR
1fdf0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f  OM clause.  TODO
1fe00 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72 69 65  :  For subquerie
1fe10 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20  s without.**    
1fe20 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73      A FROM claus
1fe30 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69  e, consider addi
1fe40 6e 67 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  ng a FROM clause
1fe50 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
1fe60 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c  l.**        tabl
1fe70 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68  e sqlite_once th
1fe80 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  at consists of a
1fe90 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74   single row cont
1fea0 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  aining a.**     
1feb0 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a     single NULL..
1fec0 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 49 66 20  **.**   (8)  If 
1fed0 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1fee0 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
1fef0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1ff00 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a   not be a join..
1ff10 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 49 66 20  **.**   (9)  If 
1ff20 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1ff30 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
1ff40 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1ff50 20 6e 6f 74 20 62 65 20 61 67 67 72 65 67 61 74   not be aggregat
1ff60 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  e..**.**  (**)  
1ff70 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29  Restriction (10)
1ff80 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f   was removed fro
1ff90 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30  m the code on 20
1ffa0 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a  05-02-05 but we.
1ffb0 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69 64 65  **        accide
1ffc0 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74 68 65  ntly carried the
1ffd0 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64   comment forward
1ffe0 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31   until 2014-09-1
1fff0 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20  5.  Original.** 
20000 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e         constrain
20010 74 3a 20 22 49 66 20 74 68 65 20 73 75 62 71 75  t: "If the subqu
20020 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65  ery is aggregate
20030 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
20040 71 75 65 72 79 20 0a 2a 2a 20 20 20 20 20 20 20  query .**       
20050 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d   may not use LIM
20060 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29  IT.".**.**  (11)
20070 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
20080 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
20090 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20  ry may not both 
200a0 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c  have ORDER BY cl
200b0 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  auses..**.**  (*
200c0 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e  *)  Not implemen
200d0 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69  ted.  Subsumed i
200e0 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20  nto restriction 
200f0 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f  (3).  Was previo
20100 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61  usly.**        a
20110 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72 69   separate restri
20120 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66  ction deriving f
20130 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e  rom ticket #350.
20140 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68  .**.**  (13)  Th
20150 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f  e subquery and o
20160 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
20170 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49  ot both use LIMI
20180 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20  T..**.**  (14)  
20190 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  The subquery may
201a0 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e   not use OFFSET.
201b0 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 49 66  .**.**  (15)  If
201c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
201d0 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 63 6f   is part of a co
201e0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
201f0 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  hen the.**      
20200 20 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e    subquery may n
20210 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a  ot use LIMIT..**
20220 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63          (See tic
20230 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69  ket #2339 and ti
20240 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34  cket [02a8e81d44
20250 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20  ])..**.**  (16) 
20260 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   If the outer qu
20270 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65  ery is aggregate
20280 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 71 75  , then the subqu
20290 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20  ery may not.**  
202a0 20 20 20 20 20 20 75 73 65 20 4f 52 44 45 52 20        use ORDER 
202b0 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39  BY.  (Ticket #29
202c0 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74  42)  This used t
202d0 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20  o not matter.** 
202e0 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20         until we 
202f0 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67  introduced the g
20300 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75  roup_concat() fu
20310 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20  nction.  .**.** 
20320 20 28 31 37 29 20 20 49 66 20 74 68 65 20 73 75   (17)  If the su
20330 62 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  bquery is a comp
20340 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
20350 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 61  n.**        (17a
20360 29 20 61 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f  ) all compound o
20370 70 65 72 61 74 6f 72 73 20 6d 75 73 74 20 62 65  perators must be
20380 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e   a UNION ALL, an
20390 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 62  d.**        (17b
203a0 29 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 69  ) no terms withi
203b0 6e 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63  n the subquery c
203c0 6f 6d 70 6f 75 6e 64 20 6d 61 79 20 62 65 20 61  ompound may be a
203d0 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 20 20  ggregate.**     
203e0 20 20 20 20 20 20 20 20 20 6f 72 20 44 49 53 54           or DIST
203f0 49 4e 43 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  INCT, and.**    
20400 20 20 20 20 28 31 37 63 29 20 65 76 65 72 79 20      (17c) every 
20410 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20  term within the 
20420 73 75 62 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e  subquery compoun
20430 64 20 6d 75 73 74 20 68 61 76 65 20 61 20 46 52  d must have a FR
20440 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20  OM clause.**    
20450 20 20 20 20 28 31 37 64 29 20 74 68 65 20 6f 75      (17d) the ou
20460 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
20470 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  t be.**         
20480 20 20 20 20 20 28 31 37 64 31 29 20 61 67 67 72       (17d1) aggr
20490 65 67 61 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20  egate, or.**    
204a0 20 20 20 20 20 20 20 20 20 20 28 31 37 64 32 29            (17d2)
204b0 20 44 49 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a   DISTINCT, or.**
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31                (1
204d0 37 64 33 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a  7d3) a join..**.
204e0 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61  **        The pa
204f0 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65  rent and sub-que
20500 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57  ry may contain W
20510 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75  HERE clauses. Su
20520 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20  bject to.**     
20530 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28     rules (11), (
20540 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68  13) and (14), th
20550 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  ey may also cont
20560 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a  ain ORDER BY,.**
20570 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e          LIMIT an
20580 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
20590 2e 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  .  The subquery 
205a0 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63  cannot use any c
205b0 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
205c0 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72    operator other
205d0 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20   than UNION ALL 
205e0 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20  because all the 
205f0 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a  other compound.*
20600 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f  *        operato
20610 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69  rs have an impli
20620 65 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63  ed DISTINCT whic
20630 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20  h is disallowed 
20640 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73  by.**        res
20650 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a  triction (4)..**
20660 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c  .**        Also,
20670 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20   each component 
20680 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
20690 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   must return the
206a0 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   same number.** 
206b0 20 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74         of result
206c0 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69   columns. This i
206d0 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71  s actually a req
206e0 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79  uirement for any
206f0 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
20700 20 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65      SELECT state
20710 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68  ment, but all th
20720 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73  e code here does
20730 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68   is make sure th
20740 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20  at no.**        
20750 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73  such (illegal) s
20760 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74  ub-query is flat
20770 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  tened. The calle
20780 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68  r will detect th
20790 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74  e.**        synt
207a0 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74  ax error and ret
207b0 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d  urn a detailed m
207c0 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  essage..**.**  (
207d0 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  18)  If the sub-
207e0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
207f0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
20800 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
20810 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45  e.**        ORDE
20820 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 74  R BY clause of t
20830 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62  he parent must b
20840 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e  e simple referen
20850 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20  ces to .**      
20860 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65    columns of the
20870 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a   sub-query..**.*
20880 2a 20 20 28 31 39 29 20 20 49 66 20 74 68 65 20  *  (19)  If the 
20890 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49  subquery uses LI
208a0 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74  MIT then the out
208b0 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
208c0 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20  .**        have 
208d0 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  a WHERE clause..
208e0 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20  **.**  (20)  If 
208f0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
20900 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
20910 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  ct, then it must
20920 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
20930 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63     an ORDER BY c
20940 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23  lause.  Ticket #
20950 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20  3773.  We could 
20960 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74  relax this const
20970 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  raint.**        
20980 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79 69  somewhat by sayi
20990 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72 6d  ng that the term
209a0 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
209b0 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a  Y clause must.**
209c0 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20 61          appear a
209d0 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73  s unmodified res
209e0 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ult columns in t
209f0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
20a00 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20   But we.**      
20a10 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74    have other opt
20a20 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69  imizations in mi
20a30 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  nd to deal with 
20a40 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  that case..**.**
20a50 20 20 28 32 31 29 20 20 49 66 20 74 68 65 20 73    (21)  If the s
20a60 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d  ubquery uses LIM
20a70 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65  IT then the oute
20a80 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
20a90 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  be.**        DIS
20aa0 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63  TINCT.  (See tic
20ab0 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d  ket [752e1646fc]
20ac0 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20  )..**.**  (22)  
20ad0 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  The subquery may
20ae0 20 6e 6f 74 20 62 65 20 61 20 72 65 63 75 72 73   not be a recurs
20af0 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20  ive CTE..**.**  
20b00 28 2a 2a 29 20 20 53 75 62 73 75 6d 65 64 20 69  (**)  Subsumed i
20b10 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20  nto restriction 
20b20 28 31 37 64 33 29 2e 20 20 57 61 73 3a 20 49 66  (17d3).  Was: If
20b30 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
20b40 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 61 20   is.**        a 
20b50 72 65 63 75 72 73 69 76 65 20 43 54 45 2c 20 74  recursive CTE, t
20b60 68 65 6e 20 74 68 65 20 73 75 62 2d 71 75 65 72  hen the sub-quer
20b70 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63  y may not be a c
20b80 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a  ompound query..*
20b90 2a 20 20 20 20 20 20 20 20 54 68 69 73 20 72 65  *        This re
20ba0 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63  striction is bec
20bb0 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e  ause transformin
20bc0 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  g the.**        
20bd0 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70  parent to a comp
20be0 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75  ound query confu
20bf0 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68 61  ses the code tha
20c00 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20  t handles.**    
20c10 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71 75      recursive qu
20c20 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65  eries in multiSe
20c30 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  lect()..**.**  (
20c40 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65  **)  We no longe
20c50 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61  r attempt to fla
20c60 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73  tten aggregate s
20c70 75 62 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a  ubqueries.  Was:
20c80 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 73  .**        The s
20c90 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
20ca0 62 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  be an aggregate 
20cb0 74 68 61 74 20 75 73 65 73 20 74 68 65 20 62 75  that uses the bu
20cc0 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20  ilt-in min() or 
20cd0 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61  .**        or ma
20ce0 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  x() functions.  
20cf0 28 57 69 74 68 6f 75 74 20 74 68 69 73 20 72 65  (Without this re
20d00 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65  striction, a que
20d10 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20  ry like:.**     
20d20 20 20 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f     "SELECT x FRO
20d30 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29  M (SELECT max(y)
20d40 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f  , x FROM t1)" wo
20d50 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  uld not necessar
20d60 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65  ily.**        re
20d70 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58  turn the value X
20d80 20 66 6f 72 20 77 68 69 63 68 20 59 20 77 61 73   for which Y was
20d90 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a   maximal.).**.**
20da0 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
20db0 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
20dc0 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
20dd0 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
20de0 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
20df0 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
20e00 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
20e10 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
20e20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
20e30 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
20e40 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
20e50 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
20e60 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
20e70 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
20e80 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
20e90 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
20ea0 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
20eb0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
20ec0 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
20ed0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
20ee0 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
20ef0 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
20f00 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
20f10 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
20f20 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
20f30 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
20f40 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
20f50 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
20f60 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
20f70 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
20f80 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
20f90 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
20fa0 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72  /* The parent or
20fb0 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74   outer SELECT st
20fc0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
20fd0 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
20fe0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d    /* Index in p-
20ff0 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68  >pSrc->a[] of th
21000 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79  e inner subquery
21010 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 20   */.  int isAgg 
21020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
21030 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45  ue if outer SELE
21040 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74  CT uses aggregat
21050 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
21060 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
21070 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
21080 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
21090 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65  hContext;.  Sele
210a0 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20  ct *pParent;    
210b0 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e  /* Current UNION
210c0 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65   ALL term of the
210d0 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a   other query */.
210e0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
210f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
21100 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
21110 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65  query" */.  Sele
21120 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20  ct *pSub1;      
21130 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
21140 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65  e rightmost sele
21150 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20  ct in sub-query 
21160 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
21170 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
21180 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
21190 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
211a0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75  /.  SrcList *pSu
211b0 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  bSrc;   /* The F
211c0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
211d0 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
211e0 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
211f0 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
21200 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
21210 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
21220 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
21230 20 69 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20   int iNewParent 
21240 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d  = -1;/* Replacem
21250 65 6e 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50  ent table for iP
21260 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  arent */.  int i
21270 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f  sLeftJoin = 0; /
21280 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 20 69  * True if pSub i
21290 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
212a0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
212b0 2a 2f 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20  */    .  int i; 
212c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
212d0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
212e0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21300 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
21310 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
21320 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
21330 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
21340 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
21350 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
21360 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
21370 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
21380 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
21390 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
213a0 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
213b0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
213c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
213d0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20  >pPrior==0 );.  
213e0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
213f0 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
21400 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
21410 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  er) ) return 0;.
21420 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
21430 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
21440 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
21450 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
21460 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
21470 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
21480 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  ;.  iParent = pS
21490 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ubitem->iCursor;
214a0 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
214b0 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
214c0 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
214d0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 6e  ;..  if( p->pWin
214e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
214f0 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
21500 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
21510 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20  pSubSrc );.  /* 
21520 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e  Prior to version
21530 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d   3.1.2, when LIM
21540 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61  IT and OFFSET ha
21550 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63  d to be simple c
21560 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e  onstants,.  ** n
21570 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70  ot arbitrary exp
21580 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c  ressions, we all
21590 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e  owed some combin
215a0 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64  ing of LIMIT and
215b0 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
215c0 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20  ause they could 
215d0 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63  be computed at c
215e0 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75  ompile-time.  Bu
215f0 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  t when LIMIT and
21600 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
21610 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78  ame arbitrary ex
21620 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65  pressions, we we
21630 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64  re forced to add
21640 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31   restrictions (1
21650 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29  3).  ** and (14)
21660 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  . */.  if( pSub-
21670 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c  >pLimit && p->pL
21680 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
21690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
216a0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33   Restriction (13
216b0 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
216c0 3e 70 4c 69 6d 69 74 20 26 26 20 70 53 75 62 2d  >pLimit && pSub-
216d0 3e 70 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 20  >pLimit->pRight 
216e0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a  ) return 0;   /*
216f0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34   Restriction (14
21700 29 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73  ) */.  if( (p->s
21710 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d  elFlags & SF_Com
21720 70 6f 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75  pound)!=0 && pSu
21730 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
21740 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
21750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21770 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
21780 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d  tion (15) */.  }
21790 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
217a0 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  nSrc==0 ) return
217b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
217c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
217d0 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f  triction (7)  */
217e0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
217f0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
21800 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  nct ) return 0; 
21810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
21820 74 72 69 63 74 69 6f 6e 20 28 34 29 20 20 2a 2f  triction (4)  */
21830 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
21840 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53  mit && (pSrc->nS
21850 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
21860 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
21870 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
21880 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20  rictions (8)(9) 
21890 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  */.  }.  if( p->
218a0 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62  pOrderBy && pSub
218b0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
218c0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
218d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218f0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
21900 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20  ction (11) */.  
21910 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  }.  if( isAgg &&
21920 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
21930 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
21940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21950 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a  striction (16) *
21960 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
21970 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72  imit && p->pWher
21980 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
21990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
219a0 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a  striction (19) *
219b0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
219c0 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  imit && (p->selF
219d0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
219e0 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72  ct)!=0 ){.     r
219f0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
21a00 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
21a10 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (21) */.  }.  if
21a20 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
21a30 20 26 20 28 53 46 5f 52 65 63 75 72 73 69 76 65   & (SF_Recursive
21a40 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
21a50 30 3b 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  0; /* Restrictio
21a60 6e 73 20 28 32 32 29 20 2a 2f 0a 20 20 7d 0a 0a  ns (22) */.  }..
21a70 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    /*.  ** If the
21a80 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
21a90 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
21aa0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74  f a LEFT JOIN, t
21ab0 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  hen the.  ** sub
21ac0 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20 62 65  query may not be
21ad0 20 61 20 6a 6f 69 6e 20 69 74 73 65 6c 66 20 28   a join itself (
21ae0 33 61 29 2e 20 45 78 61 6d 70 6c 65 20 6f 66 20  3a). Example of 
21af0 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 0a  why this is not.
21b00 20 20 2a 2a 20 61 6c 6c 6f 77 65 64 3a 0a 20 20    ** allowed:.  
21b10 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
21b20 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
21b30 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a  IN (t2 JOIN t3).
21b40 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
21b50 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
21b60 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
21b70 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
21b80 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
21b90 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74   JOIN t2) JOIN t
21ba0 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63  3.  **.  ** whic
21bb0 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20  h is not at all 
21bc0 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a  the same thing..
21bd0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
21be0 20 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65   subquery is the
21bf0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
21c00 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74  f a LEFT JOIN, t
21c10 68 65 6e 20 74 68 65 20 6f 75 74 65 72 0a 20 20  hen the outer.  
21c20 2a 2a 20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  ** query cannot 
21c30 62 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  be an aggregate.
21c40 20 28 33 63 29 20 20 54 68 69 73 20 69 73 20 61   (3c)  This is a
21c50 6e 20 61 72 74 69 66 61 63 74 20 6f 66 20 74 68  n artifact of th
21c60 65 20 77 61 79 0a 20 20 2a 2a 20 61 67 67 72 65  e way.  ** aggre
21c70 67 61 74 65 73 20 61 72 65 20 70 72 6f 63 65 73  gates are proces
21c80 73 65 64 20 2d 20 74 68 65 72 65 20 69 73 20 6e  sed - there is n
21c90 6f 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 20 64  o mechanism to d
21ca0 65 74 65 72 6d 69 6e 65 20 69 66 0a 20 20 2a 2a  etermine if.  **
21cb0 20 74 68 65 20 4c 45 46 54 20 4a 4f 49 4e 20 74   the LEFT JOIN t
21cc0 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 61  able should be a
21cd0 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20 2a 2a 0a 20 20  ll-NULL..  **.  
21ce0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 69 63 6b  ** See also tick
21cf0 65 74 73 20 23 33 30 36 2c 20 23 33 35 30 2c 20  ets #306, #350, 
21d00 61 6e 64 20 23 33 33 30 30 2e 0a 20 20 2a 2f 0a  and #3300..  */.
21d10 20 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d    if( (pSubitem-
21d20 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  >fg.jointype & J
21d30 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a 20  T_OUTER)!=0 ){. 
21d40 20 20 20 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20     isLeftJoin = 
21d50 31 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 53  1;.    if( pSubS
21d60 72 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73  rc->nSrc>1 || is
21d70 41 67 67 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  Agg || IsVirtual
21d80 28 70 53 75 62 53 72 63 2d 3e 61 5b 30 5d 2e 70  (pSubSrc->a[0].p
21d90 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Tab) ){.      /*
21da0 20 20 28 33 61 29 20 20 20 20 20 20 20 20 20 20    (3a)          
21db0 20 20 20 28 33 63 29 20 20 20 20 20 28 33 62 29     (3c)     (3b)
21dc0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
21dd0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69   0;.    }.  }.#i
21de0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52  fdef SQLITE_EXTR
21df0 41 5f 49 46 4e 55 4c 4c 52 4f 57 0a 20 20 65 6c  A_IFNULLROW.  el
21e00 73 65 20 69 66 28 20 69 46 72 6f 6d 3e 30 20 26  se if( iFrom>0 &
21e10 26 20 21 69 73 41 67 67 20 29 7b 0a 20 20 20 20  & !isAgg ){.    
21e20 2f 2a 20 53 65 74 74 69 6e 67 20 69 73 4c 65 66  /* Setting isLef
21e30 74 4a 6f 69 6e 20 74 6f 20 2d 31 20 63 61 75 73  tJoin to -1 caus
21e40 65 73 20 4f 50 5f 49 66 4e 75 6c 6c 52 6f 77 20  es OP_IfNullRow 
21e50 6f 70 63 6f 64 65 73 20 74 6f 20 62 65 20 67 65  opcodes to be ge
21e60 6e 65 72 61 74 65 64 20 66 6f 72 0a 20 20 20 20  nerated for.    
21e70 2a 2a 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ** every referen
21e80 63 65 20 74 6f 20 61 6e 79 20 72 65 73 75 6c 74  ce to any result
21e90 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 73 75 62   column from sub
21ea0 71 75 65 72 79 20 69 6e 20 61 20 6a 6f 69 6e 2c  query in a join,
21eb0 20 65 76 65 6e 0a 20 20 20 20 2a 2a 20 74 68 6f   even.    ** tho
21ec0 75 67 68 20 74 68 65 79 20 61 72 65 20 6e 6f 74  ugh they are not
21ed0 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 69   necessary.  Thi
21ee0 73 20 77 69 6c 6c 20 73 74 72 65 73 73 2d 74 65  s will stress-te
21ef0 73 74 20 74 68 65 20 4f 50 5f 49 66 4e 75 6c 6c  st the OP_IfNull
21f00 52 6f 77 20 0a 20 20 20 20 2a 2a 20 6f 70 63 6f  Row .    ** opco
21f10 64 65 2e 20 2a 2f 0a 20 20 20 20 69 73 4c 65 66  de. */.    isLef
21f20 74 4a 6f 69 6e 20 3d 20 2d 31 3b 0a 20 20 7d 0a  tJoin = -1;.  }.
21f30 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 73  #endif..  /* Res
21f40 74 72 69 63 74 69 6f 6e 20 28 31 37 29 3a 20 49  triction (17): I
21f50 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
21f60 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
21f70 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75  LECT, then it mu
21f80 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79  st.  ** use only
21f90 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   the UNION ALL o
21fa0 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e  perator. And non
21fb0 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20  e of the simple 
21fc0 73 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20  select queries. 
21fd0 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70   ** that make up
21fe0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
21ff0 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64  LECT are allowed
22000 20 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65   to be aggregate
22010 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a   or distinct.  *
22020 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a  * queries..  */.
22030 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69    if( pSub->pPri
22040 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  or ){.    if( pS
22050 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  ub->pOrderBy ){.
22060 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
22070 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
22080 28 32 30 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  (20) */.    }.  
22090 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28    if( isAgg || (
220a0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
220b0 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c  _Distinct)!=0 ||
220c0 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
220d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
220e0 3b 20 2f 2a 20 28 31 37 64 31 29 2c 20 28 31 37  ; /* (17d1), (17
220f0 64 32 29 2c 20 6f 72 20 28 31 37 64 33 29 20 2a  d2), or (17d3) *
22100 2f 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  /.    }.    for(
22110 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62  pSub1=pSub; pSub
22120 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e  1; pSub1=pSub1->
22130 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74  pPrior){.      t
22140 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
22150 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
22160 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
22170 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
22180 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65  inct );.      te
22190 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
221a0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
221b0 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
221c0 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
221d0 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73  gate );.      as
221e0 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63  sert( pSub->pSrc
221f0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
22200 65 72 74 28 20 70 53 75 62 2d 3e 70 45 4c 69 73  ert( pSub->pELis
22210 74 2d 3e 6e 45 78 70 72 3d 3d 70 53 75 62 31 2d  t->nExpr==pSub1-
22220 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
22230 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 75  ;.      if( (pSu
22240 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  b1->selFlags & (
22250 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
22260 67 67 72 65 67 61 74 65 29 29 21 3d 30 20 20 20  ggregate))!=0   
22270 20 2f 2a 20 28 31 37 62 29 20 2a 2f 0a 20 20 20   /* (17b) */.   
22280 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70      || (pSub1->p
22290 50 72 69 6f 72 20 26 26 20 70 53 75 62 31 2d 3e  Prior && pSub1->
222a0 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 20 20 20 20  op!=TK_ALL)     
222b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
222c0 31 37 61 29 20 2a 2f 0a 20 20 20 20 20 20 20 7c  17a) */.       |
222d0 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e  | pSub1->pSrc->n
222e0 53 72 63 3c 31 20 20 20 20 20 20 20 20 20 20 20  Src<1           
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22300 20 20 20 20 20 20 20 2f 2a 20 28 31 37 63 29 20         /* (17c) 
22310 2a 2f 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  */.      ){.    
22320 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
22330 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
22340 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72  case( pSub1->pSr
22350 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20  c->nSrc>1 );.   
22360 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72   }..    /* Restr
22370 69 63 74 69 6f 6e 20 28 31 38 29 2e 20 2a 2f 0a  iction (18). */.
22380 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
22390 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  rBy ){.      int
223a0 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
223b0 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65  i=0; ii<p->pOrde
223c0 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  rBy->nExpr; ii++
223d0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
223e0 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69  ->pOrderBy->a[ii
223f0 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
22400 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
22410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
22420 20 7d 0a 0a 20 20 2f 2a 20 45 78 2d 72 65 73 74   }..  /* Ex-rest
22430 72 69 63 74 69 6f 6e 20 28 32 33 29 3a 0a 20 20  riction (23):.  
22440 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 20  ** The only way 
22450 74 68 61 74 20 74 68 65 20 72 65 63 75 72 73 69  that the recursi
22460 76 65 20 70 61 72 74 20 6f 66 20 61 20 43 54 45  ve part of a CTE
22470 20 63 61 6e 20 63 6f 6e 74 61 69 6e 20 61 20 63   can contain a c
22480 6f 6d 70 6f 75 6e 64 0a 20 20 2a 2a 20 73 75 62  ompound.  ** sub
22490 71 75 65 72 79 20 69 73 20 66 6f 72 20 74 68 65  query is for the
224a0 20 73 75 62 71 75 65 72 79 20 74 6f 20 62 65 20   subquery to be 
224b0 6f 6e 65 20 74 65 72 6d 20 6f 66 20 61 20 6a 6f  one term of a jo
224c0 69 6e 2e 20 20 42 75 74 20 69 66 20 74 68 65 0a  in.  But if the.
224d0 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73    ** subquery is
224e0 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68   a join, then th
224f0 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 68 61 73  e flattening has
22500 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74   already been st
22510 6f 70 70 65 64 20 62 79 0a 20 20 2a 2a 20 72 65  opped by.  ** re
22520 73 74 72 69 63 74 69 6f 6e 20 28 31 37 64 33 29  striction (17d3)
22530 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
22540 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
22550 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20  F_Recursive)==0 
22560 7c 7c 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 3d  || pSub->pPrior=
22570 3d 30 20 29 3b 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20  =0 );..  /***** 
22580 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
22590 20 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69   point, flatteni
225a0 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ng is permitted.
225b0 20 2a 2a 2a 2a 2a 2f 0a 20 20 53 45 4c 45 43 54   *****/.  SELECT
225c0 54 52 41 43 45 28 31 2c 70 50 61 72 73 65 2c 70  TRACE(1,pParse,p
225d0 2c 28 22 66 6c 61 74 74 65 6e 20 25 73 2e 25 70  ,("flatten %s.%p
225e0 20 66 72 6f 6d 20 74 65 72 6d 20 25 64 5c 6e 22   from term %d\n"
225f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22600 20 20 20 20 20 70 53 75 62 2d 3e 7a 53 65 6c 4e       pSub->zSelN
22610 61 6d 65 2c 20 70 53 75 62 2c 20 69 46 72 6f 6d  ame, pSub, iFrom
22620 29 29 3b 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72  ));..  /* Author
22630 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79  ize the subquery
22640 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41   */.  pParse->zA
22650 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75  uthContext = pSu
22660 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  bitem->zName;.  
22670 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71  TESTONLY(i =) sq
22680 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
22690 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45  Parse, SQLITE_SE
226a0 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  LECT, 0, 0, 0);.
226b0 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53    testcase( i==S
226c0 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20  QLITE_DENY );.  
226d0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
226e0 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74  text = zSavedAut
226f0 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20  hContext;..  /* 
22700 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
22710 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   is a compound S
22720 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
22730 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69   then (by restri
22740 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61  ctions.  ** 17 a
22750 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20  nd 18 above) it 
22760 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20  must be a UNION 
22770 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65  ALL and the pare
22780 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20  nt query must . 
22790 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f   ** be of the fo
227a0 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
227b0 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c    SELECT <expr-l
227c0 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d  ist> FROM (<sub-
227d0 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63  query>) <where-c
227e0 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a  lause> .  **.  *
227f0 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e  * followed by an
22800 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49  y ORDER BY, LIMI
22810 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20  T and/or OFFSET 
22820 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c  clauses. This bl
22830 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73  ock.  ** creates
22840 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74   N-1 copies of t
22850 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20  he parent query 
22860 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45  without any ORDE
22870 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a  R BY, LIMIT or .
22880 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75    ** OFFSET clau
22890 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68  ses and joins th
228a0 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68  em to the left-h
228b0 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20  and-side of the 
228c0 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73  original.  ** us
228d0 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  ing UNION ALL op
228e0 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73  erators. In this
228f0 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e   case N is the n
22900 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a  umber of simple.
22910 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74    ** select stat
22920 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
22930 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79  mpound sub-query
22940 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d  ..  **.  ** Exam
22950 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ple:.  **.  **  
22960 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52     SELECT a+1 FR
22970 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20  OM (.  **       
22980 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
22990 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55  ab.  **        U
229a0 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20  NION ALL.  **   
229b0 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52       SELECT y FR
229c0 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20  OM tab.  **     
229d0 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
229e0 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
229f0 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61  abs(z*2) FROM ta
22a00 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48  b2.  **     ) WH
22a10 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42  ERE a!=5 ORDER B
22a20 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72  Y 1.  **.  ** Tr
22a30 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a  ansformed into:.
22a40 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
22a50 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61  LECT x+1 FROM ta
22a60 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20  b WHERE x+1!=5. 
22a70 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
22a80 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
22a90 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T y+1 FROM tab W
22aa0 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a  HERE y+1!=5.  **
22ab0 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
22ac0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
22ad0 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74  bs(z*2)+1 FROM t
22ae0 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a  ab2 WHERE abs(z*
22af0 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20  2)+1!=5.  **    
22b00 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
22b10 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68  .  ** We call th
22b20 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64  is the "compound
22b30 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65  -subquery flatte
22b40 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ning"..  */.  fo
22b50 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  r(pSub=pSub->pPr
22b60 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ior; pSub; pSub=
22b70 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  pSub->pPrior){. 
22b80 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b     Select *pNew;
22b90 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
22ba0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
22bb0 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20  derBy;.    Expr 
22bc0 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69  *pLimit = p->pLi
22bd0 6d 69 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  mit;.    Select 
22be0 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72  *pPrior = p->pPr
22bf0 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  ior;.    p->pOrd
22c00 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
22c10 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70  >pSrc = 0;.    p
22c20 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
22c30 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
22c40 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
22c50 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
22c60 20 70 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   p, 0);.    sqli
22c70 74 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65  te3SelectSetName
22c80 28 70 4e 65 77 2c 20 70 53 75 62 2d 3e 7a 53 65  (pNew, pSub->zSe
22c90 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70  lName);.    p->p
22ca0 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
22cb0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
22cc0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
22cd0 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
22ce0 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41      p->op = TK_A
22cf0 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  LL;.    if( pNew
22d00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
22d10 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
22d20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22d30 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
22d40 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
22d50 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69  f( pPrior ) pPri
22d60 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77  or->pNext = pNew
22d70 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e  ;.      pNew->pN
22d80 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ext = p;.      p
22d90 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b  ->pPrior = pNew;
22da0 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
22db0 43 45 28 32 2c 70 50 61 72 73 65 2c 70 2c 28 22  CE(2,pParse,p,("
22dc0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
22dd0 79 20 66 6c 61 74 74 65 6e 65 72 22 0a 20 20 20  y flattener".   
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22df0 20 20 20 20 20 20 20 20 20 20 20 22 20 63 72 65             " cre
22e00 61 74 65 73 20 25 73 2e 25 70 20 61 73 20 70 65  ates %s.%p as pe
22e10 65 72 5c 6e 22 2c 70 4e 65 77 2d 3e 7a 53 65 6c  er\n",pNew->zSel
22e20 4e 61 6d 65 2c 20 70 4e 65 77 29 29 3b 0a 20 20  Name, pNew));.  
22e30 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
22e40 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
22e50 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
22e60 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e  /* Begin flatten
22e70 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68  ing the iFrom-th
22e80 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
22e90 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20  OM clause .  ** 
22ea0 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
22eb0 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20  ry..  */.  pSub 
22ec0 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62 69 74  = pSub1 = pSubit
22ed0 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20  em->pSelect;..  
22ee0 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74 72  /* Delete the tr
22ef0 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74  ansient table st
22f00 72 75 63 74 75 72 65 20 61 73 73 6f 63 69 61 74  ructure associat
22f10 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
22f20 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20   subquery.  */. 
22f30 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
22f40 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  b, pSubitem->zDa
22f50 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74  tabase);.  sqlit
22f60 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
22f70 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  bitem->zName);. 
22f80 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
22f90 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  b, pSubitem->zAl
22fa0 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d  ias);.  pSubitem
22fb0 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b  ->zDatabase = 0;
22fc0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  .  pSubitem->zNa
22fd0 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  me = 0;.  pSubit
22fe0 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a  em->zAlias = 0;.
22ff0 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c    pSubitem->pSel
23000 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44  ect = 0;..  /* D
23010 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68  efer deleting th
23020 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61  e Table object a
23030 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
23040 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
23050 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65   until code gene
23060 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  ration is.  ** c
23070 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74  omplete, since t
23080 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65  here may still e
23090 78 69 73 74 20 45 78 70 72 2e 70 54 61 62 20 65  xist Expr.pTab e
230a0 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a  ntries that.  **
230b0 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 73 75   refer to the su
230c0 62 71 75 65 72 79 20 65 76 65 6e 20 61 66 74 65  bquery even afte
230d0 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54  r flattening.  T
230e0 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a  icket #3346..  *
230f0 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d  *.  ** pSubitem-
23100 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79 73 20  >pTab is always 
23110 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74  non-NULL by test
23120 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e   restrictions an
23130 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20  d tests above.. 
23140 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
23150 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21  (pSubitem->pTab!
23160 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  =0) ){.    Table
23170 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53   *pTabToDel = pS
23180 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ubitem->pTab;.  
23190 20 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d    if( pTabToDel-
231a0 3e 6e 54 61 62 52 65 66 3d 3d 31 20 29 7b 0a 20  >nTabRef==1 ){. 
231b0 20 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70       Parse *pTop
231c0 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
231d0 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
231e0 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rse);.      pTab
231f0 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62  ToDel->pNextZomb
23200 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  ie = pToplevel->
23210 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20  pZombieTab;.    
23220 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f    pToplevel->pZo
23230 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f  mbieTab = pTabTo
23240 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Del;.    }else{.
23250 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d        pTabToDel-
23260 3e 6e 54 61 62 52 65 66 2d 2d 3b 0a 20 20 20 20  >nTabRef--;.    
23270 7d 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e  }.    pSubitem->
23280 70 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  pTab = 0;.  }.. 
23290 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
232a0 67 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65  g loop runs once
232b0 20 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   for each term i
232c0 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62  n a compound-sub
232d0 71 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74  query.  ** flatt
232e0 65 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69  ening (as descri
232f0 62 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20  bed above).  If 
23300 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64  we are doing a d
23310 69 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20  ifferent kind.  
23320 2a 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** of flattening
23330 20 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20   - a flattening 
23340 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d  other than a com
23350 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
23360 6c 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a  lattening -.  **
23370 20 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20   then this loop 
23380 6f 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a  only runs once..
23390 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
233a0 6f 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66  oop moves all of
233b0 20 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e   the FROM elemen
233c0 74 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ts of the subque
233d0 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ry into the.  **
233e0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
233f0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
23400 65 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69  ery.  Before doi
23410 6e 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65  ng this, remembe
23420 72 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  r.  ** the curso
23430 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
23440 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20   original outer 
23450 71 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65  query FROM eleme
23460 6e 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65  nt in.  ** iPare
23470 6e 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74  nt.  The iParent
23480 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76   cursor will nev
23490 65 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62  er be used.  Sub
234a0 73 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a  sequent code.  *
234b0 2a 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72  * will scan expr
234c0 65 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20  essions looking 
234d0 66 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65  for iParent refe
234e0 72 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61  rences and repla
234f0 63 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65  ce.  ** those re
23500 66 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78  ferences with ex
23510 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72  pressions that r
23520 65 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75  esolve to the su
23530 62 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a  bquery FROM.  **
23540 20 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65   elements we are
23550 20 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e   now copying in.
23560 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72  .  */.  for(pPar
23570 65 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20  ent=p; pParent; 
23580 70 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d  pParent=pParent-
23590 3e 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53  >pPrior, pSub=pS
235a0 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
235b0 20 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20   int nSubSrc;.  
235c0 20 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20    u8 jointype = 
235d0 30 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d  0;.    pSubSrc =
235e0 20 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20   pSub->pSrc;    
235f0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
23600 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  of subquery */. 
23610 20 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75     nSubSrc = pSu
23620 62 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20  bSrc->nSrc;  /* 
23630 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
23640 69 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  in subquery FROM
23650 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70   clause */.    p
23660 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  Src = pParent->p
23670 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
23680 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
23690 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20  uter query */.. 
236a0 20 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20     if( pSrc ){. 
236b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
236c0 72 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46  rent==p );  /* F
236d0 69 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67  irst time throug
236e0 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
236f0 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70      jointype = p
23700 53 75 62 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e  Subitem->fg.join
23710 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  type;.    }else{
23720 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
23730 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20 2f 2a  Parent!=p );  /*
23740 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75   2nd and subsequ
23750 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f 75 67  ent times throug
23760 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  h the loop */.  
23770 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
23780 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  nt->pSrc = sqlit
23790 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
237a0 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  db, 0, 0, 0);.  
237b0 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20      if( pSrc==0 
237c0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
237d0 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
237e0 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 62  led );.        b
237f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
23800 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
23810 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 20  subquery uses a 
23820 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66 20 74  single slot of t
23830 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
23840 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20 20 20  f the outer.    
23850 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20 74 68  ** query.  If th
23860 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6d  e subquery has m
23870 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65 6c 65  ore than one ele
23880 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52 4f 4d  ment in its FROM
23890 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a 2a 20   clause,.    ** 
238a0 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68 65 20  then expand the 
238b0 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f 20 6d  outer query to m
238c0 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 69 74  ake space for it
238d0 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65 6c 65   to hold all ele
238e0 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20  ments.    ** of 
238f0 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
23900 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d    **.    ** Exam
23910 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ple:.    **.    
23920 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
23930 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c 45 43  ROM tabA, (SELEC
23940 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c 20 73  T * FROM sub1, s
23950 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20 20 20  ub2), tabB;.    
23960 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 75  **.    ** The ou
23970 74 65 72 20 71 75 65 72 79 20 68 61 73 20 33 20  ter query has 3 
23980 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46 52 4f  slots in its FRO
23990 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65 20 73  M clause.  One s
239a0 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  lot of the.    *
239b0 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20 28 74  * outer query (t
239c0 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74 29 20  he middle slot) 
239d0 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  is used by the s
239e0 75 62 71 75 65 72 79 2e 20 20 54 68 65 20 6e 65  ubquery.  The ne
239f0 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  xt.    ** block 
23a00 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65 78 70  of code will exp
23a10 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
23a20 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
23a30 74 6f 20 34 20 73 6c 6f 74 73 2e 0a 20 20 20 20  to 4 slots..    
23a40 2a 2a 20 54 68 65 20 6d 69 64 64 6c 65 20 73 6c  ** The middle sl
23a50 6f 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74  ot is expanded t
23a60 6f 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f  o two slots in o
23a70 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61  rder to make spa
23a80 63 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  ce.    ** for th
23a90 65 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69  e two elements i
23aa0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
23ab0 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
23ac0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
23ad0 28 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20  ( nSubSrc>1 ){. 
23ae0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53       pParent->pS
23af0 72 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69  rc = pSrc = sqli
23b00 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
23b10 65 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62  e(db, pSrc, nSub
23b20 53 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a  Src-1,iFrom+1);.
23b30 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
23b40 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
23b50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
23b60 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
23b70 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20  /* Transfer the 
23b80 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
23b90 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75  s from the subqu
23ba0 65 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ery into the.   
23bb0 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e   ** outer query.
23bc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
23bd0 69 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20  i=0; i<nSubSrc; 
23be0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
23bf0 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
23c00 64 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46  db, pSrc->a[i+iF
23c10 72 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20  rom].pUsing);.  
23c20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
23c30 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 66 67 2e  ->a[i+iFrom].fg.
23c40 69 73 54 61 62 46 75 6e 63 3d 3d 30 20 29 3b 0a  isTabFunc==0 );.
23c50 20 20 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b        pSrc->a[i+
23c60 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63  iFrom] = pSubSrc
23c70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 4e  ->a[i];.      iN
23c80 65 77 50 61 72 65 6e 74 20 3d 20 70 53 75 62 53  ewParent = pSubS
23c90 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
23ca0 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
23cb0 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30  pSubSrc->a[i], 0
23cc0 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63  , sizeof(pSubSrc
23cd0 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a  ->a[i]));.    }.
23ce0 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f      pSrc->a[iFro
23cf0 6d 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d  m].fg.jointype =
23d00 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20   jointype;.  .  
23d10 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73    /* Now begin s
23d20 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71  ubstituting subq
23d30 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20  uery result set 
23d40 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20  expressions for 
23d50 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
23d60 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
23d70 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
23d80 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  uery..    ** .  
23d90 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
23da0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
23db0 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46  LECT a+5, b*10 F
23dc0 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20  ROM (SELECT x*3 
23dd0 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20  AS a, y+10 AS b 
23de0 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61  FROM t1) WHERE a
23df0 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20  >b;.    **   \  
23e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e10 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
23e20 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
23e30 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
23e40 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f  /.    **    \___
23e50 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23e60 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
23e70 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23e80 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20  _____________/. 
23e90 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20     **.    ** We 
23ea0 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
23eb0 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
23ec0 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
23ed0 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
23ee0 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65  ee.    ** "a" we
23ef0 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33   substitute "x*3
23f00 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  " and every plac
23f10 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20  e we see "b" we 
23f20 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30  substitute "y+10
23f30 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  "..    */.    if
23f40 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
23f50 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 74 20   ){.      /* At 
23f60 74 68 69 73 20 70 6f 69 6e 74 2c 20 61 6e 79 20  this point, any 
23f70 6e 6f 6e 2d 7a 65 72 6f 20 69 4f 72 64 65 72 42  non-zero iOrderB
23f80 79 43 6f 6c 20 76 61 6c 75 65 73 20 69 6e 64 69  yCol values indi
23f90 63 61 74 65 20 74 68 61 74 20 74 68 65 0a 20 20  cate that the.  
23fa0 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
23fb0 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
23fc0 6e 20 69 73 20 69 64 65 6e 74 69 63 61 6c 20 74  n is identical t
23fd0 6f 20 74 68 65 20 69 4f 72 64 65 72 42 79 43 6f  o the iOrderByCo
23fe0 6c 27 74 68 0a 20 20 20 20 20 20 2a 2a 20 65 78  l'th.      ** ex
23ff0 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65  pression returne
24000 64 20 62 79 20 53 45 4c 45 43 54 20 73 74 61 74  d by SELECT stat
24010 65 6d 65 6e 74 20 70 53 75 62 2e 20 53 69 6e 63  ement pSub. Sinc
24020 65 20 74 68 65 73 65 20 76 61 6c 75 65 73 0a 20  e these values. 
24030 20 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 6e       ** do not n
24040 65 63 65 73 73 61 72 69 6c 79 20 63 6f 72 72 65  ecessarily corre
24050 73 70 6f 6e 64 20 74 6f 20 63 6f 6c 75 6d 6e 73  spond to columns
24060 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65   in SELECT state
24070 6d 65 6e 74 20 70 50 61 72 65 6e 74 2c 0a 20 20  ment pParent,.  
24080 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 6d      ** zero them
24090 20 62 65 66 6f 72 65 20 74 72 61 6e 73 66 65 72   before transfer
240a0 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
240b0 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 20 20 2a   clause..      *
240c0 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 20 64  *.      ** Not d
240d0 6f 69 6e 67 20 74 68 69 73 20 6d 61 79 20 63 61  oing this may ca
240e0 75 73 65 20 61 6e 20 65 72 72 6f 72 20 69 66 20  use an error if 
240f0 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  a subsequent cal
24100 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20 20  l to this.      
24110 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  ** function atte
24120 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20  mpts to flatten 
24130 61 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71  a compound sub-q
24140 75 65 72 79 20 69 6e 74 6f 20 70 50 61 72 65 6e  uery into pParen
24150 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20  t.      ** (the 
24160 6f 6e 6c 79 20 77 61 79 20 74 68 69 73 20 63 61  only way this ca
24170 6e 20 68 61 70 70 65 6e 20 69 73 20 69 66 20 74  n happen is if t
24180 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d  he compound sub-
24190 71 75 65 72 79 20 69 73 0a 20 20 20 20 20 20 2a  query is.      *
241a0 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 61 72 74  * currently part
241b0 20 6f 66 20 70 53 75 62 2d 3e 70 53 72 63 29 2e   of pSub->pSrc).
241c0 20 53 65 65 20 74 69 63 6b 65 74 20 5b 64 31 31   See ticket [d11
241d0 61 36 65 39 30 38 66 5d 2e 20 20 2a 2f 0a 20 20  a6e908f].  */.  
241e0 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f      ExprList *pO
241f0 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70  rderBy = pSub->p
24200 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 66  OrderBy;.      f
24210 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
24220 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
24230 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
24240 79 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  y->a[i].u.x.iOrd
24250 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  erByCol = 0;.   
24260 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
24270 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  t( pParent->pOrd
24280 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
24290 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
242a0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
242b0 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65       pSub->pOrde
242c0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  rBy = 0;.    }. 
242d0 20 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69     pWhere = sqli
242e0 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
242f0 53 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b  Sub->pWhere, 0);
24300 0a 20 20 20 20 69 66 28 20 69 73 4c 65 66 74 4a  .    if( isLeftJ
24310 6f 69 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  oin>0 ){.      s
24320 65 74 4a 6f 69 6e 45 78 70 72 28 70 57 68 65 72  etJoinExpr(pWher
24330 65 2c 20 69 4e 65 77 50 61 72 65 6e 74 29 3b 0a  e, iNewParent);.
24340 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 65 6e      }.    pParen
24350 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  t->pWhere = sqli
24360 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
24370 57 68 65 72 65 2c 20 70 50 61 72 65 6e 74 2d 3e  Where, pParent->
24380 70 57 68 65 72 65 29 3b 0a 20 20 20 20 69 66 28  pWhere);.    if(
24390 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
243a0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 75  d==0 ){.      Su
243b0 62 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a 20 20  bstContext x;.  
243c0 20 20 20 20 78 2e 70 50 61 72 73 65 20 3d 20 70      x.pParse = p
243d0 50 61 72 73 65 3b 0a 20 20 20 20 20 20 78 2e 69  Parse;.      x.i
243e0 54 61 62 6c 65 20 3d 20 69 50 61 72 65 6e 74 3b  Table = iParent;
243f0 0a 20 20 20 20 20 20 78 2e 69 4e 65 77 54 61 62  .      x.iNewTab
24400 6c 65 20 3d 20 69 4e 65 77 50 61 72 65 6e 74 3b  le = iNewParent;
24410 0a 20 20 20 20 20 20 78 2e 69 73 4c 65 66 74 4a  .      x.isLeftJ
24420 6f 69 6e 20 3d 20 69 73 4c 65 66 74 4a 6f 69 6e  oin = isLeftJoin
24430 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c 69 73 74  ;.      x.pEList
24440 20 3d 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 3b   = pSub->pEList;
24450 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
24460 63 74 28 26 78 2c 20 70 50 61 72 65 6e 74 2c 20  ct(&x, pParent, 
24470 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  0);.    }.  .   
24480 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65   /* The flattene
24490 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  d query is disti
244a0 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68  nct if either th
244b0 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20  e inner or the. 
244c0 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
244d0 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a  y is distinct. .
244e0 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65      */.    pPare
244f0 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  nt->selFlags |= 
24500 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
24510 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20   SF_Distinct;.  
24520 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
24530 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28  ELECT ... FROM (
24540 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54  SELECT ... LIMIT
24550 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d   a OFFSET b) LIM
24560 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20  IT x OFFSET y;. 
24570 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65     **.    ** One
24580 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74   is tempted to t
24590 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20  ry to add a and 
245a0 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65  b to combine the
245b0 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68   limits.  But th
245c0 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e  is.    ** does n
245d0 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65  ot work if eithe
245e0 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74  r limit is negat
245f0 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ive..    */.    
24600 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
24610 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
24620 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62  t->pLimit = pSub
24630 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
24640 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pSub->pLimit = 0
24650 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
24660 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65  * Finially, dele
24670 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20  te what is left 
24680 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
24690 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  and return.  ** 
246a0 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  success..  */.  
246b0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
246c0 65 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a  ete(db, pSub1);.
246d0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
246e0 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
246f0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
24700 65 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20  e & 0x100 ){.   
24710 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
24720 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
24730 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 3a 5c  ter flattening:\
24740 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
24750 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
24760 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
24770 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 31  ndif..  return 1
24780 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
24790 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
247a0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
247b0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
247c0 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 0a  OMIT_VIEW) */...
247d0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
247e0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
247f0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
24800 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
24810 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 63 6f 70  )./*.** Make cop
24820 69 65 73 20 6f 66 20 72 65 6c 65 76 61 6e 74 20  ies of relevant 
24830 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
24840 6d 73 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  ms of the outer 
24850 71 75 65 72 79 20 69 6e 74 6f 0a 2a 2a 20 74 68  query into.** th
24860 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
24870 66 20 73 75 62 71 75 65 72 79 2e 20 20 45 78 61  f subquery.  Exa
24880 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  mple:.**.**    S
24890 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45  ELECT * FROM (SE
248a0 4c 45 43 54 20 61 20 41 53 20 78 2c 20 63 2d 64  LECT a AS x, c-d
248b0 20 41 53 20 79 20 46 52 4f 4d 20 74 31 29 20 57   AS y FROM t1) W
248c0 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d 31  HERE x=5 AND y=1
248d0 30 3b 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 6f  0;.**.** Transfo
248e0 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a  rmed into:.**.**
248f0 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
24900 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20 78  M (SELECT a AS x
24910 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20  , c-d AS y FROM 
24920 74 31 20 57 48 45 52 45 20 61 3d 35 20 41 4e 44  t1 WHERE a=5 AND
24930 20 63 2d 64 3d 31 30 29 0a 2a 2a 20 20 20 20 20   c-d=10).**     
24940 57 48 45 52 45 20 78 3d 35 20 41 4e 44 20 79 3d  WHERE x=5 AND y=
24950 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 68 6f  10;.**.** The ho
24960 70 65 20 69 73 20 74 68 61 74 20 74 68 65 20 74  pe is that the t
24970 65 72 6d 73 20 61 64 64 65 64 20 74 6f 20 74 68  erms added to th
24980 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 77 69  e inner query wi
24990 6c 6c 20 6d 61 6b 65 20 69 74 20 6d 6f 72 65 0a  ll make it more.
249a0 2a 2a 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  ** efficient..**
249b0 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d  .** Do not attem
249c0 70 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  pt this optimiza
249d0 74 69 6f 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  tion if:.**.**  
249e0 20 28 31 29 20 28 2a 2a 20 54 68 69 73 20 72 65   (1) (** This re
249f0 73 74 72 69 63 74 69 6f 6e 20 77 61 73 20 72 65  striction was re
24a00 6d 6f 76 65 64 20 6f 6e 20 32 30 31 37 2d 30 39  moved on 2017-09
24a10 2d 32 39 2e 20 20 57 65 20 75 73 65 64 20 74 6f  -29.  We used to
24a20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64 69  .**           di
24a30 73 61 6c 6c 6f 77 20 74 68 69 73 20 6f 70 74 69  sallow this opti
24a40 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 61 67 67  mization for agg
24a50 72 65 67 61 74 65 20 73 75 62 71 75 65 72 69 65  regate subquerie
24a60 73 2c 20 62 75 74 20 6e 6f 77 0a 2a 2a 20 20 20  s, but now.**   
24a70 20 20 20 20 20 20 20 20 69 74 20 69 73 20 61 6c          it is al
24a80 6c 6f 77 65 64 20 62 79 20 70 75 74 74 69 6e 67  lowed by putting
24a90 20 74 68 65 20 65 78 74 72 61 20 74 65 72 6d 73   the extra terms
24aa0 20 6f 6e 20 74 68 65 20 48 41 56 49 4e 47 20 63   on the HAVING c
24ab0 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  lause..**       
24ac0 20 20 20 20 54 68 65 20 61 64 64 65 64 20 48 41      The added HA
24ad0 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70  VING clause is p
24ae0 6f 69 6e 74 6c 65 73 73 20 69 66 20 74 68 65 20  ointless if the 
24af0 73 75 62 71 75 65 72 79 20 6c 61 63 6b 73 0a 2a  subquery lacks.*
24b00 2a 20 20 20 20 20 20 20 20 20 20 20 61 20 47 52  *           a GR
24b10 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
24b20 42 75 74 20 73 75 63 68 20 61 20 48 41 56 49 4e  But such a HAVIN
24b30 47 20 63 6c 61 75 73 65 20 69 73 20 61 6c 73 6f  G clause is also
24b40 20 68 61 72 6d 6c 65 73 73 0a 2a 2a 20 20 20 20   harmless.**    
24b50 20 20 20 20 20 20 20 73 6f 20 74 68 65 72 65 20         so there 
24b60 64 6f 65 73 20 6e 6f 74 20 61 70 70 65 61 72 20  does not appear 
24b70 74 6f 20 62 65 20 61 6e 79 20 72 65 61 73 6f 6e  to be any reason
24b80 20 74 6f 20 61 64 64 20 65 78 74 72 61 20 6c 6f   to add extra lo
24b90 67 69 63 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  gic.**          
24ba0 20 74 6f 20 73 75 70 70 72 65 73 73 20 69 74 2e   to suppress it.
24bb0 20 2a 2a 29 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29   **).**.**   (2)
24bc0 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
24bd0 20 69 73 20 74 68 65 20 72 65 63 75 72 73 69 76   is the recursiv
24be0 65 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 6d  e part of a comm
24bf0 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73 73  on table express
24c00 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29  ion..**.**   (3)
24c10 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79   The inner query
24c20 20 68 61 73 20 61 20 4c 49 4d 49 54 20 63 6c 61   has a LIMIT cla
24c30 75 73 65 20 28 73 69 6e 63 65 20 74 68 65 20 63  use (since the c
24c40 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 57 48  hanges to the WH
24c50 45 52 45 0a 2a 2a 20 20 20 20 20 20 20 63 6c 6f  ERE.**       clo
24c60 73 65 20 77 6f 75 6c 64 20 63 68 61 6e 67 65 20  se would change 
24c70 74 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  the meaning of t
24c80 68 65 20 4c 49 4d 49 54 29 2e 0a 2a 2a 0a 2a 2a  he LIMIT)..**.**
24c90 20 20 20 28 34 29 20 54 68 65 20 69 6e 6e 65 72     (4) The inner
24ca0 20 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69   query is the ri
24cb0 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
24cc0 20 4c 45 46 54 20 4a 4f 49 4e 20 61 6e 64 20 74   LEFT JOIN and t
24cd0 68 65 0a 2a 2a 20 20 20 20 20 20 20 65 78 70 72  he.**       expr
24ce0 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 70 75 73  ession to be pus
24cf0 68 65 64 20 64 6f 77 6e 20 64 6f 65 73 20 6e 6f  hed down does no
24d00 74 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20  t come from the 
24d10 4f 4e 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20  ON clause.**    
24d20 20 20 20 6f 6e 20 74 68 61 74 20 4c 45 46 54 20     on that LEFT 
24d30 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 35  JOIN..**.**   (5
24d40 29 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  ) The WHERE clau
24d50 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  se expression or
24d60 69 67 69 6e 61 74 65 73 20 69 6e 20 74 68 65 20  iginates in the 
24d70 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
24d80 73 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 61  se.**       of a
24d90 20 4c 45 46 54 20 4a 4f 49 4e 20 77 68 65 72 65   LEFT JOIN where
24da0 20 69 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20   iCursor is not 
24db0 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 74  the right-hand t
24dc0 61 62 6c 65 20 6f 66 20 74 68 61 74 0a 2a 2a 20  able of that.** 
24dd0 20 20 20 20 20 20 6c 65 66 74 20 6a 6f 69 6e 2e        left join.
24de0 20 20 41 6e 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a    An example:.**
24df0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 53 45  .**           SE
24e00 4c 45 43 54 20 2a 0a 2a 2a 20 20 20 20 20 20 20  LECT *.**       
24e10 20 20 20 20 46 52 4f 4d 20 28 53 45 4c 45 43 54      FROM (SELECT
24e20 20 31 20 41 53 20 61 31 20 55 4e 49 4f 4e 20 41   1 AS a1 UNION A
24e30 4c 4c 20 53 45 4c 45 43 54 20 32 29 20 41 53 20  LL SELECT 2) AS 
24e40 61 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  aa.**           
24e50 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 31 20 41  JOIN (SELECT 1 A
24e60 53 20 62 32 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  S b2 UNION ALL S
24e70 45 4c 45 43 54 20 32 29 20 41 53 20 62 62 20 4f  ELECT 2) AS bb O
24e80 4e 20 28 61 31 3d 62 32 29 0a 2a 2a 20 20 20 20  N (a1=b2).**    
24e90 20 20 20 20 20 20 20 4c 45 46 54 20 4a 4f 49 4e         LEFT JOIN
24ea0 20 28 53 45 4c 45 43 54 20 38 20 41 53 20 63 33   (SELECT 8 AS c3
24eb0 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
24ec0 54 20 39 29 20 41 53 20 63 63 20 4f 4e 20 28 62  T 9) AS cc ON (b
24ed0 32 3d 32 29 3b 0a 2a 2a 0a 2a 2a 20 20 20 20 20  2=2);.**.**     
24ee0 20 20 54 68 65 20 63 6f 72 72 65 63 74 20 61 6e    The correct an
24ef0 73 77 65 72 20 69 73 20 74 68 72 65 65 20 72 6f  swer is three ro
24f00 77 73 3a 20 20 28 31 2c 31 2c 4e 55 4c 4c 29 2c  ws:  (1,1,NULL),
24f10 28 32 2c 32 2c 38 29 2c 28 32 2c 32 2c 39 29 2e  (2,2,8),(2,2,9).
24f20 0a 2a 2a 20 20 20 20 20 20 20 42 75 74 20 69 66  .**       But if
24f30 20 74 68 65 20 28 62 32 3d 32 29 20 74 65 72 6d   the (b2=2) term
24f40 20 77 65 72 65 20 74 6f 20 62 65 20 70 75 73 68   were to be push
24f50 65 64 20 64 6f 77 6e 20 69 6e 74 6f 20 74 68 65  ed down into the
24f60 20 62 62 20 73 75 62 71 75 65 72 79 2c 0a 2a 2a   bb subquery,.**
24f70 20 20 20 20 20 20 20 74 68 65 6e 20 74 68 65 20         then the 
24f80 28 31 2c 31 2c 4e 55 4c 4c 29 20 72 6f 77 20 77  (1,1,NULL) row w
24f90 6f 75 6c 64 20 62 65 20 73 75 70 70 72 65 73 73  ould be suppress
24fa0 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
24fb0 20 30 20 69 66 20 6e 6f 20 63 68 61 6e 67 65 73   0 if no changes
24fc0 20 61 72 65 20 6d 61 64 65 20 61 6e 64 20 6e 6f   are made and no
24fd0 6e 2d 7a 65 72 6f 20 69 66 20 6f 6e 65 20 6f 72  n-zero if one or
24fe0 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75   more WHERE clau
24ff0 73 65 0a 2a 2a 20 74 65 72 6d 73 20 61 72 65 20  se.** terms are 
25000 64 75 70 6c 69 63 61 74 65 64 20 69 6e 74 6f 20  duplicated into 
25010 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f  the subquery..*/
25020 0a 73 74 61 74 69 63 20 69 6e 74 20 70 75 73 68  .static int push
25030 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73 28 0a  DownWhereTerms(.
25040 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
25050 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
25060 20 63 6f 6e 74 65 78 74 20 28 66 6f 72 20 6d 61   context (for ma
25070 6c 6c 6f 63 28 29 20 61 6e 64 20 65 72 72 6f 72  lloc() and error
25080 20 72 65 70 6f 72 74 69 6e 67 29 20 2a 2f 0a 20   reporting) */. 
25090 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 2c 20   Select *pSubq, 
250a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
250b0 62 71 75 65 72 79 20 77 68 6f 73 65 20 57 48 45  bquery whose WHE
250c0 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 6f 20  RE clause is to 
250d0 62 65 20 61 75 67 6d 65 6e 74 65 64 20 2a 2f 0a  be augmented */.
250e0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
250f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
25100 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
25110 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
25120 2f 0a 20 20 69 6e 74 20 69 43 75 72 73 6f 72 2c  /.  int iCursor,
25130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
25140 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
25150 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
25160 69 6e 74 20 69 73 4c 65 66 74 4a 6f 69 6e 20 20  int isLeftJoin  
25170 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
25180 20 70 53 75 62 71 20 69 73 20 74 68 65 20 72 69   pSubq is the ri
25190 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c 45  ght term of a LE
251a0 46 54 20 4a 4f 49 4e 20 2a 2f 0a 29 7b 0a 20 20  FT JOIN */.){.  
251b0 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Expr *pNew;.  in
251c0 74 20 6e 43 68 6e 67 20 3d 20 30 3b 0a 20 20 69  t nChng = 0;.  i
251d0 66 28 20 70 57 68 65 72 65 3d 3d 30 20 29 20 72  f( pWhere==0 ) r
251e0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
251f0 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Subq->selFlags &
25200 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 20   SF_Recursive ) 
25210 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 72 65  return 0;  /* re
25220 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 2a 2f  striction (2) */
25230 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
25240 44 45 42 55 47 0a 20 20 2f 2a 20 4f 6e 6c 79 20  DEBUG.  /* Only 
25250 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f  the first term o
25260 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 63 61 6e  f a compound can
25270 20 68 61 76 65 20 61 20 57 49 54 48 20 63 6c 61   have a WITH cla
25280 75 73 65 2e 20 20 42 75 74 20 6d 61 6b 65 0a 20  use.  But make. 
25290 20 2a 2a 20 73 75 72 65 20 6e 6f 20 6f 74 68 65   ** sure no othe
252a0 72 20 74 65 72 6d 73 20 61 72 65 20 6d 61 72 6b  r terms are mark
252b0 65 64 20 53 46 5f 52 65 63 75 72 73 69 76 65 20  ed SF_Recursive 
252c0 69 6e 20 63 61 73 65 20 73 6f 6d 65 74 68 69 6e  in case somethin
252d0 67 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 69  g changes.  ** i
252e0 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a 20 20  n the future..  
252f0 2a 2f 0a 20 20 7b 0a 20 20 20 20 53 65 6c 65 63  */.  {.    Selec
25300 74 20 2a 70 58 3b 20 20 0a 20 20 20 20 66 6f 72  t *pX;  .    for
25310 28 70 58 3d 70 53 75 62 71 3b 20 70 58 3b 20 70  (pX=pSubq; pX; p
25320 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  X=pX->pPrior){. 
25330 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58       assert( (pX
25340 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
25350 5f 52 65 63 75 72 73 69 76 65 29 29 3d 3d 30 20  _Recursive))==0 
25360 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
25370 64 69 66 0a 0a 20 20 69 66 28 20 70 53 75 62 71  dif..  if( pSubq
25380 2d 3e 70 4c 69 6d 69 74 21 3d 30 20 29 7b 0a 20  ->pLimit!=0 ){. 
25390 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20     return 0; /* 
253a0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 20  restriction (3) 
253b0 2a 2f 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  */.  }.  while( 
253c0 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f 41  pWhere->op==TK_A
253d0 4e 44 20 29 7b 0a 20 20 20 20 6e 43 68 6e 67 20  ND ){.    nChng 
253e0 2b 3d 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65  += pushDownWhere
253f0 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70 53  Terms(pParse, pS
25400 75 62 71 2c 20 70 57 68 65 72 65 2d 3e 70 52 69  ubq, pWhere->pRi
25410 67 68 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ght,.           
25420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25430 20 20 20 20 20 69 43 75 72 73 6f 72 2c 20 69 73       iCursor, is
25440 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 70  LeftJoin);.    p
25450 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d 3e  Where = pWhere->
25460 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pLeft;.  }.  if(
25470 20 69 73 4c 65 66 74 4a 6f 69 6e 0a 20 20 20 26   isLeftJoin.   &
25480 26 20 28 45 78 70 72 48 61 73 50 72 6f 70 65 72  & (ExprHasProper
25490 74 79 28 70 57 68 65 72 65 2c 45 50 5f 46 72 6f  ty(pWhere,EP_Fro
254a0 6d 4a 6f 69 6e 29 3d 3d 30 0a 20 20 20 20 20 20  mJoin)==0.      
254b0 20 20 20 7c 7c 20 70 57 68 65 72 65 2d 3e 69 52     || pWhere->iR
254c0 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 69  ightJoinTable!=i
254d0 43 75 72 73 6f 72 29 0a 20 20 29 7b 0a 20 20 20  Cursor).  ){.   
254e0 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65   return 0; /* re
254f0 73 74 72 69 63 74 69 6f 6e 20 28 34 29 20 2a 2f  striction (4) */
25500 0a 20 20 7d 0a 20 20 69 66 28 20 45 78 70 72 48  .  }.  if( ExprH
25510 61 73 50 72 6f 70 65 72 74 79 28 70 57 68 65 72  asProperty(pWher
25520 65 2c 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 26  e,EP_FromJoin) &
25530 26 20 70 57 68 65 72 65 2d 3e 69 52 69 67 68 74  & pWhere->iRight
25540 4a 6f 69 6e 54 61 62 6c 65 21 3d 69 43 75 72 73  JoinTable!=iCurs
25550 6f 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  or ){.    return
25560 20 30 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69   0; /* restricti
25570 6f 6e 20 28 35 29 20 2a 2f 0a 20 20 7d 0a 20 20  on (5) */.  }.  
25580 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
25590 73 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70  sTableConstant(p
255a0 57 68 65 72 65 2c 20 69 43 75 72 73 6f 72 29 20  Where, iCursor) 
255b0 29 7b 0a 20 20 20 20 6e 43 68 6e 67 2b 2b 3b 0a  ){.    nChng++;.
255c0 20 20 20 20 77 68 69 6c 65 28 20 70 53 75 62 71      while( pSubq
255d0 20 29 7b 0a 20 20 20 20 20 20 53 75 62 73 74 43   ){.      SubstC
255e0 6f 6e 74 65 78 74 20 78 3b 0a 20 20 20 20 20 20  ontext x;.      
255f0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
25600 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  prDup(pParse->db
25610 2c 20 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  , pWhere, 0);.  
25620 20 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70      unsetJoinExp
25630 72 28 70 4e 65 77 2c 20 2d 31 29 3b 0a 20 20 20  r(pNew, -1);.   
25640 20 20 20 78 2e 70 50 61 72 73 65 20 3d 20 70 50     x.pParse = pP
25650 61 72 73 65 3b 0a 20 20 20 20 20 20 78 2e 69 54  arse;.      x.iT
25660 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a  able = iCursor;.
25670 20 20 20 20 20 20 78 2e 69 4e 65 77 54 61 62 6c        x.iNewTabl
25680 65 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 20  e = iCursor;.   
25690 20 20 20 78 2e 69 73 4c 65 66 74 4a 6f 69 6e 20     x.isLeftJoin 
256a0 3d 20 30 3b 0a 20 20 20 20 20 20 78 2e 70 45 4c  = 0;.      x.pEL
256b0 69 73 74 20 3d 20 70 53 75 62 71 2d 3e 70 45 4c  ist = pSubq->pEL
256c0 69 73 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 20  ist;.      pNew 
256d0 3d 20 73 75 62 73 74 45 78 70 72 28 26 78 2c 20  = substExpr(&x, 
256e0 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28  pNew);.      if(
256f0 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c 61 67 73   pSubq->selFlags
25700 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20   & SF_Aggregate 
25710 29 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 71  ){.        pSubq
25720 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
25730 74 65 33 45 78 70 72 41 6e 64 28 70 50 61 72 73  te3ExprAnd(pPars
25740 65 2d 3e 64 62 2c 20 70 53 75 62 71 2d 3e 70 48  e->db, pSubq->pH
25750 61 76 69 6e 67 2c 20 70 4e 65 77 29 3b 0a 20 20  aving, pNew);.  
25760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25770 20 20 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65     pSubq->pWhere
25780 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
25790 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53  d(pParse->db, pS
257a0 75 62 71 2d 3e 70 57 68 65 72 65 2c 20 70 4e 65  ubq->pWhere, pNe
257b0 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
257c0 20 20 70 53 75 62 71 20 3d 20 70 53 75 62 71 2d    pSubq = pSubq-
257d0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20  >pPrior;.    }. 
257e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 6e   }.  return nChn
257f0 67 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  g;.}.#endif /* !
25800 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
25810 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
25820 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
25830 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a  _OMIT_VIEW) */..
25840 2f 2a 0a 2a 2a 20 54 68 65 20 70 46 75 6e 63 20  /*.** The pFunc 
25850 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 67 67 72  is the only aggr
25860 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69  egate function i
25870 6e 20 74 68 65 20 71 75 65 72 79 2e 20 20 43 68  n the query.  Ch
25880 65 63 6b 20 74 6f 20 73 65 65 0a 2a 2a 20 69 66  eck to see.** if
25890 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20   the query is a 
258a0 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74 68  candidate for th
258b0 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d 69  e min/max optimi
258c0 7a 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  zation. .**.** I
258d0 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61  f the query is a
258e0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74   candidate for t
258f0 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d  he min/max optim
25900 69 7a 61 74 69 6f 6e 2c 20 74 68 65 6e 20 73 65  ization, then se
25910 74 0a 2a 2a 20 2a 70 70 4d 69 6e 4d 61 78 20 74  t.** *ppMinMax t
25920 6f 20 62 65 20 61 6e 20 4f 52 44 45 52 20 42 59  o be an ORDER BY
25930 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 75 73   clause to be us
25940 65 64 20 66 6f 72 20 74 68 65 20 6f 70 74 69 6d  ed for the optim
25950 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72  ization.** and r
25960 65 74 75 72 6e 20 65 69 74 68 65 72 20 57 48 45  eturn either WHE
25970 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f  RE_ORDERBY_MIN o
25980 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  r WHERE_ORDERBY_
25990 4d 41 58 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  MAX depending on
259a0 0a 2a 2a 20 77 68 65 74 68 65 72 20 70 46 75 6e  .** whether pFun
259b0 63 20 69 73 20 61 20 6d 69 6e 28 29 20 6f 72 20  c is a min() or 
259c0 6d 61 78 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  max() function..
259d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65  **.** If the que
259e0 72 79 20 69 73 20 6e 6f 74 20 61 20 63 61 6e 64  ry is not a cand
259f0 69 64 61 74 65 20 66 6f 72 20 74 68 65 20 6d 69  idate for the mi
25a00 6e 2f 6d 61 78 20 6f 70 74 69 6d 69 7a 61 74 69  n/max optimizati
25a10 6f 6e 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 57 48  on, return.** WH
25a20 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
25a30 41 4c 20 28 77 68 69 63 68 20 6d 75 73 74 20 62  AL (which must b
25a40 65 20 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 54  e zero)..**.** T
25a50 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
25a60 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
25a70 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
25a80 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 0a 2a  ions have been.*
25a90 2a 20 6c 6f 63 61 74 65 64 20 62 75 74 20 62 65  * located but be
25aa0 66 6f 72 65 20 74 68 65 69 72 20 61 72 67 75 6d  fore their argum
25ab0 65 6e 74 73 20 68 61 76 65 20 62 65 65 6e 20 73  ents have been s
25ac0 75 62 6a 65 63 74 65 64 20 74 6f 20 61 67 67 72  ubjected to aggr
25ad0 65 67 61 74 65 0a 2a 2a 20 61 6e 61 6c 79 73 69  egate.** analysi
25ae0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  s..*/.static u8 
25af0 6d 69 6e 4d 61 78 51 75 65 72 79 28 73 71 6c 69  minMaxQuery(sqli
25b00 74 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70  te3 *db, Expr *p
25b10 46 75 6e 63 2c 20 45 78 70 72 4c 69 73 74 20 2a  Func, ExprList *
25b20 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e  *ppMinMax){.  in
25b30 74 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f  t eRet = WHERE_O
25b40 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20  RDERBY_NORMAL;  
25b50 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
25b60 6c 75 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  lue */.  ExprLis
25b70 74 20 2a 70 45 4c 69 73 74 20 3d 20 70 46 75 6e  t *pEList = pFun
25b80 63 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f  c->x.pList;    /
25b90 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61  * Arguments to a
25ba0 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  gg function */. 
25bb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
25bc0 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
25bd0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
25be0 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  f aggregate func
25bf0 74 69 6f 6e 20 70 46 75 6e 63 20 2a 2f 0a 20 20  tion pFunc */.  
25c00 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
25c10 42 79 3b 0a 20 20 75 38 20 73 6f 72 74 4f 72 64  By;.  u8 sortOrd
25c20 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a  er;..  assert( *
25c30 70 70 4d 69 6e 4d 61 78 3d 3d 30 20 29 3b 0a 20  ppMinMax==0 );. 
25c40 20 61 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e   assert( pFunc->
25c50 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54  op==TK_AGG_FUNCT
25c60 49 4f 4e 20 29 3b 0a 20 20 69 66 28 20 70 45 4c  ION );.  if( pEL
25c70 69 73 74 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74  ist==0 || pEList
25c80 2d 3e 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74  ->nExpr!=1 ) ret
25c90 75 72 6e 20 65 52 65 74 3b 0a 20 20 7a 46 75 6e  urn eRet;.  zFun
25ca0 63 20 3d 20 70 46 75 6e 63 2d 3e 75 2e 7a 54 6f  c = pFunc->u.zTo
25cb0 6b 65 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ken;.  if( sqlit
25cc0 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c  e3StrICmp(zFunc,
25cd0 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20   "min")==0 ){.  
25ce0 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f    eRet = WHERE_O
25cf0 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20  RDERBY_MIN;.    
25d00 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c 49  sortOrder = SQLI
25d10 54 45 5f 53 4f 5f 41 53 43 3b 0a 20 20 7d 65 6c  TE_SO_ASC;.  }el
25d20 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
25d30 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61  rICmp(zFunc, "ma
25d40 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 65 52  x")==0 ){.    eR
25d50 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
25d60 42 59 5f 4d 41 58 3b 0a 20 20 20 20 73 6f 72 74  BY_MAX;.    sort
25d70 4f 72 64 65 72 20 3d 20 53 51 4c 49 54 45 5f 53  Order = SQLITE_S
25d80 4f 5f 44 45 53 43 3b 0a 20 20 7d 65 6c 73 65 7b  O_DESC;.  }else{
25d90 0a 20 20 20 20 72 65 74 75 72 6e 20 65 52 65 74  .    return eRet
25da0 3b 0a 20 20 7d 0a 20 20 2a 70 70 4d 69 6e 4d 61  ;.  }.  *ppMinMa
25db0 78 20 3d 20 70 4f 72 64 65 72 42 79 20 3d 20 73  x = pOrderBy = s
25dc0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
25dd0 70 28 64 62 2c 20 70 45 4c 69 73 74 2c 20 30 29  p(db, pEList, 0)
25de0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
25df0 65 72 42 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  erBy!=0 || db->m
25e00 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
25e10 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
25e20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73  pOrderBy->a[0].s
25e30 6f 72 74 4f 72 64 65 72 20 3d 20 73 6f 72 74 4f  ortOrder = sortO
25e40 72 64 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 65  rder;.  return e
25e50 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Ret;.}../*.** Th
25e60 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  e select stateme
25e70 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  nt passed as the
25e80 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
25e90 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
25ea0 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65  query..** The se
25eb0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
25ec0 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
25ed0 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f  aggregate-info o
25ee0 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20  bject. This .** 
25ef0 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69  function tests i
25f00 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  f the SELECT is 
25f10 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
25f20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
25f30 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
25f40 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c  **.** where tabl
25f50 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  e is a database 
25f60 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62  table, not a sub
25f70 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
25f80 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a   If the query.**
25f90 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73   does match this
25fa0 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61   pattern, then a
25fb0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
25fc0 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70  Table object rep
25fd0 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62  resenting.** <tb
25fe0 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  l> is returned. 
25ff0 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20  Otherwise, 0 is 
26000 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
26010 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d  tic Table *isSim
26020 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20  pleCount(Select 
26030 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  *p, AggInfo *pAg
26040 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20  gInfo){.  Table 
26050 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70  *pTab;.  Expr *p
26060 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Expr;..  assert(
26070 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b   !p->pGroupBy );
26080 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  ..  if( p->pWher
26090 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  e || p->pEList->
260a0 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20  nExpr!=1 .   || 
260b0 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  p->pSrc->nSrc!=1
260c0 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30   || p->pSrc->a[0
260d0 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20  ].pSelect.  ){. 
260e0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
260f0 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  .  pTab = p->pSr
26100 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
26110 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
26120 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
26130 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
26140 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20   !pTab->pSelect 
26150 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69  && pExpr );..  i
26160 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
26170 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  b) ) return 0;. 
26180 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
26190 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
261a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
261b0 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f  ( NEVER(pAggInfo
261c0 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65  ->nFunc==0) ) re
261d0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
261e0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
261f0 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ].pFunc->funcFla
26200 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  gs&SQLITE_FUNC_C
26210 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72  OUNT)==0 ) retur
26220 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
26230 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69  ->flags&EP_Disti
26240 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nct ) return 0;.
26250 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
26260 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
26270 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d  source-list item
26280 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
26290 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65  gument was augme
262a0 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20  nted with an.** 
262b0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
262c0 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c  e, then try to l
262d0 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66  ocate the specif
262e0 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ied index. If th
262f0 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20  ere.** was such 
26300 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  a clause and the
26310 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e   named index can
26320 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  not be found, re
26330 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
26340 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20  ERROR and leave 
26350 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
26360 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70  se. Otherwise, p
26370 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f  opulate .** pFro
26380 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65  m->pIndex and re
26390 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
263a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
263b0 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61  dexedByLookup(Pa
263c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
263d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
263e0 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
263f0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70  pFrom->pTab && p
26400 46 72 6f 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  From->fg.isIndex
26410 65 64 42 79 20 29 7b 0a 20 20 20 20 54 61 62 6c  edBy ){.    Tabl
26420 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
26430 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20  >pTab;.    char 
26440 2a 7a 49 6e 64 65 78 65 64 42 79 20 3d 20 70 46  *zIndexedBy = pF
26450 72 6f 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  rom->u1.zIndexed
26460 42 79 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  By;.    Index *p
26470 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
26480 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
26490 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 26 26  .        pIdx &&
264a0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
264b0 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e  pIdx->zName, zIn
264c0 64 65 78 65 64 42 79 29 3b 20 0a 20 20 20 20 20  dexedBy); .     
264d0 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e     pIdx=pIdx->pN
264e0 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ext.    );.    i
264f0 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20  f( !pIdx ){.    
26500 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
26510 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
26520 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a  ch index: %s", z
26530 49 6e 64 65 78 65 64 42 79 2c 20 30 29 3b 0a 20  IndexedBy, 0);. 
26540 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65       pParse->che
26550 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
26560 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26570 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
26580 20 20 20 70 46 72 6f 6d 2d 3e 70 49 42 49 6e 64     pFrom->pIBInd
26590 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20  ex = pIdx;.  }. 
265a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
265b0 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63  K;.}./*.** Detec
265c0 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  t compound SELEC
265d0 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  T statements tha
265e0 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42  t use an ORDER B
265f0 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a  Y clause with .*
26600 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  * an alternative
26610 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
26620 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  nce..**.**    SE
26630 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31  LECT ... FROM t1
26640 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e   EXCEPT SELECT .
26650 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52  .. FROM t2 ORDER
26660 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e   BY .. COLLATE .
26670 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ...**.** These a
26680 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73 20  re rewritten as 
26690 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a  a subquery:.**.*
266a0 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
266b0 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46  OM (SELECT ... F
266c0 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45  ROM t1 EXCEPT SE
266d0 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32  LECT ... FROM t2
266e0 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42  ).**     ORDER B
266f0 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e  Y ... COLLATE ..
26700 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  ..**.** This tra
26710 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e  nsformation is n
26720 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65  ecessary because
26730 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74   the multiSelect
26740 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e  OrderBy() routin
26750 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20  e.** above that 
26760 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f  generates the co
26770 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e  de for a compoun
26780 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e  d SELECT with an
26790 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
267a0 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65  .** uses a merge
267b0 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20   algorithm that 
267c0 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61 6d  requires the sam
267d0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
267e0 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72  ence on the.** r
267f0 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73  esult columns as
26800 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   on the ORDER BY
26810 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69   clause.  See ti
26820 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77  cket.** http://w
26830 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72  ww.sqlite.org/sr
26840 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32  c/info/6709574d2
26850 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61  a.**.** This tra
26860 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f  nsformation is o
26870 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45  nly needed for E
26880 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54  XCEPT, INTERSECT
26890 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20  , and UNION..** 
268a0 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
268b0 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e  erator works fin
268c0 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65  e with multiSele
268d0 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e  ctOrderBy() even
268e0 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61   when.** there a
268f0 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73  re COLLATE terms
26900 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
26910 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26920 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
26930 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28  electToSubquery(
26940 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
26950 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69   Select *p){.  i
26960 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a  nt i;.  Select *
26970 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a  pNew;.  Select *
26980 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  pX;.  sqlite3 *d
26990 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  b;.  struct Expr
269a0 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
269b0 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63  SrcList *pNewSrc
269c0 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
269d0 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79  e;.  Token dummy
269e0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  ;..  if( p->pPri
269f0 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  or==0 ) return W
26a00 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69  RC_Continue;.  i
26a10 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  f( p->pOrderBy==
26a20 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
26a30 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70  ontinue;.  for(p
26a40 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e  X=p; pX && (pX->
26a50 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58  op==TK_ALL || pX
26a60 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29  ->op==TK_SELECT)
26a70 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29  ; pX=pX->pPrior)
26a80 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29  {}.  if( pX==0 )
26a90 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
26aa0 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70  inue;.  a = p->p
26ab0 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f  OrderBy->a;.  fo
26ac0 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d  r(i=p->pOrderBy-
26ad0 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20  >nExpr-1; i>=0; 
26ae0 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b  i--){.    if( a[
26af0 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  i].pExpr->flags 
26b00 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62  & EP_Collate ) b
26b10 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
26b20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  i<0 ) return WRC
26b30 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a  _Continue;..  /*
26b40 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
26b50 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65  s point, that me
26b60 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72  ans the transfor
26b70 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  mation is requir
26b80 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ed. */..  pParse
26b90 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
26ba0 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
26bb0 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20  e->db;.  pNew = 
26bc0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
26bd0 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
26be0 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70  pNew) );.  if( p
26bf0 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
26c00 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d  WRC_Abort;.  mem
26c10 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73  set(&dummy, 0, s
26c20 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20  izeof(dummy));. 
26c30 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74   pNewSrc = sqlit
26c40 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
26c50 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30  romTerm(pParse,0
26c60 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77  ,0,0,&dummy,pNew
26c70 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65  ,0,0);.  if( pNe
26c80 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  wSrc==0 ) return
26c90 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70   WRC_Abort;.  *p
26ca0 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70  New = *p;.  p->p
26cb0 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20  Src = pNewSrc;. 
26cc0 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c   p->pEList = sql
26cd0 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
26ce0 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71  nd(pParse, 0, sq
26cf0 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
26d00 5f 41 53 54 45 52 49 53 4b 2c 20 30 29 29 3b 0a  _ASTERISK, 0));.
26d10 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c    p->op = TK_SEL
26d20 45 43 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65  ECT;.  p->pWhere
26d30 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47   = 0;.  pNew->pG
26d40 72 6f 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e  roupBy = 0;.  pN
26d50 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b  ew->pHaving = 0;
26d60 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42  .  pNew->pOrderB
26d70 79 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69  y = 0;.  p->pPri
26d80 6f 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 4e 65  or = 0;.  p->pNe
26d90 78 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 57 69  xt = 0;.  p->pWi
26da0 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 73 65 6c  th = 0;.  p->sel
26db0 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 43 6f 6d  Flags &= ~SF_Com
26dc0 70 6f 75 6e 64 3b 0a 20 20 61 73 73 65 72 74 28  pound;.  assert(
26dd0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
26de0 53 46 5f 43 6f 6e 76 65 72 74 65 64 29 3d 3d 30  SF_Converted)==0
26df0 20 29 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   );.  p->selFlag
26e00 73 20 7c 3d 20 53 46 5f 43 6f 6e 76 65 72 74 65  s |= SF_Converte
26e10 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  d;.  assert( pNe
26e20 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a  w->pPrior!=0 );.
26e30 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e    pNew->pPrior->
26e40 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
26e50 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pNew->pLimit = 0
26e60 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
26e70 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
26e80 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
26e90 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
26ea0 65 20 74 65 72 6d 20 70 46 72 6f 6d 20 68 61 73  e term pFrom has
26eb0 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75   table-valued fu
26ec0 6e 63 74 69 6f 6e 0a 2a 2a 20 61 72 67 75 6d 65  nction.** argume
26ed0 6e 74 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73  nts.  If it does
26ee0 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
26ef0 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
26f00 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  se and return.**
26f10 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 69 6e 63 65   non-zero, since
26f20 20 70 46 72 6f 6d 20 69 73 20 6e 6f 74 20 61 6c   pFrom is not al
26f30 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 20 74 61  lowed to be a ta
26f40 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63 74  ble-valued funct
26f50 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
26f60 6e 74 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63 74  nt cannotBeFunct
26f70 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
26f80 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  e, struct SrcLis
26f90 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a  t_item *pFrom){.
26fa0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 66 67 2e    if( pFrom->fg.
26fb0 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20 20  isTabFunc ){.   
26fc0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
26fd0 28 70 50 61 72 73 65 2c 20 22 27 25 73 27 20 69  (pParse, "'%s' i
26fe0 73 20 6e 6f 74 20 61 20 66 75 6e 63 74 69 6f 6e  s not a function
26ff0 22 2c 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 29  ", pFrom->zName)
27000 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
27010 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
27020 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
27030 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
27040 20 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20   Argument pWith 
27050 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55  (which may be NU
27060 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  LL) points to a 
27070 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e  linked list of n
27080 65 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63  ested .** WITH c
27090 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e  ontexts, from in
270a0 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74  ner to outermost
270b0 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69  . If the table i
270c0 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a  dentified by .**
270d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
270e0 6d 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65  ment pItem is re
270f0 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61  ally a common-ta
27100 62 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28  ble-expression (
27110 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65  CTE) .** then re
27120 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
27130 6f 20 74 68 65 20 43 54 45 20 64 65 66 69 6e 69  o the CTE defini
27140 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61  tion for that ta
27150 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a  ble. Otherwise.*
27160 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  * return NULL..*
27170 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55  *.** If a non-NU
27180 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74 75  LL value is retu
27190 72 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e  rned, set *ppCon
271a0 74 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f  text to point to
271b0 20 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a   the With.** obj
271c0 65 63 74 20 74 68 61 74 20 74 68 65 20 72 65 74  ect that the ret
271d0 75 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67  urned CTE belong
271e0 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  s to..*/.static 
271f0 73 74 72 75 63 74 20 43 74 65 20 2a 73 65 61 72  struct Cte *sear
27200 63 68 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a  chWith(.  With *
27210 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20 20  pWith,          
27220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
27230 72 65 6e 74 20 69 6e 6e 65 72 6d 6f 73 74 20 57  rent innermost W
27240 49 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ITH clause */.  
27250 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
27260 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20  tem *pItem,     
27270 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65  /* FROM clause e
27280 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76  lement to resolv
27290 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70  e */.  With **pp
272a0 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20  Context         
272b0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57         /* OUT: W
272c0 49 54 48 20 63 6c 61 75 73 65 20 72 65 74 75 72  ITH clause retur
272d0 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20  n value belongs 
272e0 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  to */.){.  const
272f0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
27300 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  if( pItem->zData
27310 62 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d  base==0 && (zNam
27320 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  e = pItem->zName
27330 29 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68  )!=0 ){.    With
27340 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *p;.    for(p=p
27350 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f  With; p; p=p->pO
27360 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74  uter){.      int
27370 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
27380 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b  0; i<p->nCte; i+
27390 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
273a0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
273b0 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e  Name, p->a[i].zN
273c0 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
273d0 20 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20       *ppContext 
273e0 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = p;.          r
273f0 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a  eturn &p->a[i];.
27400 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27410 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
27420 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68  turn 0;.}../* Th
27430 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
27440 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61   maintains a sta
27450 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49 54  ck of active WIT
27460 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74  H clauses.** wit
27470 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74  h the inner-most
27480 20 57 49 54 48 20 63 6c 61 75 73 65 20 62 65 69   WITH clause bei
27490 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66  ng at the top of
274a0 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
274b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70  * This routine p
274c0 75 73 68 65 73 20 74 68 65 20 57 49 54 48 20 63  ushes the WITH c
274d0 6c 61 75 73 65 20 70 61 73 73 65 64 20 61 73 20  lause passed as 
274e0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
274f0 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20  ent.** onto the 
27500 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
27510 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46  . If argument bF
27520 72 65 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ree is true, the
27530 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63  n this.** WITH c
27540 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72  lause will never
27550 20 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20   be popped from 
27560 74 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68  the stack. In th
27570 69 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68  is case it.** sh
27580 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c  ould be freed al
27590 6f 6e 67 20 77 69 74 68 20 74 68 65 20 50 61 72  ong with the Par
275a0 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74  se object. In ot
275b0 68 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a  her cases, when.
275c0 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65  ** bFree==0, the
275d0 20 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c   With object wil
275e0 6c 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67  l be freed along
275f0 20 77 69 74 68 20 74 68 65 20 53 45 4c 45 43 54   with the SELECT
27600 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77   .** statement w
27610 69 74 68 20 77 68 69 63 68 20 69 74 20 69 73 20  ith which it is 
27620 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76  associated..*/.v
27630 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 50  oid sqlite3WithP
27640 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73  ush(Parse *pPars
27650 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  e, With *pWith, 
27660 75 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73  u8 bFree){.  ass
27670 65 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c  ert( bFree==0 ||
27680 20 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d   (pParse->pWith=
27690 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 70 57  =0 && pParse->pW
276a0 69 74 68 54 6f 46 72 65 65 3d 3d 30 29 20 29 3b  ithToFree==0) );
276b0 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a  .  if( pWith ){.
276c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
276d0 73 65 2d 3e 70 57 69 74 68 21 3d 70 57 69 74 68  se->pWith!=pWith
276e0 20 29 3b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70   );.    pWith->p
276f0 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  Outer = pParse->
27700 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73  pWith;.    pPars
27710 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
27720 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65 65 20  ;.    if( bFree 
27730 29 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 54  ) pParse->pWithT
27740 6f 46 72 65 65 20 3d 20 70 57 69 74 68 3b 0a 20  oFree = pWith;. 
27750 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
27760 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
27770 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72   if argument pFr
27780 6f 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20 43  om refers to a C
27790 54 45 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a  TE declared by .
277a0 2a 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73 65  ** a WITH clause
277b0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75   on the stack cu
277c0 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e  rrently maintain
277d0 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
277e0 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72  . And,.** if cur
277f0 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e  rently processin
27800 67 20 61 20 43 54 45 20 65 78 70 72 65 73 73 69  g a CTE expressi
27810 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20 72  on, if it is a r
27820 65 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65  ecursive.** refe
27830 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72  rence to the cur
27840 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20  rent CTE..**.** 
27850 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69  If pFrom falls i
27860 6e 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68  nto either of th
27870 65 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73  e two categories
27880 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70   above, pFrom->p
27890 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  Tab.** and other
278a0 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75   fields are popu
278b0 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  lated accordingl
278c0 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  y. The caller sh
278d0 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70  ould check.** (p
278e0 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74  From->pTab!=0) t
278f0 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
27900 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63  her or not a suc
27910 63 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a  cessful match.**
27920 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   was found..**.*
27930 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
27940 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e   a match is foun
27950 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  d, SQLITE_OK is 
27960 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
27970 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  rror.** occurs. 
27980 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  If an error does
27990 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72   occur, an error
279a0 20 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72   message is stor
279b0 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72  ed in the.** par
279c0 73 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72  ser and some err
279d0 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68  or code other th
279e0 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  an SQLITE_OK ret
279f0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
27a00 20 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28   int withExpand(
27a10 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  .  Walker *pWalk
27a20 65 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72  er, .  struct Sr
27a30 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
27a40 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  m.){.  Parse *pP
27a50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
27a60 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
27a70 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
27a80 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65  db;.  struct Cte
27a90 20 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20 20   *pCte;         
27aa0 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64        /* Matched
27ab0 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66   CTE (or NULL if
27ac0 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20   no match) */.  
27ad0 57 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20  With *pWith;    
27ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27af0 2f 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 74  /* WITH clause t
27b00 68 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73  hat pCte belongs
27b10 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74   to */..  assert
27b20 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
27b30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65   );..  pCte = se
27b40 61 72 63 68 57 69 74 68 28 70 50 61 72 73 65 2d  archWith(pParse-
27b50 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26  >pWith, pFrom, &
27b60 70 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43  pWith);.  if( pC
27b70 74 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  te ){.    Table 
27b80 2a 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c  *pTab;.    ExprL
27b90 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
27ba0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20   Select *pSel;. 
27bb0 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74     Select *pLeft
27bc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27bd0 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45   /* Left-most SE
27be0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
27bf0 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65  /.    int bMayRe
27c00 63 75 72 73 69 76 65 3b 20 20 20 20 20 20 20 20  cursive;        
27c10 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63      /* True if c
27c20 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62  ompound joined b
27c30 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f  y UNION [ALL] */
27c40 0a 20 20 20 20 57 69 74 68 20 2a 70 53 61 76 65  .    With *pSave
27c50 64 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20  dWith;          
27c60 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61     /* Initial va
27c70 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70  lue of pParse->p
27c80 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  With */..    /* 
27c90 49 66 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72  If pCte->zCteErr
27ca0 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20   is non-NULL at 
27cb0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
27cc0 20 74 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65   this is an ille
27cd0 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72  gal.    ** recur
27ce0 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 74  sive reference t
27cf0 6f 20 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76  o CTE pCte. Leav
27d00 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
27d10 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a  arse and return.
27d20 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66      ** early. If
27d30 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 69   pCte->zCteErr i
27d40 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  s NULL, then thi
27d50 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75 72  s is not a recur
27d60 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 2e 0a  sive reference..
27d70 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
27d80 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a  ase, proceed.  *
27d90 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e  /.    if( pCte->
27da0 7a 43 74 65 45 72 72 20 29 7b 0a 20 20 20 20 20  zCteErr ){.     
27db0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
27dc0 28 70 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a  (pParse, pCte->z
27dd0 43 74 65 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e  CteErr, pCte->zN
27de0 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
27df0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
27e00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
27e10 61 6e 6e 6f 74 42 65 46 75 6e 63 74 69 6f 6e 28  annotBeFunction(
27e20 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20 29  pParse, pFrom) )
27e30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
27e40 52 52 4f 52 3b 0a 0a 20 20 20 20 61 73 73 65 72  RROR;..    asser
27e50 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
27e60 30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  0 );.    pFrom->
27e70 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
27e80 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
27e90 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
27ea0 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54  le));.    if( pT
27eb0 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
27ec0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54  RC_Abort;.    pT
27ed0 61 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b  ab->nTabRef = 1;
27ee0 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  .    pTab->zName
27ef0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
27f00 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61  up(db, pCte->zNa
27f10 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69  me);.    pTab->i
27f20 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70  PKey = -1;.    p
27f30 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20  Tab->nRowLogEst 
27f40 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32  = 200; assert( 2
27f50 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  00==sqlite3LogEs
27f60 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20  t(1048576) );.  
27f70 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
27f80 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c   |= TF_Ephemeral
27f90 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52   | TF_NoVisibleR
27fa0 6f 77 69 64 3b 0a 20 20 20 20 70 46 72 6f 6d 2d  owid;.    pFrom-
27fb0 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
27fc0 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
27fd0 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pCte->pSelect, 0
27fe0 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
27ff0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
28000 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
28010 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65  M_BKPT;.    asse
28020 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  rt( pFrom->pSele
28030 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  ct );..    /* Ch
28040 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20 61  eck if this is a
28050 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 20   recursive CTE. 
28060 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46  */.    pSel = pF
28070 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  rom->pSelect;.  
28080 20 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20    bMayRecursive 
28090 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b  = ( pSel->op==TK
280a0 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70  _ALL || pSel->op
280b0 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
280c0 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73    if( bMayRecurs
280d0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ive ){.      int
280e0 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73   i;.      SrcLis
280f0 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d  t *pSrc = pFrom-
28100 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a  >pSelect->pSrc;.
28110 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
28120 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
28130 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
28140 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
28150 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  pItem = &pSrc->a
28160 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
28170 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
28180 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26  e==0 .         &
28190 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d  & pItem->zName!=
281a0 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 30  0 .         && 0
281b0 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
281c0 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70  (pItem->zName, p
281d0 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20  Cte->zName).    
281e0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
281f0 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d     pItem->pTab =
28200 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20   pTab;.         
28210 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 52 65 63   pItem->fg.isRec
28220 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20  ursive = 1;.    
28230 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62        pTab->nTab
28240 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
28250 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
28260 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b  |= SF_Recursive;
28270 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28280 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
28290 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73   Only one recurs
282a0 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 73  ive reference is
282b0 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a   permitted. */ .
282c0 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 54      if( pTab->nT
282d0 61 62 52 65 66 3e 32 20 29 7b 0a 20 20 20 20 20  abRef>2 ){.     
282e0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
282f0 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  (.          pPar
28300 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20 72 65  se, "multiple re
28310 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65 63 75  ferences to recu
28320 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25 73 22  rsive table: %s"
28330 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20  , pCte->zName.  
28340 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72 65 74      );.      ret
28350 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
28360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
28370 72 74 28 20 70 54 61 62 2d 3e 6e 54 61 62 52 65  rt( pTab->nTabRe
28380 66 3d 3d 31 20 7c 7c 20 0a 20 20 20 20 20 20 20  f==1 || .       
28390 20 20 20 20 20 28 28 70 53 65 6c 2d 3e 73 65 6c       ((pSel->sel
283a0 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72 73 69  Flags&SF_Recursi
283b0 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e 54 61  ve) && pTab->nTa
283c0 62 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20  bRef==2 ));..   
283d0 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d   pCte->zCteErr =
283e0 20 22 63 69 72 63 75 6c 61 72 20 72 65 66 65 72   "circular refer
283f0 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20 20 70  ence: %s";.    p
28400 53 61 76 65 64 57 69 74 68 20 3d 20 70 50 61 72  SavedWith = pPar
28410 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70  se->pWith;.    p
28420 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
28430 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62 4d  With;.    if( bM
28440 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  ayRecursive ){. 
28450 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50 72       Select *pPr
28460 69 6f 72 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69  ior = pSel->pPri
28470 6f 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  or;.      assert
28480 28 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 3d  ( pPrior->pWith=
28490 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69  =0 );.      pPri
284a0 6f 72 2d 3e 70 57 69 74 68 20 3d 20 70 53 65 6c  or->pWith = pSel
284b0 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 20 20 73  ->pWith;.      s
284c0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
284d0 28 70 57 61 6c 6b 65 72 2c 20 70 50 72 69 6f 72  (pWalker, pPrior
284e0 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d  );.      pPrior-
284f0 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 20 20  >pWith = 0;.    
28500 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
28510 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
28520 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
28530 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
28540 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
28550 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70  .    for(pLeft=p
28560 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69  Sel; pLeft->pPri
28570 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d  or; pLeft=pLeft-
28580 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45  >pPrior);.    pE
28590 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45  List = pLeft->pE
285a0 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43  List;.    if( pC
285b0 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20  te->pCols ){.   
285c0 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
285d0 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
285e0 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78  pCte->pCols->nEx
285f0 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
28600 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
28610 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
28620 68 61 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f  has %d values fo
28630 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20  r %d columns",. 
28640 20 20 20 20 20 20 20 20 20 20 20 70 43 74 65 2d             pCte-
28650 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e  >zName, pEList->
28660 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f  nExpr, pCte->pCo
28670 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20  ls->nExpr.      
28680 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61    );.        pPa
28690 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61  rse->pWith = pSa
286a0 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20  vedWith;.       
286b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
286c0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
286d0 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74      pEList = pCt
286e0 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a  e->pCols;.    }.
286f0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  .    sqlite3Colu
28700 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
28710 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
28720 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
28730 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69  ab->aCol);.    i
28740 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  f( bMayRecursive
28750 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53   ){.      if( pS
28760 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  el->selFlags & S
28770 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  F_Recursive ){. 
28780 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74         pCte->zCt
28790 65 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65  eErr = "multiple
287a0 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72   recursive refer
287b0 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20  ences: %s";.    
287c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
287d0 20 70 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 3d   pCte->zCteErr =
287e0 20 22 72 65 63 75 72 73 69 76 65 20 72 65 66 65   "recursive refe
287f0 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75  rence in a subqu
28800 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20  ery: %s";.      
28810 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  }.      sqlite3W
28820 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
28830 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a  r, pSel);.    }.
28840 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65 45 72      pCte->zCteEr
28850 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73  r = 0;.    pPars
28860 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65  e->pWith = pSave
28870 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65  dWith;.  }..  re
28880 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
28890 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
288a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
288b0 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  E./*.** If the S
288c0 45 4c 45 43 54 20 70 61 73 73 65 64 20 61 73 20  ELECT passed as 
288d0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
288e0 65 6e 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63  ent has an assoc
288f0 69 61 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63  iated WITH .** c
28900 6c 61 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72  lause, pop it fr
28910 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f  om the stack sto
28920 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  red as part of t
28930 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e  he Parse object.
28940 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
28950 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20  tion is used as 
28960 74 68 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62  the xSelectCallb
28970 61 63 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20  ack2() callback 
28980 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c  by.** sqlite3Sel
28990 65 63 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e  ectExpand() when
289a0 20 77 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43   walking a SELEC
289b0 54 20 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76  T tree to resolv
289c0 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73  e table.** names
289d0 20 61 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20   and other FROM 
289e0 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e  clause elements.
289f0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
28a00 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57   selectPopWith(W
28a10 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
28a20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
28a30 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
28a40 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
28a50 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57 41 59   if( OK_IF_ALWAY
28a60 53 5f 54 52 55 45 28 70 50 61 72 73 65 2d 3e 70  S_TRUE(pParse->p
28a70 57 69 74 68 29 20 26 26 20 70 2d 3e 70 50 72 69  With) && p->pPri
28a80 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69 74  or==0 ){.    Wit
28a90 68 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52  h *pWith = findR
28aa0 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69  ightmost(p)->pWi
28ab0 74 68 3b 0a 20 20 20 20 69 66 28 20 70 57 69 74  th;.    if( pWit
28ac0 68 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  h!=0 ){.      as
28ad0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57  sert( pParse->pW
28ae0 69 74 68 3d 3d 70 57 69 74 68 20 29 3b 0a 20 20  ith==pWith );.  
28af0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
28b00 68 20 3d 20 70 57 69 74 68 2d 3e 70 4f 75 74 65  h = pWith->pOute
28b10 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  r;.    }.  }.}.#
28b20 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c  else.#define sel
28b30 65 63 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e  ectPopWith 0.#en
28b40 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  dif..static int 
28b50 73 65 6c 65 63 74 45 78 70 61 6e 64 53 75 62 71  selectExpandSubq
28b60 75 65 72 79 28 50 61 72 73 65 20 2a 70 50 61 72  uery(Parse *pPar
28b70 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69  se, struct SrcLi
28b80 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b  st_item *pFrom){
28b90 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20  .  Select *pSel 
28ba0 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
28bb0 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  ;.  Table *pTab;
28bc0 0a 0a 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20  ..  pFrom->pTab 
28bd0 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
28be0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61  DbMallocZero(pPa
28bf0 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
28c00 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70  Table));.  if( p
28c10 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
28c20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 70 54 61  WRC_Abort;.  pTa
28c30 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a  b->nTabRef = 1;.
28c40 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c    if( pFrom->zAl
28c50 69 61 73 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  ias ){.    pTab-
28c60 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
28c70 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d  DbStrDup(pParse-
28c80 3e 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  >db, pFrom->zAli
28c90 61 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  as);.  }else{.  
28ca0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
28cb0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
28cc0 50 61 72 73 65 2d 3e 64 62 2c 20 22 73 75 62 71  Parse->db, "subq
28cd0 75 65 72 79 5f 25 70 22 2c 20 28 76 6f 69 64 2a  uery_%p", (void*
28ce0 29 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 77 68  )pTab);.  }.  wh
28cf0 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
28d00 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c  r ){ pSel = pSel
28d10 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 73 71  ->pPrior; }.  sq
28d20 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d  lite3ColumnsFrom
28d30 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
28d40 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 26 70   pSel->pEList,&p
28d50 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d  Tab->nCol,&pTab-
28d60 3e 61 43 6f 6c 29 3b 0a 20 20 70 54 61 62 2d 3e  >aCol);.  pTab->
28d70 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
28d80 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  ab->nRowLogEst =
28d90 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
28da0 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
28db0 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 70  (1048576) );.  p
28dc0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
28dd0 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 0a   TF_Ephemeral;..
28de0 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
28df0 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tinue;.}../*.** 
28e00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
28e10 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  a Walker callbac
28e20 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67  k for "expanding
28e30 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
28e40 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64  ment..** "Expand
28e50 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f  ing" means to do
28e60 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
28e70 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61  **.**    (1)  Ma
28e80 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72  ke sure VDBE cur
28e90 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
28ea0 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
28eb0 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20  o every.**      
28ec0 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68     element of th
28ed0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
28ee0 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c  *.**    (2)  Fil
28ef0 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
28f00 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
28f10 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
28f20 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
28f30 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20     defines FROM 
28f40 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69  clause.  When vi
28f50 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  ews appear in th
28f60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a  e FROM clause,.*
28f70 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
28f80 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
28f90 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
28fa0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
28fb0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
28fc0 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
28fd0 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
28fe0 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
28ff0 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
29000 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
29010 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
29020 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
29030 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
29040 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
29050 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
29060 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
29070 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
29080 65 72 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  ersistent repres
29090 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
290a0 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
290b0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41  .**.**    (3)  A
290c0 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
290d0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
290e0 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20  accommodate the 
290f0 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a  NATURAL keyword.
29100 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f  **         on jo
29110 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61  ins and the ON a
29120 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  nd USING clause 
29130 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20  of joins..**.** 
29140 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65     (4)  Scan the
29150 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
29160 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
29170 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b  et (pEList) look
29180 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ing.**         f
29190 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  or instances of 
291a0 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  the "*" operator
291b0 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20   or the TABLE.* 
291c0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20  operator..**    
291d0 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65       If found, e
291e0 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74  xpand each "*" t
291f0 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
29200 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65  n in every table
29210 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20  .**         and 
29220 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76  TABLE.* to be ev
29230 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41  ery column in TA
29240 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  BLE..**.*/.stati
29250 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61  c int selectExpa
29260 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61  nder(Walker *pWa
29270 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
29280 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
29290 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
292a0 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  rse;.  int i, j,
292b0 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   k;.  SrcList *p
292c0 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
292d0 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
292e0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
292f0 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c  em *pFrom;.  sql
29300 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
29310 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
29320 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78  E, *pRight, *pEx
29330 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61  pr;.  u16 selFla
29340 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  gs = p->selFlags
29350 3b 0a 20 20 75 33 32 20 65 6c 69 73 74 46 6c 61  ;.  u32 elistFla
29360 67 73 20 3d 20 30 3b 0a 0a 20 20 70 2d 3e 73 65  gs = 0;..  p->se
29370 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70  lFlags |= SF_Exp
29380 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d  anded;.  if( db-
29390 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29  >mallocFailed  )
293a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
293b0 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 61 73  _Abort;.  }.  as
293c0 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30  sert( p->pSrc!=0
293d0 20 29 3b 0a 20 20 69 66 28 20 28 73 65 6c 46 6c   );.  if( (selFl
293e0 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65  ags & SF_Expande
293f0 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  d)!=0 ){.    ret
29400 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
29410 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20   }.  pTabList = 
29420 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
29430 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
29440 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68   sqlite3WithPush
29450 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 57 69 74  (pParse, p->pWit
29460 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  h, 0);..  /* Mak
29470 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
29480 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
29490 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
294a0 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
294b0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
294c0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
294d0 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
294e0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
294f0 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
29500 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a  se, pTabList);..
29510 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
29520 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69  ry table named i
29530 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
29540 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  e of the select.
29550 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74    If.  ** an ent
29560 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
29570 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75  lause is a subqu
29580 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ery instead of a
29590 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a   table or view,.
295a0 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65    ** then create
295b0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
295c0 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  le structure to 
295d0 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62  describe the sub
295e0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
295f0 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
29600 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
29610 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
29620 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
29630 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
29640 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66  assert( pFrom->f
29650 67 2e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30  g.isRecursive==0
29660 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21   || pFrom->pTab!
29670 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46  =0 );.    if( pF
29680 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73  rom->fg.isRecurs
29690 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ive ) continue;.
296a0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
296b0 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69  m->pTab==0 );.#i
296c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
296d0 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69  T_CTE.    if( wi
296e0 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72  thExpand(pWalker
296f0 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72  , pFrom) ) retur
29700 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
29710 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
29720 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69   ) {} else.#endi
29730 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  f.    if( pFrom-
29740 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
29750 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29760 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
29770 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
29780 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
29790 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
297a0 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
297b0 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
297c0 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
297d0 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20  rt( pSel!=0 );. 
297e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
297f0 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
29800 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
29810 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
29820 65 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75  er, pSel) ) retu
29830 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
29840 20 20 20 20 69 66 28 20 73 65 6c 65 63 74 45 78      if( selectEx
29850 70 61 6e 64 53 75 62 71 75 65 72 79 28 70 50 61  pandSubquery(pPa
29860 72 73 65 2c 20 70 46 72 6f 6d 29 20 29 20 72 65  rse, pFrom) ) re
29870 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
29880 23 69 66 20 30 0a 20 20 20 20 20 20 70 46 72 6f  #if 0.      pFro
29890 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
298a0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
298b0 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
298c0 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 69  Table));.      i
298d0 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
298e0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
298f0 20 20 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52       pTab->nTabR
29900 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  ef = 1;.      if
29910 28 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 20  ( pFrom->zAlias 
29920 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ){.        pTab-
29930 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
29940 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 46 72  DbStrDup(db, pFr
29950 6f 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  om->zAlias);.   
29960 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29970 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
29980 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
29990 62 2c 20 22 73 75 62 71 75 65 72 79 5f 25 70 22  b, "subquery_%p"
299a0 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a  , (void*)pTab);.
299b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
299c0 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
299d0 72 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c  r ){ pSel = pSel
299e0 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20  ->pPrior; }.    
299f0 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73    sqlite3Columns
29a00 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
29a10 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73  rse, pSel->pELis
29a20 74 2c 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 26 70  t,&pTab->nCol,&p
29a30 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  Tab->aCol);.    
29a40 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
29a50 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  -1;.      pTab->
29a60 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30 30  nRowLogEst = 200
29a70 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d 73  ; assert( 200==s
29a80 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 34  qlite3LogEst(104
29a90 38 35 37 36 29 20 29 3b 0a 20 20 20 20 20 20 70  8576) );.      p
29aa0 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
29ab0 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23   TF_Ephemeral;.#
29ac0 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 20 20 20  endif.#endif.   
29ad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
29ae0 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62   An ordinary tab
29af0 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
29b00 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
29b10 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  se */.      asse
29b20 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d  rt( pFrom->pTab=
29b30 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72 6f  =0 );.      pFro
29b40 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
29b50 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
29b60 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
29b70 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20  0, pFrom);.     
29b80 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72   if( pTab==0 ) r
29b90 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
29ba0 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d  .      if( pTab-
29bb0 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66 66 66 66  >nTabRef>=0xffff
29bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
29bd0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
29be0 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65  se, "too many re
29bf0 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73  ferences to \"%s
29c00 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a  \": max 65535",.
29c10 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
29c20 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
29c30 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30   pFrom->pTab = 0
29c40 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
29c50 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
29c60 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e    }.      pTab->
29c70 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20 20  nTabRef++;.     
29c80 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c 28   if( !IsVirtual(
29c90 70 54 61 62 29 20 26 26 20 63 61 6e 6e 6f 74 42  pTab) && cannotB
29ca0 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  eFunction(pParse
29cb0 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20  , pFrom) ){.    
29cc0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
29cd0 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23 69  bort;.      }.#i
29ce0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
29cf0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
29d00 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45  !defined (SQLITE
29d10 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
29d20 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 49 73  LE).      if( Is
29d30 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c 7c  Virtual(pTab) ||
29d40 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
29d50 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e 43  {.        i16 nC
29d60 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ol;.        if( 
29d70 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
29d80 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
29d90 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  , pTab) ) return
29da0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
29db0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
29dc0 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  m->pSelect==0 );
29dd0 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  .        pFrom->
29de0 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
29df0 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
29e00 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  Tab->pSelect, 0)
29e10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
29e20 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28 70  3SelectSetName(p
29e30 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70  From->pSelect, p
29e40 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
29e50 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61 62       nCol = pTab
29e60 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->nCol;.        
29e70 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  pTab->nCol = -1;
29e80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29e90 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
29ea0 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  er, pFrom->pSele
29eb0 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61  ct);.        pTa
29ec0 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a  b->nCol = nCol;.
29ed0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
29ee0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63     }..    /* Loc
29ef0 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61  ate the index na
29f00 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58  med by the INDEX
29f10 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66  ED BY clause, if
29f20 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28   any. */.    if(
29f30 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
29f40 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  yLookup(pParse, 
29f50 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20  pFrom) ){.      
29f60 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
29f70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
29f80 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41  * Process NATURA
29f90 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20  L keywords, and 
29fa0 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
29fb0 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20  uses of joins.. 
29fc0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
29fd0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71  llocFailed || sq
29fe0 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
29ff0 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20  pParse, p) ){.  
2a000 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
2a010 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f  rt;.  }..  /* Fo
2a020 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74  r every "*" that
2a030 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63   occurs in the c
2a040 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65  olumn list, inse
2a050 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  rt the names of.
2a060 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73    ** all columns
2a070 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20   in all tables. 
2a080 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54   And for every T
2a090 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68  ABLE.* insert th
2a0a0 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20  e names.  ** of 
2a0b0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54  all columns in T
2a0c0 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65  ABLE.  The parse
2a0d0 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65  r inserted a spe
2a0e0 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a  cial expression.
2a0f0 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b    ** with the TK
2a100 5f 41 53 54 45 52 49 53 4b 20 6f 70 65 72 61 74  _ASTERISK operat
2a110 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20  or for each "*" 
2a120 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e  that it found in
2a130 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a   the column.  **
2a140 20 6c 69 73 74 2e 20 20 54 68 65 20 66 6f 6c 6c   list.  The foll
2a150 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20  owing code just 
2a160 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  has to locate th
2a170 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20 20  e TK_ASTERISK.  
2a180 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  ** expressions a
2a190 6e 64 20 65 78 70 61 6e 64 20 65 61 63 68 20 6f  nd expand each o
2a1a0 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ne to the list o
2a1b0 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e  f all columns in
2a1c0 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65 73  .  ** all tables
2a1d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
2a1e0 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20  first loop just 
2a1f0 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
2a200 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22   there are any "
2a210 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a  *" operators.  *
2a220 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61  * that need expa
2a230 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nding..  */.  fo
2a240 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
2a250 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
2a260 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61    pE = pEList->a
2a270 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [k].pExpr;.    i
2a280 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 53  f( pE->op==TK_AS
2a290 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b 0a  TERISK ) break;.
2a2a0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
2a2b0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45  op!=TK_DOT || pE
2a2c0 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20  ->pRight!=0 );. 
2a2d0 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
2a2e0 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45  p!=TK_DOT || (pE
2a2f0 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45  ->pLeft!=0 && pE
2a300 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
2a310 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ID) );.    if( p
2a320 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26  E->op==TK_DOT &&
2a330 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d   pE->pRight->op=
2a340 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20 62  =TK_ASTERISK ) b
2a350 72 65 61 6b 3b 0a 20 20 20 20 65 6c 69 73 74 46  reak;.    elistF
2a360 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61 67  lags |= pE->flag
2a370 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70  s;.  }.  if( k<p
2a380 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
2a390 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66      /*.    ** If
2a3a0 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20   we get here it 
2a3b0 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74  means the result
2a3c0 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e   set contains on
2a3d0 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20  e or more "*".  
2a3e0 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74    ** operators t
2a3f0 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65  hat need to be e
2a400 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74  xpanded.  Loop t
2a410 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72  hrough each expr
2a420 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e  ession.    ** in
2a430 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
2a440 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20  and expand them 
2a450 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20  one by one..    
2a460 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  */.    struct Ex
2a470 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d  prList_item *a =
2a480 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
2a490 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d  ExprList *pNew =
2a4a0 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   0;.    int flag
2a4b0 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  s = pParse->db->
2a4c0 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c  flags;.    int l
2a4d0 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67  ongNames = (flag
2a4e0 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
2a4f0 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20  olNames)!=0.    
2a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a510 20 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51    && (flags & SQ
2a520 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
2a530 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72  es)==0;..    for
2a540 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
2a550 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
2a560 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78     pE = a[k].pEx
2a570 70 72 3b 0a 20 20 20 20 20 20 65 6c 69 73 74 46  pr;.      elistF
2a580 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61 67  lags |= pE->flag
2a590 73 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  s;.      pRight 
2a5a0 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20  = pE->pRight;.  
2a5b0 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
2a5c0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52  op!=TK_DOT || pR
2a5d0 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  ight!=0 );.     
2a5e0 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f   if( pE->op!=TK_
2a5f0 41 53 54 45 52 49 53 4b 0a 20 20 20 20 20 20 20  ASTERISK.       
2a600 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  && (pE->op!=TK_D
2a610 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70  OT || pRight->op
2a620 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29 0a 20  !=TK_ASTERISK). 
2a630 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2a640 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c  /* This particul
2a650 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64 6f  ar expression do
2a660 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
2a670 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20 20  e expanded..    
2a680 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
2a690 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
2a6a0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
2a6b0 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70  se, pNew, a[k].p
2a6c0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
2a6d0 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
2a6e0 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65       pNew->a[pNe
2a6f0 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d  w->nExpr-1].zNam
2a700 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a  e = a[k].zName;.
2a710 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2a720 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
2a730 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53  .zSpan = a[k].zS
2a740 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61  pan;.          a
2a750 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  [k].zName = 0;. 
2a760 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 53           a[k].zS
2a770 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  pan = 0;.       
2a780 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e   }.        a[k].
2a790 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20  pExpr = 0;.     
2a7a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a7b0 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73 69  /* This expressi
2a7c0 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20 61  on is a "*" or a
2a7d0 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20 6e   "TABLE.*" and n
2a7e0 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 20  eeds to be.     
2a7f0 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e 20     ** expanded. 
2a800 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  */.        int t
2a810 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20 20  ableSeen = 0;   
2a820 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 77     /* Set to 1 w
2a830 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68 65  hen TABLE matche
2a840 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  s */.        cha
2a850 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20 20  r *zTName = 0;  
2a860 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66 20       /* text of 
2a870 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f  name of TABLE */
2a880 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 2d  .        if( pE-
2a890 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
2a8a0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2a8b0 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b   pE->pLeft!=0 );
2a8c0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2a8d0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2a8e0 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45  rty(pE->pLeft, E
2a8f0 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20  P_IntValue) );. 
2a900 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
2a910 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a  = pE->pLeft->u.z
2a920 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d  Token;.        }
2a930 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
2a940 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74  , pFrom=pTabList
2a950 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
2a960 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f  >nSrc; i++, pFro
2a970 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m++){.          
2a980 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46  Table *pTab = pF
2a990 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  rom->pTab;.     
2a9a0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75       Select *pSu
2a9b0 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  b = pFrom->pSele
2a9c0 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ct;.          ch
2a9d0 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
2a9e0 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  From->zAlias;.  
2a9f0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2aa00 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65 20  ar *zSchemaName 
2aa10 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
2aa20 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20  nt iDb;.        
2aa30 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d    if( zTabName==
2aa40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2aa50 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62   zTabName = pTab
2aa60 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
2aa70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
2aa80 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2aa90 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  led ) break;.   
2aaa0 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62 3d         if( pSub=
2aab0 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65 6c  =0 || (pSub->sel
2aac0 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65  Flags & SF_Neste
2aad0 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20 20  dFrom)==0 ){.   
2aae0 20 20 20 20 20 20 20 20 20 70 53 75 62 20 3d 20           pSub = 
2aaf0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
2ab00 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71 6c  f( zTName && sql
2ab10 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e 61  ite3StrICmp(zTNa
2ab20 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d 30  me, zTabName)!=0
2ab30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ab40 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
2ab50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ab60 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69        iDb = sqli
2ab70 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
2ab80 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
2ab90 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ma);.           
2aba0 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 69   zSchemaName = i
2abb0 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62 5b  Db>=0 ? db->aDb[
2abc0 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a 20  iDb].zDbSName : 
2abd0 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  "*";.          }
2abe0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
2abf0 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  =0; j<pTab->nCol
2ac00 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
2ac10 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
2ac20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
2ac30 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
2ac40 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d     char *zColnam
2ac50 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75  e;  /* The compu
2ac60 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ted column name 
2ac70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  */.            c
2ac80 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20  har *zToFree;   
2ac90 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69  /* Malloced stri
2aca0 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ng that needs to
2acb0 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20   be freed */.   
2acc0 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73           Token s
2acd0 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d  Colname;  /* Com
2ace0 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  puted column nam
2acf0 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a  e as a token */.
2ad00 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
2ad10 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20  ert( zName );.  
2ad20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
2ad30 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20  Name && pSub.   
2ad40 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
2ad50 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d  ite3MatchSpanNam
2ad60 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  e(pSub->pEList->
2ad70 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a  a[j].zSpan, 0, z
2ad80 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20  TName, 0)==0.   
2ad90 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2ada0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2adb0 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
2adc0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  }..            /
2add0 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73  * If a column is
2ade0 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64 64   marked as 'hidd
2adf0 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20 66 72 6f  en', omit it fro
2ae00 6d 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a 20  m the expanded. 
2ae10 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65             ** re
2ae20 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 20 75 6e  sult-set list un
2ae30 6c 65 73 73 20 74 68 65 20 53 45 4c 45 43 54 20  less the SELECT 
2ae40 68 61 73 20 74 68 65 20 53 46 5f 49 6e 63 6c 75  has the SF_Inclu
2ae50 64 65 48 69 64 64 65 6e 0a 20 20 20 20 20 20 20  deHidden.       
2ae60 20 20 20 20 20 2a 2a 20 62 69 74 20 73 65 74 2e       ** bit set.
2ae70 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
2ae80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2ae90 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
2aea0 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e 29  F_IncludeHidden)
2aeb0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
2aec0 20 26 26 20 49 73 48 69 64 64 65 6e 43 6f 6c 75   && IsHiddenColu
2aed0 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  mn(&pTab->aCol[j
2aee0 5d 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]) .            
2aef0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2af00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2af10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2af20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20 3d       tableSeen =
2af30 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20   1;..           
2af40 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e 61   if( i>0 && zTNa
2af50 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  me==0 ){.       
2af60 20 20 20 20 20 20 20 69 66 28 20 28 70 46 72 6f         if( (pFro
2af70 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
2af80 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a   JT_NATURAL)!=0.
2af90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afa0 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d  && tableAndColum
2afb0 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c  nIndex(pTabList,
2afc0 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29   i, zName, 0, 0)
2afd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29  .              )
2afe0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2aff0 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41    /* In a NATURA
2b000 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65  L join, omit the
2b010 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72   join columns fr
2b020 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  om the .        
2b030 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
2b040 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66   to the right of
2b050 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20   the join */.   
2b060 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
2b070 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
2b080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b090 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2b0a0 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f  IdListIndex(pFro
2b0b0 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65  m->pUsing, zName
2b0c0 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
2b0d0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20          /* In a 
2b0e0 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e  join with a USIN
2b0f0 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63  G clause, omit c
2b100 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20  olumns in the.  
2b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2b120 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72   using clause fr
2b130 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  om the table on 
2b140 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20  the right. */.  
2b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
2b160 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2b170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b180 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b190 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74    pRight = sqlit
2b1a0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
2b1b0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
2b1c0 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d        zColname =
2b1d0 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20   zName;.        
2b1e0 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b      zToFree = 0;
2b1f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2b200 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54   longNames || pT
2b210 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29  abList->nSrc>1 )
2b220 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2b230 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20  Expr *pLeft;.   
2b240 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74             pLeft
2b250 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
2b260 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61  b, TK_ID, zTabNa
2b270 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
2b280 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74     pExpr = sqlit
2b290 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
2b2a0 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70  TK_DOT, pLeft, p
2b2b0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
2b2c0 20 20 20 20 20 20 69 66 28 20 7a 53 63 68 65 6d        if( zSchem
2b2d0 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  aName ){.       
2b2e0 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
2b2f0 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
2b300 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61 4e   TK_ID, zSchemaN
2b310 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2b320 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
2b330 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
2b340 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
2b350 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
2b360 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b370 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
2b380 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
2b390 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
2b3a0 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
2b3b0 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  tf(db, "%s.%s", 
2b3c0 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  zTabName, zName)
2b3d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2b3e0 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c    zToFree = zCol
2b3f0 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  name;.          
2b400 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b420 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70         pExpr = p
2b430 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
2b440 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2b450 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
2b460 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
2b470 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70  arse, pNew, pExp
2b480 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
2b490 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74  sqlite3TokenInit
2b4a0 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a 43 6f 6c  (&sColname, zCol
2b4b0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
2b4c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
2b4d0 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
2b4e0 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d  , pNew, &sColnam
2b4f0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 0);.         
2b500 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20 28     if( pNew && (
2b510 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2b520 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20  _NestedFrom)!=0 
2b530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2b540 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2b550 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65  _item *pX = &pNe
2b560 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72  w->a[pNew->nExpr
2b570 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -1];.           
2b580 20 20 20 69 66 28 20 70 53 75 62 20 29 7b 0a 20     if( pSub ){. 
2b590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2b5a0 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74  X->zSpan = sqlit
2b5b0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
2b5c0 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a  Sub->pEList->a[j
2b5d0 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20  ].zSpan);.      
2b5e0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2b5f0 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30  se( pX->zSpan==0
2b600 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
2b610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b620 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70           pX->zSp
2b630 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  an = sqlite3MPri
2b640 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 2e 25  ntf(db, "%s.%s.%
2b650 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
2b660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
2b680 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62  SchemaName, zTab
2b690 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b  Name, zColname);
2b6a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b6b0 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a   testcase( pX->z
2b6c0 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Span==0 );.     
2b6d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b6e0 20 20 20 20 20 20 20 20 20 70 58 2d 3e 62 53 70           pX->bSp
2b6f0 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20 20 20  anIsTab = 1;.   
2b700 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b710 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
2b720 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65  Free(db, zToFree
2b730 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2b740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b750 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
2b760 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2b770 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20   zTName ){.     
2b780 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
2b790 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
2b7a0 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
2b7b0 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20  s", zTName);.   
2b7c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2b7d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b7e0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2b7f0 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65  , "no tables spe
2b800 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  cified");.      
2b810 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2b820 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b830 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2b840 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69  tDelete(db, pELi
2b850 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69  st);.    p->pELi
2b860 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  st = pNew;.  }. 
2b870 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 29   if( p->pEList )
2b880 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 45 4c  {.    if( p->pEL
2b890 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61  ist->nExpr>db->a
2b8a0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
2b8b0 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
2b8c0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2b8d0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
2b8e0 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e   many columns in
2b8f0 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20   result set");. 
2b900 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2b910 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20  Abort;.    }.   
2b920 20 69 66 28 20 28 65 6c 69 73 74 46 6c 61 67 73   if( (elistFlags
2b930 20 26 20 28 45 50 5f 48 61 73 46 75 6e 63 7c 45   & (EP_HasFunc|E
2b940 50 5f 53 75 62 71 75 65 72 79 29 29 21 3d 30 20  P_Subquery))!=0 
2b950 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 65 6c 46  ){.      p->selF
2b960 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6d 70 6c  lags |= SF_Compl
2b970 65 78 52 65 73 75 6c 74 3b 0a 20 20 20 20 7d 0a  exResult;.    }.
2b980 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
2b990 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
2b9a0 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e  .** No-op routin
2b9b0 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d  e for the parse-
2b9c0 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a  tree walker..**.
2b9d0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
2b9e0 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b  tine is the Walk
2b9f0 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
2ba00 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e   then expression
2ba10 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61   trees.** are wa
2ba20 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79  lked without any
2ba30 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74   actions being t
2ba40 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64  aken at each nod
2ba50 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a  e.  Presumably,.
2ba60 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ** when this rou
2ba70 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
2ba80 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
2ba90 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57  lback then .** W
2baa0 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
2bab0 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20  lback is set to 
2bac0 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65  do something use
2bad0 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a  ful for every .*
2bae0 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68  * subquery in th
2baf0 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a  e parser tree..*
2bb00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
2bb10 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72  rWalkNoop(Walker
2bb20 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20   *NotUsed, Expr 
2bb30 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e  *NotUsed2){.  UN
2bb40 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
2bb50 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
2bb60 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43  2);.  return WRC
2bb70 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
2bb80 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e  .** No-op routin
2bb90 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d  e for the parse-
2bba0 74 72 65 65 20 77 61 6c 6b 65 72 20 66 6f 72 20  tree walker for 
2bbb0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2bbc0 73 2e 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69  s..** subquery i
2bbd0 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65  n the parser tre
2bbe0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2bbf0 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 28  3SelectWalkNoop(
2bc00 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c  Walker *NotUsed,
2bc10 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65 64   Select *NotUsed
2bc20 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
2bc30 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
2bc40 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
2bc50 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
2bc60 65 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  e;.}..#if SQLITE
2bc70 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 6c 77  _DEBUG./*.** Alw
2bc80 61 79 73 20 61 73 73 65 72 74 2e 20 20 54 68 69  ays assert.  Thi
2bc90 73 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  s xSelectCallbac
2bca0 6b 32 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  k2 implementatio
2bcb0 6e 20 70 72 6f 76 65 73 20 74 68 61 74 20 74 68  n proves that th
2bcc0 65 0a 2a 2a 20 78 53 65 6c 65 63 74 43 61 6c 6c  e.** xSelectCall
2bcd0 62 61 63 6b 32 20 69 73 20 6e 65 76 65 72 20 69  back2 is never i
2bce0 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  nvoked..*/.void 
2bcf0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61 6c  sqlite3SelectWal
2bd00 6b 41 73 73 65 72 74 32 28 57 61 6c 6b 65 72 20  kAssert2(Walker 
2bd10 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65 63 74  *NotUsed, Select
2bd20 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55   *NotUsed2){.  U
2bd30 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
2bd40 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
2bd50 64 32 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30  d2);.  assert( 0
2bd60 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 2f 2a 0a   );.}.#endif./*.
2bd70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2bd80 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45  "expands" a SELE
2bd90 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  CT statement and
2bda0 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71   all of its subq
2bdb0 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61  ueries..** For a
2bdc0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
2bdd0 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74  ation on what it
2bde0 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e   means to "expan
2bdf0 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73  d" a SELECT.** s
2be00 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68  tatement, see th
2be10 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
2be20 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f   selectExpand wo
2be30 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62  rker callback ab
2be40 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e  ove..**.** Expan
2be50 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74  ding a SELECT st
2be60 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66  atement is the f
2be70 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f  irst step in pro
2be80 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c  cessing a.** SEL
2be90 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
2bea0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
2beb0 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70  ment must be exp
2bec0 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  anded before.** 
2bed0 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
2bee0 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a  is performed..**
2bef0 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20  .** If anything 
2bf00 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65  goes wrong, an e
2bf10 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
2bf20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61  written into pPa
2bf30 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  rse..** The call
2bf40 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  ing function can
2bf50 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62   detect the prob
2bf60 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  lem by looking a
2bf70 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a  t pParse->nErr.*
2bf80 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d  * and/or pParse-
2bf90 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2bfa0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
2bfb0 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  d sqlite3SelectE
2bfc0 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61  xpand(Parse *pPa
2bfd0 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
2bfe0 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20  lect){.  Walker 
2bff0 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  w;.  w.xExprCall
2c000 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78  back = sqlite3Ex
2c010 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
2c020 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
2c030 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c 57  .  if( OK_IF_ALW
2c040 41 59 53 5f 54 52 55 45 28 70 50 61 72 73 65 2d  AYS_TRUE(pParse-
2c050 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 29 20 29 7b  >hasCompound) ){
2c060 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43 61  .    w.xSelectCa
2c070 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74  llback = convert
2c080 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f  CompoundSelectTo
2c090 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20 77 2e  Subquery;.    w.
2c0a0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32  xSelectCallback2
2c0b0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
2c0c0 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
2c0d0 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20  pSelect);.  }.  
2c0e0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2c0f0 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64  k = selectExpand
2c100 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  er;.  w.xSelectC
2c110 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63  allback2 = selec
2c120 74 50 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c 69  tPopWith;.  sqli
2c130 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
2c140 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a  , pSelect);.}...
2c150 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c160 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
2c170 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c  ** This is a Wal
2c180 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62  ker.xSelectCallb
2c190 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ack callback for
2c1a0 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65   the sqlite3Sele
2c1b0 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20  ctTypeInfo().** 
2c1c0 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a  interface..**.**
2c1d0 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63   For each FROM-c
2c1e0 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c 20  lause subquery, 
2c1f0 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  add Column.zType
2c200 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c   and Column.zCol
2c210 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
2c220 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74   to the Table st
2c230 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70  ructure that rep
2c240 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75  resents the resu
2c250 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61  lt set.** of tha
2c260 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a  t subquery..**.*
2c270 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
2c280 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
2c290 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
2c2a0 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75   set was constru
2c2b0 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63  cted.** by selec
2c2c0 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74 20  tExpander() but 
2c2d0 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c  the type and col
2c2e0 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  lation informati
2c2f0 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a  on was omitted.*
2c300 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  * at that point 
2c310 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66 69  because identifi
2c320 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ers had not yet 
2c330 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20  been resolved.  
2c340 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
2c350 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
2c360 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c  identifier resol
2c370 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ution..*/.static
2c380 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64 53   void selectAddS
2c390 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 28  ubqueryTypeInfo(
2c3a0 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2c3b0 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
2c3c0 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20  arse *pParse;.  
2c3d0 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73 74  int i;.  SrcList
2c3e0 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74   *pTabList;.  st
2c3f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2c400 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73  m *pFrom;..  ass
2c410 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73  ert( p->selFlags
2c420 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29   & SF_Resolved )
2c430 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e  ;.  assert( (p->
2c440 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
2c450 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29 3b  sTypeInfo)==0 );
2c460 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  .  p->selFlags |
2c470 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  = SF_HasTypeInfo
2c480 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61  ;.  pParse = pWa
2c490 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
2c4a0 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pTabList = p->pS
2c4b0 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  rc;.  for(i=0, p
2c4c0 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
2c4d0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
2c4e0 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
2c4f0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
2c500 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
2c510 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
2c520 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab!=0 );.    if(
2c530 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
2c540 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
2c550 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
2c560 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
2c570 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
2c580 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
2c590 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
2c5a0 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
2c5b0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  t;.      if( pSe
2c5c0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  l ){.        whi
2c5d0 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
2c5e0 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e   ) pSel = pSel->
2c5f0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
2c600 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
2c610 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
2c620 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
2c630 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  Tab, pSel);.    
2c640 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
2c650 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54  #endif.../*.** T
2c660 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73  his routine adds
2c670 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63 6f   datatype and co
2c680 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
2c690 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a   information to.
2c6a0 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  ** the Table str
2c6b0 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20 46  uctures of all F
2c6c0 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75  ROM-clause subqu
2c6d0 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45  eries in a.** SE
2c6e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
2c6f0 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20 72  **.** Use this r
2c700 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61 6d  outine after nam
2c710 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  e resolution..*/
2c720 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
2c730 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
2c740 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  eInfo(Parse *pPa
2c750 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
2c760 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  lect){.#ifndef S
2c770 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
2c780 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  ERY.  Walker w;.
2c790 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
2c7a0 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ack = sqlite3Sel
2c7b0 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  ectWalkNoop;.  w
2c7c0 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2c7d0 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62  2 = selectAddSub
2c7e0 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20  queryTypeInfo;. 
2c7f0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
2c800 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57 61   = sqlite3ExprWa
2c810 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72  lkNoop;.  w.pPar
2c820 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73  se = pParse;.  s
2c830 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
2c840 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23  (&w, pSelect);.#
2c850 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
2c860 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
2c870 73 20 75 70 20 61 20 53 45 4c 45 43 54 20 73 74  s up a SELECT st
2c880 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63  atement for proc
2c890 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20  essing.  The.** 
2c8a0 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63  following is acc
2c8b0 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a  omplished:.**.**
2c8c0 20 20 20 20 20 2a 20 20 56 44 42 45 20 43 75 72       *  VDBE Cur
2c8d0 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20  sor numbers are 
2c8e0 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
2c8f0 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d  FROM-clause term
2c900 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68  s..**     *  Eph
2c910 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a  emeral Table obj
2c920 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64  ects are created
2c930 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c   for all FROM-cl
2c940 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2e  ause subqueries.
2c950 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e  .**     *  ON an
2c960 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
2c970 61 72 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f  are shifted into
2c980 20 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74   WHERE statement
2c990 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64  s.**     *  Wild
2c9a0 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54  cards "*" and "T
2c9b0 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c  ABLE.*" in resul
2c9c0 74 20 73 65 74 73 20 61 72 65 20 65 78 70 61 6e  t sets are expan
2c9d0 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49  ded..**     *  I
2c9e0 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78  dentifiers in ex
2c9f0 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74  pression are mat
2ca00 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a  ched to tables..
2ca10 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2ca20 6e 65 20 61 63 74 73 20 72 65 63 75 72 73 69 76  ne acts recursiv
2ca30 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75  ely on all subqu
2ca40 65 72 69 65 73 20 77 69 74 68 69 6e 20 74 68 65  eries within the
2ca50 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
2ca60 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
2ca70 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
2ca80 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
2ca90 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
2caa0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
2cab0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
2cac0 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
2cad0 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
2cae0 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ed. */.  NameCon
2caf0 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20  text *pOuterNC  
2cb00 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
2cb10 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f  for container */
2cb20 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  .){.  assert( p!
2cb30 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
2cb40 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2cb50 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
2cb60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2cb70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
2cb80 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
2cb90 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29 20  F_HasTypeInfo ) 
2cba0 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
2cbb0 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70 50  3SelectExpand(pP
2cbc0 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28 20  arse, p);.  if( 
2cbd0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
2cbe0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
2cbf0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
2cc00 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f  n;.  sqlite3Reso
2cc10 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70  lveSelectNames(p
2cc20 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72  Parse, p, pOuter
2cc30 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  NC);.  if( pPars
2cc40 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73  e->nErr || pPars
2cc50 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
2cc60 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
2cc70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64  sqlite3SelectAdd
2cc80 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65 2c  TypeInfo(pParse,
2cc90 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   p);.}../*.** Re
2cca0 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61 74  set the aggregat
2ccb0 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a  e accumulator..*
2ccc0 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67 61  *.** The aggrega
2ccd0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 69  te accumulator i
2cce0 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72  s a set of memor
2ccf0 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c  y cells that hol
2cd00 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74  d.** intermediat
2cd10 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65 20  e results while 
2cd20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20 61  calculating an a
2cd30 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73 0a  ggregate.  This.
2cd40 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
2cd50 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20 73  ates code that s
2cd60 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61  tores NULLs in a
2cd70 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f  ll of those memo
2cd80 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a  ry.** cells..*/.
2cd90 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 65  static void rese
2cda0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72  tAccumulator(Par
2cdb0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
2cdc0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
2cdd0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
2cde0 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
2cdf0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
2ce00 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63  Info_func *pFunc
2ce10 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70  ;.  int nReg = p
2ce20 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b  AggInfo->nFunc +
2ce30 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75   pAggInfo->nColu
2ce40 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d  mn;.  if( nReg==
2ce50 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 64  0 ) return;.#ifd
2ce60 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2ce70 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
2ce80 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65 67   all AggInfo reg
2ce90 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68 69  isters are withi
2cea0 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65 63  n the range spec
2ceb0 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41 67  ified by.  ** Ag
2cec0 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67  gInfo.mnReg..Agg
2ced0 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20  Info.mxReg */.  
2cee0 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70 41  assert( nReg==pA
2cef0 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41  ggInfo->mxReg-pA
2cf00 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20  ggInfo->mnReg+1 
2cf10 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2cf20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d  pAggInfo->nColum
2cf30 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  n; i++){.    ass
2cf40 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ert( pAggInfo->a
2cf50 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67  Col[i].iMem>=pAg
2cf60 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20  gInfo->mnReg.   
2cf70 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66        && pAggInf
2cf80 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c  o->aCol[i].iMem<
2cf90 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67  =pAggInfo->mxReg
2cfa0 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   );.  }.  for(i=
2cfb0 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
2cfc0 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
2cfd0 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f  assert( pAggInfo
2cfe0 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e  ->aFunc[i].iMem>
2cff0 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67  =pAggInfo->mnReg
2d000 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41 67  .         && pAg
2d010 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e  gInfo->aFunc[i].
2d020 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem<=pAggInfo->
2d030 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e  mxReg );.  }.#en
2d040 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64 62  dif.  sqlite3Vdb
2d050 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75  eAddOp3(v, OP_Nu
2d060 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d  ll, 0, pAggInfo-
2d070 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66 6f  >mnReg, pAggInfo
2d080 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72 28  ->mxReg);.  for(
2d090 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e  pFunc=pAggInfo->
2d0a0 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41  aFunc, i=0; i<pA
2d0b0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
2d0c0 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20  ++, pFunc++){.  
2d0d0 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44 69    if( pFunc->iDi
2d0e0 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
2d0f0 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 46     Expr *pE = pF
2d100 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  unc->pExpr;.    
2d110 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
2d120 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
2d130 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2d140 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78 2e        if( pE->x.
2d150 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e  pList==0 || pE->
2d160 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  x.pList->nExpr!=
2d170 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
2d180 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2d190 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20 61  rse, "DISTINCT a
2d1a0 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20 68  ggregates must h
2d1b0 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  ave exactly one 
2d1c0 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 72  ".           "ar
2d1d0 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20 20  gument");.      
2d1e0 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e    pFunc->iDistin
2d1f0 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  ct = -1;.      }
2d200 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b 65  else{.        Ke
2d210 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
2d220 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
2d230 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45  rList(pParse, pE
2d240 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30 29  ->x.pList, 0, 0)
2d250 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2d260 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
2d270 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
2d280 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
2d290 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  t, 0, 0,.       
2d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2b0 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
2d2c0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
2d2d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2d2e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f   }.}../*.** Invo
2d2f0 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e  ke the OP_AggFin
2d300 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72  alize opcode for
2d310 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65   every aggregate
2d320 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
2d330 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75  the AggInfo stru
2d340 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
2d350 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67   void finalizeAg
2d360 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65  gFunctions(Parse
2d370 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
2d380 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
2d390 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
2d3a0 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
2d3b0 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
2d3c0 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66  fo_func *pF;.  f
2d3d0 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
2d3e0 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
2d3f0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
2d400 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45  ++, pF++){.    E
2d410 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
2d420 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c   pF->pExpr->x.pL
2d430 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
2d440 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2d450 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f  y(pF->pExpr, EP_
2d460 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
2d470 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2d480 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e  Op2(v, OP_AggFin
2d490 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c  al, pF->iMem, pL
2d4a0 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
2d4b0 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 73 71 6c  pr : 0);.    sql
2d4c0 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50 34  ite3VdbeAppendP4
2d4d0 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20 50  (v, pF->pFunc, P
2d4e0 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a  4_FUNCDEF);.  }.
2d4f0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
2d500 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  the accumulator 
2d510 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72  memory cells for
2d520 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62 61   an aggregate ba
2d530 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75  sed on.** the cu
2d540 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
2d550 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ition..*/.static
2d560 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63 75   void updateAccu
2d570 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70  mulator(Parse *p
2d580 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
2d590 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
2d5a0 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
2d5b0 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
2d5c0 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b   int regHit = 0;
2d5d0 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74 54 65  .  int addrHitTe
2d5e0 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74  st = 0;.  struct
2d5f0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
2d600 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  F;.  struct AggI
2d610 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20  nfo_col *pC;..  
2d620 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
2d630 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28  Mode = 1;.  for(
2d640 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
2d650 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
2d660 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
2d670 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   pF++){.    int 
2d680 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64  nArg;.    int ad
2d690 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  drNext = 0;.    
2d6a0 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20  int regAgg;.    
2d6b0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
2d6c0 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
2d6d0 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
2d6e0 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2d6f0 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
2d700 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
2d710 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a     if( pList ){.
2d720 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69        nArg = pLi
2d730 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
2d740 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65   regAgg = sqlite
2d750 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50  3GetTempRange(pP
2d760 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20  arse, nArg);.   
2d770 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2d780 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
2d790 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67  e, pList, regAgg
2d7a0 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c  , 0, SQLITE_ECEL
2d7b0 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _DUP);.    }else
2d7c0 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
2d7d0 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
2d7e0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
2d7f0 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
2d800 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
2d810 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
2d820 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2d830 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2d840 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20 45  nArg==0 );  /* E
2d850 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 2a  rror condition *
2d860 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
2d870 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f 2a  ( nArg>1 );   /*
2d880 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20 2a   Also an error *
2d890 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73 74  /.      codeDist
2d8a0 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d  inct(pParse, pF-
2d8b0 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72  >iDistinct, addr
2d8c0 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29  Next, 1, regAgg)
2d8d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d8e0 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46  pF->pFunc->funcF
2d8f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
2d900 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20  NC_NEEDCOLL ){. 
2d910 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
2d920 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  oll = 0;.      s
2d930 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
2d940 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
2d950 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61    int j;.      a
2d960 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
2d970 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20  );  /* pList!=0 
2d980 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73  if pF->pFunc has
2d990 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20   NEEDCOLL */.   
2d9a0 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65     for(j=0, pIte
2d9b0 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f  m=pList->a; !pCo
2d9c0 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b  ll && j<nArg; j+
2d9d0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2d9e0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
2d9f0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
2da00 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
2da10 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Expr);.      }. 
2da20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
2da30 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  ){.        pColl
2da40 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
2da50 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
2da60 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 48  }.      if( regH
2da70 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66  it==0 && pAggInf
2da80 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20  o->nAccumulator 
2da90 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61  ) regHit = ++pPa
2daa0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2dab0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2dac0 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71  p4(v, OP_CollSeq
2dad0 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20  , regHit, 0, 0, 
2dae0 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50  (char *)pColl, P
2daf0 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20  4_COLLSEQ);.    
2db00 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
2db10 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 67  eAddOp3(v, OP_Ag
2db20 67 53 74 65 70 30 2c 20 30 2c 20 72 65 67 41 67  gStep0, 0, regAg
2db30 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20 20  g, pF->iMem);.  
2db40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
2db50 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46 75  endP4(v, pF->pFu
2db60 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b  nc, P4_FUNCDEF);
2db70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2db80 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
2db90 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  nArg);.    sqlit
2dba0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
2dbb0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
2dbc0 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b  , regAgg, nArg);
2dbd0 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
2dbe0 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
2dbf0 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72  rse, regAgg, nAr
2dc00 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72  g);.    if( addr
2dc10 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71  Next ){.      sq
2dc20 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2dc30 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78  Label(v, addrNex
2dc40 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
2dc50 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2dc60 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
2dc70 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20   }..  /* Before 
2dc80 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61  populating the a
2dc90 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73  ccumulator regis
2dca0 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20  ters, clear the 
2dcb0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20  column cache..  
2dcc0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
2dcd0 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75   any of the requ
2dce0 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  ired column valu
2dcf0 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  es are already p
2dd00 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20  resent .  ** in 
2dd10 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74  registers, sqlit
2dd20 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79  e3ExprCode() may
2dd30 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f   use OP_SCopy to
2dd40 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a   copy the value.
2dd50 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d    ** to pC->iMem
2dd60 2e 20 42 75 74 20 62 79 20 74 68 65 20 74 69 6d  . But by the tim
2dd70 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 75  e the value is u
2dd80 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  sed, the origina
2dd90 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20  l register.  ** 
2dda0 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 73  may have been us
2ddb0 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67  ed, invalidating
2ddc0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
2ddd0 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74  buffer holding t
2dde0 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20  he.  ** text or 
2ddf0 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20  blob value. See 
2de00 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63  ticket [883034dc
2de10 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  b5]..  **.  ** A
2de20 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20  nother solution 
2de30 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e  would be to chan
2de40 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20  ge the OP_SCopy 
2de50 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63  used to copy cac
2de60 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20  hed.  ** values 
2de70 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20  to an OP_Copy.. 
2de80 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74   */.  if( regHit
2de90 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54   ){.    addrHitT
2dea0 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
2deb0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
2dec0 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62 65 43  , regHit); VdbeC
2ded0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
2dee0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2def0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2df00 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70  .  for(i=0, pC=p
2df10 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69  AggInfo->aCol; i
2df20 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75  <pAggInfo->nAccu
2df30 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43  mulator; i++, pC
2df40 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
2df50 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
2df60 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e   pC->pExpr, pC->
2df70 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67  iMem);.  }.  pAg
2df80 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
2df90 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
2dfa0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2dfb0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64  Parse);.  if( ad
2dfc0 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20  drHitTest ){.   
2dfd0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2dfe0 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74 54  Here(v, addrHitT
2dff0 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  est);.  }.}../*.
2e000 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20  ** Add a single 
2e010 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
2e020 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44  uction to the VD
2e030 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20  BE to explain a 
2e040 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28  simple.** count(
2e050 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43  *) query ("SELEC
2e060 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2e070 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64  pTab")..*/.#ifnd
2e080 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
2e090 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f  XPLAIN.static vo
2e0a0 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  id explainSimple
2e0b0 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  Count(.  Parse *
2e0c0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2e0d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
2e0e0 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
2e0f0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
2e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e110 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75  * Table being qu
2e120 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  eried */.  Index
2e130 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
2e140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2e150 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69  dex used to opti
2e160 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55  mize scan, or NU
2e170 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  LL */.){.  if( p
2e180 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
2e190 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43 6f  2 ){.    int bCo
2e1a0 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20 26  ver = (pIdx!=0 &
2e1b0 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62  & (HasRowid(pTab
2e1c0 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79 4b  ) || !IsPrimaryK
2e1d0 65 79 49 6e 64 65 78 28 70 49 64 78 29 29 29 3b  eyIndex(pIdx)));
2e1e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2e1f0 45 78 70 6c 61 69 6e 28 70 50 61 72 73 65 2c 20  Explain(pParse, 
2e200 30 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25  0, "SCAN TABLE %
2e210 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s%s%s",.        
2e220 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  pTab->zName,.   
2e230 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22 20       bCover ? " 
2e240 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49  USING COVERING I
2e250 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20  NDEX " : "",.   
2e260 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70 49       bCover ? pI
2e270 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a 20  dx->zName : "". 
2e280 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73     );.  }.}.#els
2e290 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  e.# define expla
2e2a0 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c  inSimpleCount(a,
2e2b0 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  b,c).#endif../*.
2e2c0 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  ** sqlite3WalkEx
2e2d0 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75 73  pr() callback us
2e2e0 65 64 20 62 79 20 68 61 76 69 6e 67 54 6f 57 68  ed by havingToWh
2e2f0 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ere()..**.** If 
2e300 74 68 65 20 6e 6f 64 65 20 70 61 73 73 65 64 20  the node passed 
2e310 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
2e320 69 73 20 61 20 54 4b 5f 41 4e 44 20 6e 6f 64 65  is a TK_AND node
2e330 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 57 52 43  , return .** WRC
2e340 5f 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 65 6c  _Continue to tel
2e350 6c 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70  l sqlite3WalkExp
2e360 72 28 29 20 74 6f 20 69 74 65 72 61 74 65 20 74  r() to iterate t
2e370 68 72 6f 75 67 68 20 63 68 69 6c 64 20 6e 6f 64  hrough child nod
2e380 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  es..**.** Otherw
2e390 69 73 65 2c 20 72 65 74 75 72 6e 20 57 52 43 5f  ise, return WRC_
2e3a0 50 72 75 6e 65 2e 20 49 6e 20 74 68 69 73 20 63  Prune. In this c
2e3b0 61 73 65 2c 20 61 6c 73 6f 20 63 68 65 63 6b 20  ase, also check 
2e3c0 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d 65  if the .** sub-e
2e3d0 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65  xpression matche
2e3e0 73 20 74 68 65 20 63 72 69 74 65 72 69 61 20 66  s the criteria f
2e3f0 6f 72 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74  or being moved t
2e400 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20 63  o the WHERE.** c
2e410 6c 61 75 73 65 2e 20 49 66 20 73 6f 2c 20 61 64  lause. If so, ad
2e420 64 20 69 74 20 74 6f 20 74 68 65 20 57 48 45 52  d it to the WHER
2e430 45 20 63 6c 61 75 73 65 20 61 6e 64 20 72 65 70  E clause and rep
2e440 6c 61 63 65 20 74 68 65 20 73 75 62 2d 65 78 70  lace the sub-exp
2e450 72 65 73 73 69 6f 6e 0a 2a 2a 20 77 69 74 68 69  ression.** withi
2e460 6e 20 74 68 65 20 48 41 56 49 4e 47 20 65 78 70  n the HAVING exp
2e470 72 65 73 73 69 6f 6e 20 77 69 74 68 20 61 20 63  ression with a c
2e480 6f 6e 73 74 61 6e 74 20 22 31 22 2e 0a 2a 2f 0a  onstant "1"..*/.
2e490 73 74 61 74 69 63 20 69 6e 74 20 68 61 76 69 6e  static int havin
2e4a0 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 28 57  gToWhereExprCb(W
2e4b0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2e4c0 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2e4d0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
2e4e0 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 53 65 6c  K_AND ){.    Sel
2e4f0 65 63 74 20 2a 70 53 20 3d 20 70 57 61 6c 6b 65  ect *pS = pWalke
2e500 72 2d 3e 75 2e 70 53 65 6c 65 63 74 3b 0a 20 20  r->u.pSelect;.  
2e510 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
2e520 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72 6f  rIsConstantOrGro
2e530 75 70 42 79 28 70 57 61 6c 6b 65 72 2d 3e 70 50  upBy(pWalker->pP
2e540 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53 2d  arse, pExpr, pS-
2e550 3e 70 47 72 6f 75 70 42 79 29 20 29 7b 0a 20 20  >pGroupBy) ){.  
2e560 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
2e570 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
2e580 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 45 78 70  e->db;.      Exp
2e590 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
2e5a0 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
2e5b0 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c 69  K_INTEGER, &sqli
2e5c0 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d 2c  te3IntTokens[1],
2e5d0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
2e5e0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 45  New ){.        E
2e5f0 78 70 72 20 2a 70 57 68 65 72 65 20 3d 20 70 53  xpr *pWhere = pS
2e600 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20  ->pWhere;.      
2e610 20 20 53 57 41 50 28 45 78 70 72 2c 20 2a 70 4e    SWAP(Expr, *pN
2e620 65 77 2c 20 2a 70 45 78 70 72 29 3b 0a 20 20 20  ew, *pExpr);.   
2e630 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
2e640 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
2e650 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20 20  Where, pNew);.  
2e660 20 20 20 20 20 20 70 53 2d 3e 70 57 68 65 72 65        pS->pWhere
2e670 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
2e680 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20   pWalker->eCode 
2e690 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
2e6a0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52   }.    return WR
2e6b0 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 72  C_Prune;.  }.  r
2e6c0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2e6d0 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61  ue;.}../*.** Tra
2e6e0 6e 73 66 65 72 20 65 6c 69 67 69 62 6c 65 20 74  nsfer eligible t
2e6f0 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 48 41  erms from the HA
2e700 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  VING clause of a
2e710 20 71 75 65 72 79 2c 20 77 68 69 63 68 20 69 73   query, which is
2e720 0a 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 61 66  .** processed af
2e730 74 65 72 20 67 72 6f 75 70 69 6e 67 2c 20 74 6f  ter grouping, to
2e740 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2e750 65 2c 20 77 68 69 63 68 20 69 73 20 70 72 6f 63  e, which is proc
2e760 65 73 73 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  essed before.** 
2e770 67 72 6f 75 70 69 6e 67 2e 20 46 6f 72 20 65 78  grouping. For ex
2e780 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72 79  ample, the query
2e790 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
2e7a0 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73 3e   * FROM <tables>
2e7b0 20 57 48 45 52 45 20 61 3d 3f 20 47 52 4f 55 50   WHERE a=? GROUP
2e7c0 20 42 59 20 62 20 48 41 56 49 4e 47 20 62 3d 3f   BY b HAVING b=?
2e7d0 20 41 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20 63   AND c=?.**.** c
2e7e0 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20  an be rewritten 
2e7f0 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45  as:.**.**   SELE
2e800 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65  CT * FROM <table
2e810 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44  s> WHERE a=? AND
2e820 20 62 3d 3f 20 47 52 4f 55 50 20 42 59 20 62 20   b=? GROUP BY b 
2e830 48 41 56 49 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a 2a  HAVING c=?.**.**
2e840 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20 48   A term of the H
2e850 41 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  AVING expression
2e860 20 69 73 20 65 6c 69 67 69 62 6c 65 20 66 6f 72   is eligible for
2e870 20 74 72 61 6e 73 66 65 72 20 69 66 20 69 74 20   transfer if it 
2e880 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 65 6e 74 69  consists.** enti
2e890 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e 74  rely of constant
2e8a0 73 20 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e  s and expression
2e8b0 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20  s that are also 
2e8c0 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 74  GROUP BY terms t
2e8d0 68 61 74 0a 2a 2a 20 75 73 65 20 74 68 65 20 22  hat.** use the "
2e8e0 42 49 4e 41 52 59 22 20 63 6f 6c 6c 61 74 69 6f  BINARY" collatio
2e8f0 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73  n sequence..*/.s
2e900 74 61 74 69 63 20 76 6f 69 64 20 68 61 76 69 6e  tatic void havin
2e910 67 54 6f 57 68 65 72 65 28 50 61 72 73 65 20 2a  gToWhere(Parse *
2e920 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
2e930 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61  p){.  Walker sWa
2e940 6c 6b 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26  lker;.  memset(&
2e950 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65  sWalker, 0, size
2e960 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20 20  of(sWalker));.  
2e970 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d  sWalker.pParse =
2e980 20 70 50 61 72 73 65 3b 0a 20 20 73 57 61 6c 6b   pParse;.  sWalk
2e990 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
2e9a0 20 3d 20 68 61 76 69 6e 67 54 6f 57 68 65 72 65   = havingToWhere
2e9b0 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b 65  ExprCb;.  sWalke
2e9c0 72 2e 75 2e 70 53 65 6c 65 63 74 20 3d 20 70 3b  r.u.pSelect = p;
2e9d0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
2e9e0 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70 2d 3e  pr(&sWalker, p->
2e9f0 70 48 61 76 69 6e 67 29 3b 0a 23 69 66 20 53 45  pHaving);.#if SE
2ea00 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45  LECTTRACE_ENABLE
2ea10 44 0a 20 20 69 66 28 20 73 57 61 6c 6b 65 72 2e  D.  if( sWalker.
2ea20 65 43 6f 64 65 20 26 26 20 28 73 71 6c 69 74 65  eCode && (sqlite
2ea30 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
2ea40 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  x100)!=0 ){.    
2ea50 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31 30  SELECTTRACE(0x10
2ea60 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 4d 6f 76  0,pParse,p,("Mov
2ea70 65 20 48 41 56 49 4e 47 20 74 65 72 6d 73 20 69  e HAVING terms i
2ea80 6e 74 6f 20 57 48 45 52 45 3a 5c 6e 22 29 29 3b  nto WHERE:\n"));
2ea90 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
2eaa0 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
2eab0 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
2eac0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
2ead0 6f 20 73 65 65 20 69 66 20 74 68 65 20 70 54 68  o see if the pTh
2eae0 69 73 20 65 6e 74 72 79 20 6f 66 20 70 54 61 62  is entry of pTab
2eaf0 4c 69 73 74 20 69 73 20 61 20 73 65 6c 66 2d 6a  List is a self-j
2eb00 6f 69 6e 20 6f 66 20 61 20 70 72 69 6f 72 20 76  oin of a prior v
2eb10 69 65 77 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73  iew..** If it is
2eb20 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  , then return th
2eb30 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 66  e SrcList_item f
2eb40 6f 72 20 74 68 65 20 70 72 69 6f 72 20 76 69 65  or the prior vie
2eb50 77 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  w.  If it is not
2eb60 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e  ,.** then return
2eb70 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74   0..*/.static st
2eb80 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2eb90 6d 20 2a 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65  m *isSelfJoinVie
2eba0 77 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  w(.  SrcList *pT
2ebb0 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  abList,         
2ebc0 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
2ebd0 73 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20 74 68  self-joins in th
2ebe0 69 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  is FROM clause *
2ebf0 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
2ec00 73 74 5f 69 74 65 6d 20 2a 70 54 68 69 73 20 20  st_item *pThis  
2ec10 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70   /* Search for p
2ec20 72 69 6f 72 20 72 65 66 65 72 65 6e 63 65 20 74  rior reference t
2ec30 6f 20 74 68 69 73 20 73 75 62 71 75 65 72 79 20  o this subquery 
2ec40 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
2ec50 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2ec60 65 6d 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 20  em;.  for(pItem 
2ec70 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 70  = pTabList->a; p
2ec80 49 74 65 6d 3c 70 54 68 69 73 3b 20 70 49 74 65  Item<pThis; pIte
2ec90 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49  m++){.    if( pI
2eca0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  tem->pSelect==0 
2ecb0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2ecc0 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69  if( pItem->fg.vi
2ecd0 61 43 6f 72 6f 75 74 69 6e 65 20 29 20 63 6f 6e  aCoroutine ) con
2ece0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
2ecf0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  Item->zName==0 )
2ed00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
2ed10 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
2ed20 6d 70 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  mp(pItem->zDatab
2ed30 61 73 65 2c 20 70 54 68 69 73 2d 3e 7a 44 61 74  ase, pThis->zDat
2ed40 61 62 61 73 65 29 21 3d 30 20 29 20 63 6f 6e 74  abase)!=0 ) cont
2ed50 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 71  inue;.    if( sq
2ed60 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 49  lite3_stricmp(pI
2ed70 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 68 69  tem->zName, pThi
2ed80 73 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 20 63  s->zName)!=0 ) c
2ed90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2eda0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
2edb0 61 72 65 28 30 2c 20 0a 20 20 20 20 20 20 20 20  are(0, .        
2edc0 20 20 70 54 68 69 73 2d 3e 70 53 65 6c 65 63 74    pThis->pSelect
2edd0 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d  ->pWhere, pItem-
2ede0 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72 65  >pSelect->pWhere
2edf0 2c 20 2d 31 29 20 0a 20 20 20 20 29 7b 0a 20 20  , -1) .    ){.  
2ee00 20 20 20 20 2f 2a 20 54 68 65 20 76 69 65 77 20      /* The view 
2ee10 77 61 73 20 6d 6f 64 69 66 69 65 64 20 62 79 20  was modified by 
2ee20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74 69 6d  some other optim
2ee30 69 7a 61 74 69 6f 6e 20 73 75 63 68 20 61 73 0a  ization such as.
2ee40 20 20 20 20 20 20 2a 2a 20 70 75 73 68 44 6f 77        ** pushDow
2ee50 6e 57 68 65 72 65 54 65 72 6d 73 28 29 20 2a 2f  nWhereTerms() */
2ee60 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
2ee70 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
2ee80 6e 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20 20 72  n pItem;.  }.  r
2ee90 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64  eturn 0;.}..#ifd
2eea0 65 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54 4f  ef SQLITE_COUNTO
2eeb0 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54 49  FVIEW_OPTIMIZATI
2eec0 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  ON./*.** Attempt
2eed0 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20   to transform a 
2eee0 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72  query of the for
2eef0 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  m.**.**    SELEC
2ef00 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2ef10 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  (SELECT x FROM t
2ef20 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  1 UNION ALL SELE
2ef30 43 54 20 79 20 46 52 4f 4d 20 74 32 29 0a 2a 2a  CT y FROM t2).**
2ef40 0a 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a 0a 2a  .** Into this:.*
2ef50 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 28  *.**    SELECT (
2ef60 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
2ef70 46 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45 43 54  FROM t1)+(SELECT
2ef80 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
2ef90 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 72 61  2).**.** The tra
2efa0 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 6c 79  nsformation only
2efb0 20 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20 6f 66   works if all of
2efc0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
2efd0 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
2efe0 20 2a 20 20 54 68 65 20 73 75 62 71 75 65 72 79   *  The subquery
2eff0 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   is a UNION ALL 
2f000 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74  of two or more t
2f010 65 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54 68 65  erms.**   *  The
2f020 72 65 20 69 73 20 6e 6f 20 57 48 45 52 45 20 6f  re is no WHERE o
2f030 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48 41  r GROUP BY or HA
2f040 56 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 6e 20  VING clauses on 
2f050 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a 2a  the subqueries.*
2f060 2a 20 20 20 2a 20 20 54 68 65 20 6f 75 74 65 72  *   *  The outer
2f070 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d 70   query is a simp
2f080 6c 65 20 63 6f 75 6e 74 28 2a 29 0a 2a 2a 0a 2a  le count(*).**.*
2f090 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
2f0a0 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
2f0b0 6e 20 69 73 20 75 6e 64 65 72 74 61 6b 65 6e 2e  n is undertaken.
2f0c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2f0d0 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d 69  ountOfViewOptimi
2f0e0 7a 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  zation(Parse *pP
2f0f0 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29  arse, Select *p)
2f100 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  {.  Select *pSub
2f110 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 45 78 70  , *pPrior;.  Exp
2f120 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70 72  r *pExpr;.  Expr
2f130 20 2a 70 43 6f 75 6e 74 3b 0a 20 20 73 71 6c 69   *pCount;.  sqli
2f140 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 28  te3 *db;.  if( (
2f150 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2f160 5f 41 67 67 72 65 67 61 74 65 29 3d 3d 30 20 29  _Aggregate)==0 )
2f170 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20   return 0;   /* 
2f180 54 68 69 73 20 69 73 20 61 6e 20 61 67 67 72 65  This is an aggre
2f190 67 61 74 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d  gate */.  if( p-
2f1a0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
2f1b0 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
2f1c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2f1d0 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c  ingle result col
2f1e0 75 6d 6e 20 2a 2f 0a 20 20 70 45 78 70 72 20 3d  umn */.  pExpr =
2f1f0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
2f200 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45  .pExpr;.  if( pE
2f210 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
2f220 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
2f230 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  n 0;        /* R
2f240 65 73 75 6c 74 20 69 73 20 61 6e 20 61 67 67 72  esult is an aggr
2f250 65 67 61 74 65 20 2a 2f 0a 20 20 69 66 28 20 73  egate */.  if( s
2f260 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70  qlite3_stricmp(p
2f270 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22  Expr->u.zToken,"
2f280 63 6f 75 6e 74 22 29 20 29 20 72 65 74 75 72 6e  count") ) return
2f290 20 30 3b 20 20 2f 2a 20 49 73 20 63 6f 75 6e 74   0;  /* Is count
2f2a0 28 29 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  () */.  if( pExp
2f2b0 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 29 20  r->x.pList!=0 ) 
2f2c0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
2f2d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
2f2e0 74 20 62 65 20 63 6f 75 6e 74 28 2a 29 20 2a 2f  t be count(*) */
2f2f0 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 2d 3e  .  if( p->pSrc->
2f300 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e  nSrc!=1 ) return
2f310 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2f320 20 20 20 20 20 2f 2a 20 4f 6e 65 20 74 61 62 6c       /* One tabl
2f330 65 20 69 6e 20 46 52 4f 4d 20 20 2a 2f 0a 20 20  e in FROM  */.  
2f340 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pSub = p->pSrc->
2f350 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[0].pSelect;.  
2f360 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 72 65  if( pSub==0 ) re
2f370 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
2f380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f390 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 69 73    /* The FROM is
2f3a0 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20   a subquery */. 
2f3b0 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f   if( pSub->pPrio
2f3c0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
2f3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3e0 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 61 20     /* Must be a 
2f3f0 63 6f 6d 70 6f 75 6e 64 20 72 79 20 2a 2f 0a 20  compound ry */. 
2f400 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 53 75   do{.    if( pSu
2f410 62 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26  b->op!=TK_ALL &&
2f420 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 20   pSub->pPrior ) 
2f430 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d 75  return 0;  /* Mu
2f440 73 74 20 62 65 20 55 4e 49 4f 4e 20 41 4c 4c 20  st be UNION ALL 
2f450 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  */.    if( pSub-
2f460 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
2f470 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2f480 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 57           /* No W
2f490 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
2f4a0 20 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c     if( pSub->sel
2f4b0 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
2f4c0 67 61 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b  gate ) return 0;
2f4d0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6e 20 61       /* Not an a
2f4e0 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 20 20  ggregate */.    
2f4f0 70 53 75 62 20 3d 20 70 53 75 62 2d 3e 70 50 72  pSub = pSub->pPr
2f500 69 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ior;            
2f510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f520 20 20 2f 2a 20 52 65 70 65 61 74 20 6f 76 65 72    /* Repeat over
2f530 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 7d   compound */.  }
2f540 77 68 69 6c 65 28 20 70 53 75 62 20 29 3b 0a 0a  while( pSub );..
2f550 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
2f560 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 6e   this point then
2f570 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 70 65 72   it is OK to per
2f580 66 6f 72 6d 20 74 68 65 20 74 72 61 6e 73 66 6f  form the transfo
2f590 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64 62  rmation */..  db
2f5a0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
2f5b0 20 70 43 6f 75 6e 74 20 3d 20 70 45 78 70 72 3b   pCount = pExpr;
2f5c0 0a 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  .  pExpr = 0;.  
2f5d0 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pSub = p->pSrc->
2f5e0 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[0].pSelect;.  
2f5f0 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
2f600 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73 71 6c  elect = 0;.  sql
2f610 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
2f620 65 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b 0a  e(db, p->pSrc);.
2f630 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69    p->pSrc = sqli
2f640 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
2f650 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
2f660 6f 66 28 2a 70 2d 3e 70 53 72 63 29 29 3b 0a 20  of(*p->pSrc));. 
2f670 20 77 68 69 6c 65 28 20 70 53 75 62 20 29 7b 0a   while( pSub ){.
2f680 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d 3b      Expr *pTerm;
2f690 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 53  .    pPrior = pS
2f6a0 75 62 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20  ub->pPrior;.    
2f6b0 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 3d 20 30  pSub->pPrior = 0
2f6c0 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4e 65 78  ;.    pSub->pNex
2f6d0 74 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62 2d  t = 0;.    pSub-
2f6e0 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
2f6f0 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 70  Aggregate;.    p
2f700 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d  Sub->selFlags &=
2f710 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20   ~SF_Compound;. 
2f720 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74     pSub->nSelect
2f730 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  Row = 0;.    sql
2f740 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2f750 74 65 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c  te(db, pSub->pEL
2f760 69 73 74 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  ist);.    pTerm 
2f770 3d 20 70 50 72 69 6f 72 20 3f 20 73 71 6c 69 74  = pPrior ? sqlit
2f780 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 43  e3ExprDup(db, pC
2f790 6f 75 6e 74 2c 20 30 29 20 3a 20 70 43 6f 75 6e  ount, 0) : pCoun
2f7a0 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 45 4c  t;.    pSub->pEL
2f7b0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
2f7c0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
2f7d0 73 65 2c 20 30 2c 20 70 54 65 72 6d 29 3b 0a 20  se, 0, pTerm);. 
2f7e0 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69 74     pTerm = sqlit
2f7f0 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
2f800 54 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 29  TK_SELECT, 0, 0)
2f810 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 45 78  ;.    sqlite3PEx
2f820 70 72 41 64 64 53 65 6c 65 63 74 28 70 50 61 72  prAddSelect(pPar
2f830 73 65 2c 20 70 54 65 72 6d 2c 20 70 53 75 62 29  se, pTerm, pSub)
2f840 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 3d  ;.    if( pExpr=
2f850 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  =0 ){.      pExp
2f860 72 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d  r = pTerm;.    }
2f870 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70  else{.      pExp
2f880 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
2f890 28 70 50 61 72 73 65 2c 20 54 4b 5f 50 4c 55 53  (pParse, TK_PLUS
2f8a0 2c 20 70 54 65 72 6d 2c 20 70 45 78 70 72 29 3b  , pTerm, pExpr);
2f8b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 20  .    }.    pSub 
2f8c0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20  = pPrior;.  }.  
2f8d0 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  p->pEList->a[0].
2f8e0 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
2f8f0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
2f900 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 0a  ~SF_Aggregate;..
2f910 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
2f920 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
2f930 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
2f940 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
2f950 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30  SELECTTRACE(0x40
2f960 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
2f970 65 72 20 63 6f 75 6e 74 2d 6f 66 2d 76 69 65 77  er count-of-view
2f980 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 5c 6e   optimization:\n
2f990 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
2f9a0 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28 30  TreeViewSelect(0
2f9b0 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , p, 0);.  }.#en
2f9c0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  dif.  return 1;.
2f9d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2f9e0 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f  TE_COUNTOFVIEW_O
2f9f0 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a  PTIMIZATION */..
2fa00 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
2fa10 69 6e 64 6f 77 52 65 77 72 69 74 65 20 57 69 6e  indowRewrite Win
2fa20 64 6f 77 52 65 77 72 69 74 65 3b 0a 73 74 72 75  dowRewrite;.stru
2fa30 63 74 20 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ct WindowRewrite
2fa40 20 7b 0a 20 20 57 69 6e 64 6f 77 20 2a 70 57 69   {.  Window *pWi
2fa50 6e 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  n;.  ExprList *p
2fa60 53 75 62 3b 0a 7d 3b 0a 0a 73 74 61 74 69 63 20  Sub;.};..static 
2fa70 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f 77  int selectWindow
2fa80 52 65 77 72 69 74 65 53 65 6c 65 63 74 43 62 28  RewriteSelectCb(
2fa90 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2faa0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
2fab0 29 7b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  ){.  return WRC_
2fac0 50 72 75 6e 65 3b 0a 7d 0a 0a 73 74 61 74 69 63  Prune;.}..static
2fad0 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64 6f   int selectWindo
2fae0 77 52 65 77 72 69 74 65 45 78 70 72 43 62 28 57  wRewriteExprCb(W
2faf0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
2fb00 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
2fb10 73 74 72 75 63 74 20 57 69 6e 64 6f 77 52 65 77  struct WindowRew
2fb20 72 69 74 65 20 2a 70 20 3d 20 70 57 61 6c 6b 65  rite *p = pWalke
2fb30 72 2d 3e 75 2e 70 52 65 77 72 69 74 65 3b 0a 20  r->u.pRewrite;. 
2fb40 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
2fb50 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
2fb60 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 57 52 43  ;.  int rc = WRC
2fb70 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 73 77  _Continue;..  sw
2fb80 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
2fb90 29 7b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ){..    case TK_
2fba0 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
2fbb0 69 66 28 20 70 45 78 70 72 2d 3e 70 57 69 6e 3d  if( pExpr->pWin=
2fbc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  =0 ){.        br
2fbd0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
2fbe0 20 69 66 28 20 70 45 78 70 72 2d 3e 70 57 69 6e   if( pExpr->pWin
2fbf0 3d 3d 70 2d 3e 70 57 69 6e 20 29 7b 0a 20 20 20  ==p->pWin ){.   
2fc00 20 20 20 20 20 72 63 20 3d 20 57 52 43 5f 50 72       rc = WRC_Pr
2fc10 75 6e 65 3b 0a 20 20 20 20 20 20 20 20 70 45 78  une;.        pEx
2fc20 70 72 2d 3e 70 57 69 6e 2d 3e 70 4f 77 6e 65 72  pr->pWin->pOwner
2fc30 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
2fc40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2fc50 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
2fc60 68 72 6f 75 67 68 2e 20 20 2a 2f 0a 0a 20 20 20  hrough.  */..   
2fc70 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
2fc80 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
2fc90 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
2fca0 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
2fcb0 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
2fcc0 20 20 70 2d 3e 70 53 75 62 20 3d 20 73 71 6c 69    p->pSub = sqli
2fcd0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
2fce0 64 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 53 75  d(pParse, p->pSu
2fcf0 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  b, pDup);.      
2fd00 69 66 28 20 70 2d 3e 70 53 75 62 20 29 7b 0a 20  if( p->pSub ){. 
2fd10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45         assert( E
2fd20 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2fd30 45 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29  Expr, EP_Static)
2fd40 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 45  ==0 );.        E
2fd50 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
2fd60 45 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29  Expr, EP_Static)
2fd70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2fd80 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
2fd90 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 29 3b 0a  se->db, pExpr);.
2fda0 20 20 20 20 20 20 20 20 45 78 70 72 43 6c 65 61          ExprClea
2fdb0 72 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  rProperty(pExpr,
2fdc0 20 45 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 20   EP_Static);.   
2fdd0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 45 78 70       memset(pExp
2fde0 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70  r, 0, sizeof(Exp
2fdf0 72 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 45  r));..        pE
2fe00 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
2fe10 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 70 45 78  UMN;.        pEx
2fe20 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 2d  pr->iColumn = p-
2fe30 3e 70 53 75 62 2d 3e 6e 45 78 70 72 2d 31 3b 0a  >pSub->nExpr-1;.
2fe40 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
2fe50 54 61 62 6c 65 20 3d 20 70 2d 3e 70 57 69 6e 2d  Table = p->pWin-
2fe60 3e 69 45 70 68 43 73 72 3b 0a 20 20 20 20 20 20  >iEphCsr;.      
2fe70 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  }..      break;.
2fe80 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61 75      }..    defau
2fe90 6c 74 3a 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a  lt: /* no-op */.
2fea0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
2feb0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2fec0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  ..static int sel
2fed0 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ectWindowRewrite
2fee0 45 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  EList(.  Parse *
2fef0 70 50 61 72 73 65 2c 20 0a 20 20 57 69 6e 64 6f  pParse, .  Windo
2ff00 77 20 2a 70 57 69 6e 2c 0a 20 20 45 78 70 72 4c  w *pWin,.  ExprL
2ff10 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
2ff20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2ff30 77 72 69 74 65 20 65 78 70 72 65 73 73 69 6f 6e  write expression
2ff40 73 20 69 6e 20 74 68 69 73 20 6c 69 73 74 20 2a  s in this list *
2ff50 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70  /.  ExprList **p
2ff60 70 53 75 62 20 20 20 20 20 20 20 20 20 20 20 20  pSub            
2ff70 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53      /* IN/OUT: S
2ff80 75 62 2d 73 65 6c 65 63 74 20 65 78 70 72 65 73  ub-select expres
2ff90 73 69 6f 6e 2d 6c 69 73 74 20 2a 2f 0a 29 7b 0a  sion-list */.){.
2ffa0 20 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72    Walker sWalker
2ffb0 3b 0a 20 20 57 69 6e 64 6f 77 52 65 77 72 69 74  ;.  WindowRewrit
2ffc0 65 20 73 52 65 77 72 69 74 65 3b 0a 20 20 69 6e  e sRewrite;.  in
2ffd0 74 20 72 63 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  t rc;..  memset(
2ffe0 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a  &sWalker, 0, siz
2fff0 65 6f 66 28 57 61 6c 6b 65 72 29 29 3b 0a 20 20  eof(Walker));.  
30000 6d 65 6d 73 65 74 28 26 73 52 65 77 72 69 74 65  memset(&sRewrite
30010 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 69 6e 64  , 0, sizeof(Wind
30020 6f 77 52 65 77 72 69 74 65 29 29 3b 0a 0a 20 20  owRewrite));..  
30030 73 52 65 77 72 69 74 65 2e 70 53 75 62 20 3d 20  sRewrite.pSub = 
30040 2a 70 70 53 75 62 3b 0a 20 20 73 52 65 77 72 69  *ppSub;.  sRewri
30050 74 65 2e 70 57 69 6e 20 3d 20 70 57 69 6e 3b 0a  te.pWin = pWin;.
30060 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73  .  sWalker.pPars
30070 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57  e = pParse;.  sW
30080 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
30090 61 63 6b 20 3d 20 73 65 6c 65 63 74 57 69 6e 64  ack = selectWind
300a0 6f 77 52 65 77 72 69 74 65 45 78 70 72 43 62 3b  owRewriteExprCb;
300b0 0a 20 20 73 57 61 6c 6b 65 72 2e 78 53 65 6c 65  .  sWalker.xSele
300c0 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
300d0 65 63 74 57 69 6e 64 6f 77 52 65 77 72 69 74 65  ectWindowRewrite
300e0 53 65 6c 65 63 74 43 62 3b 0a 20 20 73 57 61 6c  SelectCb;.  sWal
300f0 6b 65 72 2e 75 2e 70 52 65 77 72 69 74 65 20 3d  ker.u.pRewrite =
30100 20 26 73 52 65 77 72 69 74 65 3b 0a 0a 20 20 72   &sRewrite;..  r
30110 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  c = sqlite3WalkE
30120 78 70 72 4c 69 73 74 28 26 73 57 61 6c 6b 65 72  xprList(&sWalker
30130 2c 20 70 45 4c 69 73 74 29 3b 0a 0a 20 20 2a 70  , pEList);..  *p
30140 70 53 75 62 20 3d 20 73 52 65 77 72 69 74 65 2e  pSub = sRewrite.
30150 70 53 75 62 3b 0a 20 20 72 65 74 75 72 6e 20 72  pSub;.  return r
30160 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 45 78 70  c;.}..static Exp
30170 72 4c 69 73 74 20 2a 65 78 70 72 4c 69 73 74 41  rList *exprListA
30180 70 70 65 6e 64 4c 69 73 74 28 0a 20 20 50 61 72  ppendList(.  Par
30190 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
301a0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
301b0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
301c0 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
301d0 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20       /* List to 
301e0 77 68 69 63 68 20 74 6f 20 61 70 70 65 6e 64 2e  which to append.
301f0 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
30200 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41  /.  ExprList *pA
30210 70 70 65 6e 64 20 20 20 20 20 20 20 2f 2a 20 4c  ppend       /* L
30220 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20 74 6f  ist of values to
30230 20 61 70 70 65 6e 64 2e 20 4d 69 67 68 74 20 62   append. Might b
30240 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  e NULL */.){.  i
30250 66 28 20 70 41 70 70 65 6e 64 20 29 7b 0a 20 20  f( pAppend ){.  
30260 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
30270 20 6e 49 6e 69 74 20 3d 20 70 4c 69 73 74 20 3f   nInit = pList ?
30280 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20   pList->nExpr : 
30290 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
302a0 69 3c 70 41 70 70 65 6e 64 2d 3e 6e 45 78 70 72  i<pAppend->nExpr
302b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
302c0 70 72 20 2a 70 44 75 70 20 3d 20 73 71 6c 69 74  pr *pDup = sqlit
302d0 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73 65  e3ExprDup(pParse
302e0 2d 3e 64 62 2c 20 70 41 70 70 65 6e 64 2d 3e 61  ->db, pAppend->a
302f0 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20  [i].pExpr, 0);. 
30300 20 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c       pList = sql
30310 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
30320 6e 64 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  nd(pParse, pList
30330 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 69  , pDup);.      i
30340 66 28 20 70 4c 69 73 74 20 29 20 70 4c 69 73 74  f( pList ) pList
30350 2d 3e 61 5b 6e 49 6e 69 74 2b 69 5d 2e 73 6f 72  ->a[nInit+i].sor
30360 74 4f 72 64 65 72 20 3d 20 70 41 70 70 65 6e 64  tOrder = pAppend
30370 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
30380 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
30390 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
303a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45  *.** If the SELE
303b0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  CT statement pas
303c0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
303d0 64 20 61 72 67 75 6d 65 6e 74 20 64 6f 65 73 20  d argument does 
303e0 6e 6f 74 20 69 6e 76 6f 6b 65 0a 2a 2a 20 61 6e  not invoke.** an
303f0 79 20 53 51 4c 20 77 69 6e 64 6f 77 20 66 75 6e  y SQL window fun
30400 63 74 69 6f 6e 73 2c 20 74 68 69 73 20 66 75 6e  ctions, this fun
30410 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
30420 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
30430 0a 2a 2a 20 72 65 77 72 69 74 65 73 20 74 68 65  .** rewrites the
30440 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
30450 74 20 73 6f 20 74 68 61 74 20 77 69 6e 64 6f 77  t so that window
30460 20 66 75 6e 63 74 69 6f 6e 20 78 53 74 65 70 20   function xStep 
30470 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65  functions.** are
30480 20 69 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20   invoked in the 
30490 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20 54  correct order. T
304a0 68 65 20 73 69 6d 70 6c 65 73 74 20 76 65 72 73  he simplest vers
304b0 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 74  ion of the .** t
304c0 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73  ransformation is
304d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
304e0 20 77 69 6e 28 61 72 67 73 2e 2e 2e 29 20 4f 56   win(args...) OV
304f0 45 52 20 28 3c 6c 69 73 74 31 3e 29 20 46 52 4f  ER (<list1>) FRO
30500 4d 20 3c 73 72 63 3e 20 4f 52 44 45 52 20 42 59  M <src> ORDER BY
30510 20 3c 6c 69 73 74 32 3e 0a 2a 2a 0a 2a 2a 20 74   <list2>.**.** t
30520 6f 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  o.**.**   SELECT
30530 20 77 69 6e 28 61 72 67 73 2e 2e 2e 29 20 46 52   win(args...) FR
30540 4f 4d 20 28 0a 2a 2a 20 20 20 20 20 53 45 4c 45  OM (.**     SELE
30550 43 54 20 61 72 67 73 2e 2e 2e 20 46 52 4f 4d 20  CT args... FROM 
30560 3c 73 72 63 3e 20 4f 52 44 45 52 20 42 59 20 3c  <src> ORDER BY <
30570 6c 69 73 74 31 3e 0a 2a 2a 20 20 20 29 20 4f 52  list1>.**   ) OR
30580 44 45 52 20 42 59 20 3c 6c 69 73 74 32 3e 0a 2a  DER BY <list2>.*
30590 2a 0a 2a 2a 20 77 68 65 72 65 20 3c 73 72 63 3e  *.** where <src>
305a0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48 45   may contain WHE
305b0 52 45 2c 20 47 52 4f 55 50 20 42 59 20 61 6e 64  RE, GROUP BY and
305c0 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 2c   HAVING clauses,
305d0 20 61 6e 64 20 3c 6c 69 73 74 31 3e 0a 2a 2a 20   and <list1>.** 
305e0 69 73 20 74 68 65 20 63 6f 6e 63 61 74 65 6e 61  is the concatena
305f0 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 41 52 54  tion of the PART
30600 49 54 49 4f 4e 20 42 59 20 61 6e 64 20 4f 52 44  ITION BY and ORD
30610 45 52 20 42 59 20 63 6c 61 75 73 65 73 20 69 6e  ER BY clauses in
30620 20 74 68 65 0a 2a 2a 20 4f 56 45 52 20 63 6c 61   the.** OVER cla
30630 75 73 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  use..**.*/.stati
30640 63 20 69 6e 74 20 73 65 6c 65 63 74 57 69 6e 64  c int selectWind
30650 6f 77 52 65 77 72 69 74 65 28 50 61 72 73 65 20  owRewrite(Parse 
30660 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
30670 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
30680 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
30690 20 70 2d 3e 70 57 69 6e 20 29 7b 0a 20 20 20 20   p->pWin ){.    
306a0 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
306b0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
306c0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
306d0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
306e0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 53  Parse->db;.    S
306f0 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 30 3b  elect *pSub = 0;
30700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30710 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
30720 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
30730 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  c = p->pSrc;.   
30740 20 45 78 70 72 20 2a 70 57 68 65 72 65 20 3d 20   Expr *pWhere = 
30750 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 45  p->pWhere;.    E
30760 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
30770 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
30780 0a 20 20 20 20 45 78 70 72 20 2a 70 48 61 76 69  .    Expr *pHavi
30790 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67 3b  ng = p->pHaving;
307a0 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
307b0 53 6f 72 74 20 3d 20 30 3b 0a 0a 20 20 20 20 45  Sort = 0;..    E
307c0 78 70 72 4c 69 73 74 20 2a 70 53 75 62 6c 69 73  xprList *pSublis
307d0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  t = 0;       /* 
307e0 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  Expression list 
307f0 66 6f 72 20 73 75 62 2d 71 75 65 72 79 20 2a 2f  for sub-query */
30800 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70 57 69  .    Window *pWi
30810 6e 20 3d 20 70 2d 3e 70 57 69 6e 3b 0a 0a 20 20  n = p->pWin;..  
30820 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20    p->pSrc = 0;. 
30830 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30     p->pWhere = 0
30840 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42  ;.    p->pGroupB
30850 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 48  y = 0;.    p->pH
30860 61 76 69 6e 67 20 3d 20 30 3b 0a 0a 20 20 20 20  aving = 0;..    
30870 70 57 69 6e 2d 3e 72 65 67 41 63 63 75 6d 20 3d  pWin->regAccum =
30880 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
30890 0a 20 20 20 20 70 57 69 6e 2d 3e 72 65 67 52 65  .    pWin->regRe
308a0 73 75 6c 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  sult = ++pParse-
308b0 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 2f 2a 20 41  >nMem;..    /* A
308c0 73 73 69 67 6e 20 61 20 63 75 72 73 6f 72 20 6e  ssign a cursor n
308d0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 65 70  umber for the ep
308e0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73  hemeral table us
308f0 65 64 20 74 6f 20 62 75 66 66 65 72 20 72 6f 77  ed to buffer row
30900 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 4f 70  s..    ** The Op
30910 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
30920 72 75 63 74 69 6f 6e 20 69 73 20 63 6f 64 65 64  ruction is coded
30930 20 6c 61 74 65 72 2c 20 61 66 74 65 72 20 69 74   later, after it
30940 20 69 73 20 6b 6e 6f 77 6e 20 68 6f 77 0a 20 20   is known how.  
30950 20 20 2a 2a 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e    ** many column
30960 73 20 74 68 65 20 74 61 62 6c 65 20 77 69 6c 6c  s the table will
30970 20 68 61 76 65 2e 20 20 2a 2f 0a 20 20 20 20 70   have.  */.    p
30980 57 69 6e 2d 3e 69 45 70 68 43 73 72 20 3d 20 70  Win->iEphCsr = p
30990 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 0a  Parse->nTab++;..
309a0 20 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 57      rc = selectW
309b0 69 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73  indowRewriteELis
309c0 74 28 70 50 61 72 73 65 2c 20 70 57 69 6e 2c 20  t(pParse, pWin, 
309d0 70 2d 3e 70 45 4c 69 73 74 2c 20 26 70 53 75 62  p->pEList, &pSub
309e0 6c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 72  list);.    if( r
309f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
30a00 20 20 20 72 63 20 3d 20 73 65 6c 65 63 74 57 69     rc = selectWi
30a10 6e 64 6f 77 52 65 77 72 69 74 65 45 4c 69 73 74  ndowRewriteEList
30a20 28 70 50 61 72 73 65 2c 20 70 57 69 6e 2c 20 70  (pParse, pWin, p
30a30 2d 3e 70 4f 72 64 65 72 42 79 2c 20 26 70 53 75  ->pOrderBy, &pSu
30a40 62 6c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  blist);.    if( 
30a50 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
30a60 20 20 20 20 70 57 69 6e 2d 3e 6e 42 75 66 66 65      pWin->nBuffe
30a70 72 43 6f 6c 20 3d 20 28 70 53 75 62 6c 69 73 74  rCol = (pSublist
30a80 20 3f 20 70 53 75 62 6c 69 73 74 2d 3e 6e 45 78   ? pSublist->nEx
30a90 70 72 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  pr : 0);..    /*
30aa0 20 43 72 65 61 74 65 20 74 68 65 20 4f 52 44 45   Create the ORDE
30ab0 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20  R BY clause for 
30ac0 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  the sub-select. 
30ad0 54 68 69 73 20 69 73 20 74 68 65 20 63 6f 6e 63  This is the conc
30ae0 61 74 65 6e 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  atenation.    **
30af0 20 6f 66 20 74 68 65 20 77 69 6e 64 6f 77 20 50   of the window P
30b00 41 52 54 49 54 49 4f 4e 20 61 6e 64 20 4f 52 44  ARTITION and ORD
30b10 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 20 41  ER BY clauses. A
30b20 70 70 65 6e 64 20 74 68 65 20 73 61 6d 65 20 0a  ppend the same .
30b30 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
30b40 6e 73 20 74 6f 20 74 68 65 20 73 75 62 2d 73 65  ns to the sub-se
30b50 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f 6e 20  lect expression 
30b60 6c 69 73 74 2e 20 54 68 65 79 20 61 72 65 20 72  list. They are r
30b70 65 71 75 69 72 65 64 20 74 6f 0a 20 20 20 20 2a  equired to.    *
30b80 2a 20 66 69 67 75 72 65 20 6f 75 74 20 77 68 65  * figure out whe
30b90 72 65 20 62 6f 75 6e 64 61 72 69 65 73 20 66 6f  re boundaries fo
30ba0 72 20 70 61 72 74 69 74 69 6f 6e 73 20 61 6e 64  r partitions and
30bb0 20 73 65 74 73 20 6f 66 20 70 65 65 72 20 72 6f   sets of peer ro
30bc0 77 73 2e 20 20 2a 2f 0a 20 20 20 20 70 53 6f 72  ws.  */.    pSor
30bd0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
30be0 69 73 74 44 75 70 28 64 62 2c 20 70 57 69 6e 2d  istDup(db, pWin-
30bf0 3e 70 50 61 72 74 69 74 69 6f 6e 2c 20 30 29 3b  >pPartition, 0);
30c00 0a 20 20 20 20 69 66 28 20 70 57 69 6e 2d 3e 70  .    if( pWin->p
30c10 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
30c20 20 70 53 6f 72 74 20 3d 20 65 78 70 72 4c 69 73   pSort = exprLis
30c30 74 41 70 70 65 6e 64 4c 69 73 74 28 70 50 61 72  tAppendList(pPar
30c40 73 65 2c 20 70 53 6f 72 74 2c 20 70 57 69 6e 2d  se, pSort, pWin-
30c50 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
30c60 7d 0a 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d  }.    pSublist =
30c70 20 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c   exprListAppendL
30c80 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ist(pParse, pSub
30c90 6c 69 73 74 2c 20 70 53 6f 72 74 29 3b 0a 0a 20  list, pSort);.. 
30ca0 20 20 20 2f 2a 20 41 6c 73 6f 20 61 70 70 65 6e     /* Also appen
30cb0 64 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  d the arguments 
30cc0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 77 69  passed to the wi
30cd0 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74 6f  ndow function to
30ce0 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 75 62 2d   the.    ** sub-
30cf0 73 65 6c 65 63 74 20 65 78 70 72 65 73 73 69 6f  select expressio
30d00 6e 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 70  n list. */.    p
30d10 57 69 6e 2d 3e 69 41 72 67 43 6f 6c 20 3d 20 28  Win->iArgCol = (
30d20 70 53 75 62 6c 69 73 74 20 3f 20 70 53 75 62 6c  pSublist ? pSubl
30d30 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 29 3b  ist->nExpr : 0);
30d40 0a 20 20 20 20 70 53 75 62 6c 69 73 74 20 3d 20  .    pSublist = 
30d50 65 78 70 72 4c 69 73 74 41 70 70 65 6e 64 4c 69  exprListAppendLi
30d60 73 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 6c  st(pParse, pSubl
30d70 69 73 74 2c 20 70 57 69 6e 2d 3e 70 4f 77 6e 65  ist, pWin->pOwne
30d80 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 0a 20 20  r->x.pList);..  
30d90 20 20 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33    pSub = sqlite3
30da0 53 65 6c 65 63 74 4e 65 77 28 0a 20 20 20 20 20  SelectNew(.     
30db0 20 20 20 70 50 61 72 73 65 2c 20 70 53 75 62 6c     pParse, pSubl
30dc0 69 73 74 2c 20 70 53 72 63 2c 20 70 57 68 65 72  ist, pSrc, pWher
30dd0 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 70 48 61  e, pGroupBy, pHa
30de0 76 69 6e 67 2c 20 70 53 6f 72 74 2c 20 30 2c 20  ving, pSort, 0, 
30df0 30 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 2d 3e  0.    );.    p->
30e00 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
30e10 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20  cListAppend(db, 
30e20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
30e30 28 20 70 2d 3e 70 53 72 63 20 29 7b 0a 20 20 20  ( p->pSrc ){.   
30e40 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20     int iTab;.   
30e50 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
30e60 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  st = 0;.      p-
30e70 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
30e80 65 63 74 20 3d 20 70 53 75 62 3b 0a 20 20 20 20  ect = pSub;.    
30e90 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
30ea0 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
30eb0 61 72 73 65 2c 20 70 2d 3e 70 53 72 63 29 3b 0a  arse, p->pSrc);.
30ec0 20 20 20 20 20 20 69 66 28 20 73 65 6c 65 63 74        if( select
30ed0 45 78 70 61 6e 64 53 75 62 71 75 65 72 79 28 70  ExpandSubquery(p
30ee0 50 61 72 73 65 2c 20 26 70 2d 3e 70 53 72 63 2d  Parse, &p->pSrc-
30ef0 3e 61 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  >a[0]) ){.      
30f00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
30f10 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
30f20 7b 0a 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e  {.        pSub->
30f30 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45  selFlags |= SF_E
30f40 78 70 61 6e 64 65 64 3b 0a 20 20 20 20 20 20 7d  xpanded;.      }
30f50 0a 20 20 20 20 20 20 70 57 69 6e 2d 3e 70 4e 65  .      pWin->pNe
30f60 78 74 57 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  xtWin = 0;.    }
30f70 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ..#if SELECTTRAC
30f80 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66  E_ENABLED.    if
30f90 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
30fa0 72 61 63 65 20 26 20 30 78 31 30 38 20 29 7b 0a  race & 0x108 ){.
30fb0 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43        SELECTTRAC
30fc0 45 28 30 78 31 30 34 2c 70 50 61 72 73 65 2c 70  E(0x104,pParse,p
30fd0 2c 20 28 22 61 66 74 65 72 20 77 69 6e 64 6f 77  , ("after window
30fe0 20 72 65 77 72 69 74 65 3a 5c 6e 22 29 29 3b 0a   rewrite:\n"));.
30ff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65        sqlite3Tre
31000 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
31010 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 0);.    }.#end
31020 69 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  if..    sqlite3V
31030 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
31040 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
31050 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 70 57  Win->iEphCsr, pW
31060 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 29 3b  in->nBufferCol);
31070 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
31080 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
31090 6c 2c 20 30 2c 20 70 57 69 6e 2d 3e 72 65 67 41  l, 0, pWin->regA
310a0 63 63 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ccum);.  }..  re
310b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
310c0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
310d0 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20 73  for the SELECT s
310e0 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69  tatement given i
310f0 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74  n the p argument
31100 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  .  .**.** The re
31110 73 75 6c 74 73 20 61 72 65 20 72 65 74 75 72 6e  sults are return
31120 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ed according to 
31130 74 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73  the SelectDest s
31140 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65  tructure..** See
31150 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c   comments in sql
31160 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66 75 72  iteInt.h for fur
31170 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ther information
31180 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
31190 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
311a0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
311b0 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72  s.  If any error
311c0 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74  s are.** encount
311d0 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70  ered, then an ap
311e0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
311f0 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
31200 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45  in.** pParse->zE
31210 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rrMsg..**.** Thi
31220 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e  s routine does N
31230 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65  OT free the Sele
31240 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  ct structure pas
31250 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20  sed in.  The.** 
31260 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
31270 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61   needs to do tha
31280 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
31290 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  3Select(.  Parse
312a0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
312b0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
312c0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
312d0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
312e0 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
312f0 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
31300 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65  g coded. */.  Se
31310 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
31320 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
31330 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72  do with the quer
31340 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
31350 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
31360 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
31370 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
31380 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
31390 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ;     /* Return 
313a0 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72  from sqlite3Wher
313b0 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64  eBegin() */.  Vd
313c0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
313d0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
313e0 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65  ual machine unde
313f0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
31400 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20  /.  int isAgg;  
31410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
31420 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69  ue for select li
31430 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  sts like "count(
31440 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  *)" */.  ExprLis
31450 74 20 2a 70 45 4c 69 73 74 20 3d 20 30 3b 20 20  t *pEList = 0;  
31460 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
31470 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a  ns to extract. *
31480 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
31490 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69  bList;     /* Li
314a0 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
314b0 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
314c0 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
314d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
314e0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
314f0 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
31500 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42  xprList *pGroupB
31510 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  y;    /* The GRO
31520 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  UP BY clause.  M
31530 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
31540 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20  Expr *pHaving;  
31550 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41         /* The HA
31560 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61  VING clause.  Ma
31570 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  y be NULL */.  i
31580 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20  nt rc = 1;      
31590 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
315a0 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68  o return from th
315b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
315c0 20 44 69 73 74 69 6e 63 74 43 74 78 20 73 44 69   DistinctCtx sDi
315d0 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20  stinct; /* Info 
315e0 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74  on how to code t
315f0 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
31600 6f 72 64 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78  ord */.  SortCtx
31610 20 73 53 6f 72 74 3b 20 20 20 20 20 20 20 20 20   sSort;         
31620 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  /* Info on how t
31630 6f 20 63 6f 64 65 20 74 68 65 20 4f 52 44 45 52  o code the ORDER
31640 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
31650 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f  AggInfo sAggInfo
31660 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ;      /* Inform
31670 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67  ation used by ag
31680 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
31690 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20  */.  int iEnd;  
316a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
316b0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e  ddress of the en
316c0 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  d of the query *
316d0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
316e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
316f0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
31700 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c  ction */.  ExprL
31710 69 73 74 20 2a 70 4d 69 6e 4d 61 78 4f 72 64 65  ist *pMinMaxOrde
31720 72 42 79 20 3d 20 30 3b 20 20 2f 2a 20 41 64 64  rBy = 0;  /* Add
31730 65 64 20 4f 52 44 45 52 20 42 59 20 66 6f 72 20  ed ORDER BY for 
31740 6d 69 6e 2f 6d 61 78 20 71 75 65 72 69 65 73 20  min/max queries 
31750 2a 2f 0a 20 20 75 38 20 6d 69 6e 4d 61 78 46 6c  */.  u8 minMaxFl
31760 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ag;             
31770 20 20 20 20 2f 2a 20 46 6c 61 67 20 66 6f 72 20      /* Flag for 
31780 6d 69 6e 2f 6d 61 78 20 71 75 65 72 69 65 73 20  min/max queries 
31790 2a 2f 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  */..  db = pPars
317a0 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 73 71 6c  e->db;.  v = sql
317b0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
317c0 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
317d0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
317e0 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
317f0 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Err ){.    retur
31800 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 1;.  }.  if( s
31810 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
31820 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
31830 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20  ELECT, 0, 0, 0) 
31840 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
31850 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20  mset(&sAggInfo, 
31860 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e  0, sizeof(sAggIn
31870 66 6f 29 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  fo));.#if SELECT
31880 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
31890 53 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50  SELECTTRACE(1,pP
318a0 61 72 73 65 2c 70 2c 20 28 22 62 65 67 69 6e 20  arse,p, ("begin 
318b0 70 72 6f 63 65 73 73 69 6e 67 3a 5c 6e 22 2c 20  processing:\n", 
318c0 70 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c  pParse->addrExpl
318d0 61 69 6e 29 29 3b 0a 20 20 69 66 28 20 73 71 6c  ain));.  if( sql
318e0 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
318f0 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20 73  & 0x100 ){.    s
31900 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
31910 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
31920 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
31930 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
31940 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
31950 65 73 74 21 3d 53 52 54 5f 44 69 73 74 46 69 66  est!=SRT_DistFif
31960 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
31970 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c  ->pOrderBy==0 ||
31980 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d 53   pDest->eDest!=S
31990 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20 61 73 73  RT_Fifo );.  ass
319a0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
319b0 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
319c0 65 73 74 21 3d 53 52 54 5f 44 69 73 74 51 75 65  est!=SRT_DistQue
319d0 75 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ue );.  assert( 
319e0 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  p->pOrderBy==0 |
319f0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21 3d  | pDest->eDest!=
31a00 53 52 54 5f 51 75 65 75 65 20 29 3b 0a 20 20 69  SRT_Queue );.  i
31a10 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  f( IgnorableOrde
31a20 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
31a30 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d 3e    assert(pDest->
31a40 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73 74  eDest==SRT_Exist
31a50 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  s || pDest->eDes
31a60 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20  t==SRT_Union || 
31a70 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65 73  .           pDes
31a80 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78  t->eDest==SRT_Ex
31a90 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65  cept || pDest->e
31aa0 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72  Dest==SRT_Discar
31ab0 64 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  d ||.           
31ac0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
31ad0 54 5f 51 75 65 75 65 20 20 7c 7c 20 70 44 65 73  T_Queue  || pDes
31ae0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t->eDest==SRT_Di
31af0 73 74 46 69 66 6f 20 7c 7c 0a 20 20 20 20 20 20  stFifo ||.      
31b00 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
31b10 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65  t==SRT_DistQueue
31b20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
31b30 3d 3d 53 52 54 5f 46 69 66 6f 29 3b 0a 20 20 20  ==SRT_Fifo);.   
31b40 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20   /* If ORDER BY 
31b50 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65  makes no differe
31b60 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75  nce in the outpu
31b70 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64  t then neither d
31b80 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49  oes.    ** DISTI
31b90 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65  NCT so it can be
31ba0 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f   removed too. */
31bb0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
31bc0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
31bd0 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
31be0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
31bf0 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
31c00 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63  s &= ~SF_Distinc
31c10 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  t;.  }.  sqlite3
31c20 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73  SelectPrep(pPars
31c30 65 2c 20 70 2c 20 30 29 3b 0a 20 20 6d 65 6d 73  e, p, 0);.  mems
31c40 65 74 28 26 73 53 6f 72 74 2c 20 30 2c 20 73 69  et(&sSort, 0, si
31c50 7a 65 6f 66 28 73 53 6f 72 74 29 29 3b 0a 20 20  zeof(sSort));.  
31c60 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
31c70 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
31c80 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
31c90 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
31ca0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
31cb0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
31cc0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45  .  assert( p->pE
31cd0 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 69 73 41  List!=0 );.  isA
31ce0 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  gg = (p->selFlag
31cf0 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
31d00 29 21 3d 30 3b 0a 23 69 66 20 53 45 4c 45 43 54  )!=0;.#if SELECT
31d10 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
31d20 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
31d30 74 54 72 61 63 65 20 26 20 30 78 31 30 34 20 29  tTrace & 0x104 )
31d40 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
31d50 45 28 30 78 31 30 34 2c 70 50 61 72 73 65 2c 70  E(0x104,pParse,p
31d60 2c 20 28 22 61 66 74 65 72 20 6e 61 6d 65 20 72  , ("after name r
31d70 65 73 6f 6c 75 74 69 6f 6e 3a 5c 6e 22 29 29 3b  esolution:\n"));
31d80 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65  .    sqlite3Tree
31d90 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
31da0 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
31db0 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
31dc0 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
31dd0 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65 43  ){.    generateC
31de0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
31df0 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  e, p);.  }..  if
31e00 28 20 28 72 63 20 3d 20 73 65 6c 65 63 74 57 69  ( (rc = selectWi
31e10 6e 64 6f 77 52 65 77 72 69 74 65 28 70 50 61 72  ndowRewrite(pPar
31e20 73 65 2c 20 70 29 29 20 29 7b 0a 20 20 20 20 67  se, p)) ){.    g
31e30 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
31e40 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d    }.  pTabList =
31e50 20 70 2d 3e 70 53 72 63 3b 0a 0a 20 20 2f 2a 20   p->pSrc;..  /* 
31e60 54 72 79 20 74 6f 20 76 61 72 69 6f 75 73 20 6f  Try to various o
31e70 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 28 66 6c  ptimizations (fl
31e80 61 74 74 65 6e 69 6e 67 20 73 75 62 71 75 65 72  attening subquer
31e90 69 65 73 2c 20 61 6e 64 20 73 74 72 65 6e 67 74  ies, and strengt
31ea0 68 0a 20 20 2a 2a 20 72 65 64 75 63 74 69 6f 6e  h.  ** reduction
31eb0 20 6f 66 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f   of join operato
31ec0 72 73 29 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  rs) in the FROM 
31ed0 63 6c 61 75 73 65 20 75 70 20 69 6e 74 6f 20 74  clause up into t
31ee0 68 65 20 6d 61 69 6e 20 71 75 65 72 79 0a 20 20  he main query.  
31ef0 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
31f00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
31f10 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
31f20 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
31f30 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21  EW).  for(i=0; !
31f40 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70  p->pPrior && i<p
31f50 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
31f60 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
31f70 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
31f80 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
31f90 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63  >a[i];.    Selec
31fa0 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d  t *pSub = pItem-
31fb0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 54 61  >pSelect;.    Ta
31fc0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65  ble *pTab = pIte
31fd0 6d 2d 3e 70 54 61 62 3b 0a 0a 20 20 20 20 2f 2a  m->pTab;..    /*
31fe0 20 43 6f 6e 76 65 72 74 20 4c 45 46 54 20 4a 4f   Convert LEFT JO
31ff0 49 4e 20 69 6e 74 6f 20 4a 4f 49 4e 20 69 66 20  IN into JOIN if 
32000 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
32010 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
32020 6c 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  le.    ** of the
32030 20 4c 45 46 54 20 4a 4f 49 4e 20 75 73 65 64 20   LEFT JOIN used 
32040 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
32050 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  use..    */.    
32060 69 66 28 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a  if( (pItem->fg.j
32070 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
32080 54 29 21 3d 30 0a 20 20 20 20 20 26 26 20 73 71  T)!=0.     && sq
32090 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
320a0 4e 6f 6e 4e 75 6c 6c 52 6f 77 28 70 2d 3e 70 57  NonNullRow(p->pW
320b0 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75  here, pItem->iCu
320c0 72 73 6f 72 29 0a 20 20 20 20 20 26 26 20 4f 70  rsor).     && Op
320d0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
320e0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 69 6d  d(db, SQLITE_Sim
320f0 70 6c 69 66 79 4a 6f 69 6e 29 0a 20 20 20 20 29  plifyJoin).    )
32100 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52  {.      SELECTTR
32110 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
32120 2c 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ,p,.            
32130 20 20 20 20 28 22 4c 45 46 54 2d 4a 4f 49 4e 20      ("LEFT-JOIN 
32140 73 69 6d 70 6c 69 66 69 65 73 20 74 6f 20 4a 4f  simplifies to JO
32150 49 4e 20 6f 6e 20 74 65 72 6d 20 25 64 5c 6e 22  IN on term %d\n"
32160 2c 69 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65  ,i));.      pIte
32170 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  m->fg.jointype &
32180 3d 20 7e 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f  = ~(JT_LEFT|JT_O
32190 55 54 45 52 29 3b 0a 20 20 20 20 20 20 75 6e 73  UTER);.      uns
321a0 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 57  etJoinExpr(p->pW
321b0 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75  here, pItem->iCu
321c0 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  rsor);.    }..  
321d0 20 20 2f 2a 20 4e 6f 20 66 75 74 68 65 72 20 61    /* No futher a
321e0 63 74 69 6f 6e 20 69 66 20 74 68 69 73 20 74 65  ction if this te
321f0 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
32200 6c 61 75 73 65 20 69 73 20 6e 6f 20 61 20 73 75  lause is no a su
32210 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 69 66  bquery */.    if
32220 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
32230 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 61  inue;..    /* Ca
32240 74 63 68 20 6d 69 73 6d 61 74 63 68 20 69 6e 20  tch mismatch in 
32250 74 68 65 20 64 65 63 6c 61 72 65 64 20 63 6f 6c  the declared col
32260 75 6d 6e 73 20 6f 66 20 61 20 76 69 65 77 20 61  umns of a view a
32270 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
32280 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  .    ** columns 
32290 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 6f 6e  in the SELECT on
322a0 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 20 20   the RHS */.    
322b0 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d  if( pTab->nCol!=
322c0 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  pSub->pEList->nE
322d0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  xpr ){.      sql
322e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
322f0 72 73 65 2c 20 22 65 78 70 65 63 74 65 64 20 25  rse, "expected %
32300 64 20 63 6f 6c 75 6d 6e 73 20 66 6f 72 20 27 25  d columns for '%
32310 73 27 20 62 75 74 20 67 6f 74 20 25 64 22 2c 0a  s' but got %d",.
32320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32330 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
32340 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70  , pTab->zName, p
32350 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  Sub->pEList->nEx
32360 70 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  pr);.      goto 
32370 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
32380 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  }..    /* Do not
32390 20 74 72 79 20 74 6f 20 66 6c 61 74 74 65 6e 20   try to flatten 
323a0 61 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  an aggregate sub
323b0 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20  query..    **.  
323c0 20 20 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20    ** Flattening 
323d0 61 6e 20 61 67 67 72 65 67 61 74 65 20 73 75 62  an aggregate sub
323e0 71 75 65 72 79 20 69 73 20 6f 6e 6c 79 20 70 6f  query is only po
323f0 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 6f 75  ssible if the ou
32400 74 65 72 20 71 75 65 72 79 0a 20 20 20 20 2a 2a  ter query.    **
32410 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 20   is not a join. 
32420 20 42 75 74 20 69 66 20 74 68 65 20 6f 75 74 65   But if the oute
32430 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
32440 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20   join, then the 
32450 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a 20  subquery.    ** 
32460 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65 6d 65 6e  will be implemen
32470 74 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74  ted as a co-rout
32480 69 6e 65 20 61 6e 64 20 74 68 65 72 65 20 69 73  ine and there is
32490 20 6e 6f 20 61 64 76 61 6e 74 61 67 65 20 74 6f   no advantage to
324a0 0a 20 20 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69  .    ** flatteni
324b0 6e 67 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e  ng in that case.
324c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
324d0 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20  (pSub->selFlags 
324e0 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21  & SF_Aggregate)!
324f0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
32500 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
32510 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
32520 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
32530 75 74 65 72 20 71 75 65 72 79 20 63 6f 6e 74 61  uter query conta
32540 69 6e 73 20 61 20 22 63 6f 6d 70 6c 65 78 22 20  ins a "complex" 
32550 72 65 73 75 6c 74 20 73 65 74 20 28 74 68 61 74  result set (that
32560 20 69 73 2c 0a 20 20 20 20 2a 2a 20 69 66 20 74   is,.    ** if t
32570 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
32580 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
32590 20 75 73 65 73 20 66 75 6e 63 74 69 6f 6e 73 20   uses functions 
325a0 6f 72 20 73 75 62 71 75 65 72 69 65 73 29 0a 20  or subqueries). 
325b0 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65     ** and if the
325c0 20 73 75 62 71 75 65 72 79 20 63 6f 6e 74 61 69   subquery contai
325d0 6e 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  ns an ORDER BY c
325e0 6c 61 75 73 65 20 61 6e 64 20 69 66 0a 20 20 20  lause and if.   
325f0 20 2a 2a 20 69 74 20 77 69 6c 6c 20 62 65 20 69   ** it will be i
32600 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
32610 63 6f 2d 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  co-routine, then
32620 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e   do not flatten.
32630 20 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 72 65    This.    ** re
32640 73 74 72 69 63 74 69 6f 6e 20 61 6c 6c 6f 77 73  striction allows
32650 20 53 51 4c 20 63 6f 6e 73 74 72 75 63 74 73 20   SQL constructs 
32660 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
32670 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43 54  *.    **  SELECT
32680 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74   expensive_funct
32690 69 6f 6e 28 78 29 0a 20 20 20 20 2a 2a 20 20 20  ion(x).    **   
326a0 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 20   FROM (SELECT x 
326b0 46 52 4f 4d 20 74 61 62 20 4f 52 44 45 52 20 42  FROM tab ORDER B
326c0 59 20 79 20 4c 49 4d 49 54 20 31 30 29 3b 0a 20  Y y LIMIT 10);. 
326d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
326e0 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74   expensive_funct
326f0 69 6f 6e 28 29 20 69 73 20 6f 6e 6c 79 20 63 6f  ion() is only co
32700 6d 70 75 74 65 64 20 6f 6e 20 74 68 65 20 31 30  mputed on the 10
32710 20 72 6f 77 73 20 74 68 61 74 0a 20 20 20 20 2a   rows that.    *
32720 2a 20 61 72 65 20 6f 75 74 70 75 74 2c 20 72 61  * are output, ra
32730 74 68 65 72 20 74 68 61 6e 20 65 76 65 72 79 20  ther than every 
32740 72 6f 77 20 6f 66 20 74 68 65 20 74 61 62 6c 65  row of the table
32750 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
32760 54 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74 20  The requirement 
32770 74 68 61 74 20 74 68 65 20 6f 75 74 65 72 20 71  that the outer q
32780 75 65 72 79 20 68 61 76 65 20 61 20 63 6f 6d 70  uery have a comp
32790 6c 65 78 20 72 65 73 75 6c 74 20 73 65 74 0a 20  lex result set. 
327a0 20 20 20 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74     ** means that
327b0 20 66 6c 61 74 74 65 6e 69 6e 67 20 64 6f 65 73   flattening does
327c0 20 6f 63 63 75 72 20 6f 6e 20 73 69 6d 70 6c 65   occur on simple
327d0 72 20 53 51 4c 20 63 6f 6e 73 74 72 61 69 6e 74  r SQL constraint
327e0 73 20 77 69 74 68 6f 75 74 0a 20 20 20 20 2a 2a  s without.    **
327f0 20 74 68 65 20 65 78 70 65 6e 73 69 76 65 5f 66   the expensive_f
32800 75 6e 63 74 69 6f 6e 28 29 20 6c 69 6b 65 3a 0a  unction() like:.
32810 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 53      **.    **  S
32820 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 28 53 45  ELECT x FROM (SE
32830 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 20  LECT x FROM tab 
32840 4f 52 44 45 52 20 42 59 20 79 20 4c 49 4d 49 54  ORDER BY y LIMIT
32850 20 31 30 29 3b 0a 20 20 20 20 2a 2f 0a 20 20 20   10);.    */.   
32860 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
32870 72 42 79 21 3d 30 0a 20 20 20 20 20 26 26 20 69  rBy!=0.     && i
32880 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 2d 3e  ==0.     && (p->
32890 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f  selFlags & SF_Co
328a0 6d 70 6c 65 78 52 65 73 75 6c 74 29 21 3d 30 0a  mplexResult)!=0.
328b0 20 20 20 20 20 26 26 20 28 70 54 61 62 4c 69 73       && (pTabLis
328c0 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20  t->nSrc==1.     
328d0 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69 73 74      || (pTabList
328e0 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79  ->a[1].fg.jointy
328f0 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43  pe&(JT_LEFT|JT_C
32900 52 4f 53 53 29 29 21 3d 30 29 0a 20 20 20 20 29  ROSS))!=0).    )
32910 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  {.      continue
32920 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
32930 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
32940 28 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69  (pParse, p, i, i
32950 73 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 2f  sAgg) ){.      /
32960 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79 20  * This subquery 
32970 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20  can be absorbed 
32980 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e  into its parent.
32990 20 2a 2f 0a 20 20 20 20 20 20 69 20 3d 20 2d 31   */.      i = -1
329a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
329b0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
329c0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
329d0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
329e0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
329f0 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72  if( !IgnorableOr
32a00 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
32a10 20 20 20 20 20 20 73 53 6f 72 74 2e 70 4f 72 64        sSort.pOrd
32a20 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
32a30 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  By;.    }.  }.#e
32a40 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
32a50 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
32a60 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a 20 48  ND_SELECT.  /* H
32a70 61 6e 64 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 53  andle compound S
32a80 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
32a90 20 75 73 69 6e 67 20 74 68 65 20 73 65 70 61 72   using the separ
32aa0 61 74 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  ate multiSelect(
32ab0 29 0a 20 20 2a 2a 20 70 72 6f 63 65 64 75 72 65  ).  ** procedure
32ac0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
32ad0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 72 63  pPrior ){.    rc
32ae0 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70   = multiSelect(p
32af0 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
32b00 3b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43  ;.#if SELECTTRAC
32b10 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 53 45  E_ENABLED.    SE
32b20 4c 45 43 54 54 52 41 43 45 28 30 78 31 2c 70 50  LECTTRACE(0x1,pP
32b30 61 72 73 65 2c 70 2c 28 22 65 6e 64 20 63 6f 6d  arse,p,("end com
32b40 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 70 72 6f  pound-select pro
32b50 63 65 73 73 69 6e 67 5c 6e 22 29 29 3b 0a 20 20  cessing\n"));.  
32b60 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 53 65    if( (sqlite3Se
32b70 6c 65 63 74 54 72 61 63 65 20 26 20 30 78 32 30  lectTrace & 0x20
32b80 30 30 29 21 3d 30 20 26 26 20 45 78 70 6c 61 69  00)!=0 && Explai
32b90 6e 51 75 65 72 79 50 6c 61 6e 50 61 72 65 6e 74  nQueryPlanParent
32ba0 28 70 50 61 72 73 65 29 3d 3d 30 20 29 7b 0a 20  (pParse)==0 ){. 
32bb0 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
32bc0 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
32bd0 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
32be0 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65  f.    if( p->pNe
32bf0 78 74 3d 3d 30 20 29 20 45 78 70 6c 61 69 6e 51  xt==0 ) ExplainQ
32c00 75 65 72 79 50 6c 61 6e 50 6f 70 28 70 50 61 72  ueryPlanPop(pPar
32c10 73 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  se);.    return 
32c20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
32c30 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 74 65    /* For each te
32c40 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  rm in the FROM c
32c50 6c 61 75 73 65 2c 20 64 6f 20 74 77 6f 20 74 68  lause, do two th
32c60 69 6e 67 73 3a 0a 20 20 2a 2a 20 28 31 29 20 41  ings:.  ** (1) A
32c70 75 74 68 6f 72 69 7a 65 64 20 75 6e 72 65 66 65  uthorized unrefe
32c80 72 65 6e 63 65 64 20 74 61 62 6c 65 73 0a 20 20  renced tables.  
32c90 2a 2a 20 28 32 29 20 47 65 6e 65 72 61 74 65 20  ** (2) Generate 
32ca0 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
32cb0 2d 71 75 65 72 69 65 73 0a 20 20 2a 2f 0a 20 20  -queries.  */.  
32cc0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
32cd0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
32ce0 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
32cf0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
32d00 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
32d10 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73  ];.    SelectDes
32d20 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65  t dest;.    Sele
32d30 63 74 20 2a 70 53 75 62 3b 0a 23 69 66 20 21 64  ct *pSub;.#if !d
32d40 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
32d50 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
32d60 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
32d70 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 20 20 63  OMIT_VIEW).    c
32d80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65  onst char *zSave
32d90 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 23 65  dAuthContext;.#e
32da0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 73 73  ndif..    /* Iss
32db0 75 65 20 53 51 4c 49 54 45 5f 52 45 41 44 20 61  ue SQLITE_READ a
32dc0 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 20 77 69  uthorizations wi
32dd0 74 68 20 61 20 66 61 6b 65 20 63 6f 6c 75 6d 6e  th a fake column
32de0 20 6e 61 6d 65 20 66 6f 72 20 61 6e 79 0a 20 20   name for any.  
32df0 20 20 2a 2a 20 74 61 62 6c 65 73 20 74 68 61 74    ** tables that
32e00 20 61 72 65 20 72 65 66 65 72 65 6e 63 65 64 20   are referenced 
32e10 62 75 74 20 66 72 6f 6d 20 77 68 69 63 68 20 6e  but from which n
32e20 6f 20 76 61 6c 75 65 73 20 61 72 65 20 65 78 74  o values are ext
32e30 72 61 63 74 65 64 2e 0a 20 20 20 20 2a 2a 20 45  racted..    ** E
32e40 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 65 72 65  xamples of where
32e50 20 74 68 65 73 65 20 6b 69 6e 64 73 20 6f 66 20   these kinds of 
32e60 6e 75 6c 6c 20 53 51 4c 49 54 45 5f 52 45 41 44  null SQLITE_READ
32e70 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 73 0a   authorizations.
32e80 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 6f 63 63      ** would occ
32e90 75 72 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ur:.    **.    *
32ea0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  *     SELECT cou
32eb0 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 20 20  nt(*) FROM t1;  
32ec0 20 2d 2d 20 53 51 4c 49 54 45 5f 52 45 41 44 20   -- SQLITE_READ 
32ed0 74 31 2e 22 22 0a 20 20 20 20 2a 2a 20 20 20 20  t1."".    **    
32ee0 20 53 45 4c 45 43 54 20 74 31 2e 2a 20 46 52 4f   SELECT t1.* FRO
32ef0 4d 20 74 31 2c 20 74 32 3b 20 20 20 2d 2d 20 53  M t1, t2;   -- S
32f00 51 4c 49 54 45 5f 52 45 41 44 20 74 32 2e 22 22  QLITE_READ t2.""
32f10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
32f20 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e  he fake column n
32f30 61 6d 65 20 69 73 20 61 6e 20 65 6d 70 74 79 20  ame is an empty 
32f40 73 74 72 69 6e 67 2e 20 20 49 74 20 69 73 20 70  string.  It is p
32f50 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 74 61  ossible for a ta
32f60 62 6c 65 20 74 6f 0a 20 20 20 20 2a 2a 20 68 61  ble to.    ** ha
32f70 76 65 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  ve a column name
32f80 64 20 62 79 20 74 68 65 20 65 6d 70 74 79 20 73  d by the empty s
32f90 74 72 69 6e 67 2c 20 69 6e 20 77 68 69 63 68 20  tring, in which 
32fa0 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f  case there is no
32fb0 20 77 61 79 20 74 6f 0a 20 20 20 20 2a 2a 20 64   way to.    ** d
32fc0 69 73 74 69 6e 67 75 69 73 68 20 62 65 74 77 65  istinguish betwe
32fd0 65 6e 20 61 6e 20 75 6e 72 65 66 65 72 65 6e 63  en an unreferenc
32fe0 65 64 20 74 61 62 6c 65 20 61 6e 64 20 61 6e 20  ed table and an 
32ff0 61 63 74 75 61 6c 20 72 65 66 65 72 65 6e 63 65  actual reference
33000 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 22   to the.    ** "
33010 22 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 20 6f 72  " column. The or
33020 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 77 61  iginal design wa
33030 73 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20 63  s for the fake c
33040 6f 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f 20 62 65  olumn name to be
33050 20 61 20 4e 55 4c 4c 2c 0a 20 20 20 20 2a 2a 20   a NULL,.    ** 
33060 77 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 75  which would be u
33070 6e 61 6d 62 69 67 75 6f 75 73 2e 20 20 42 75 74  nambiguous.  But
33080 20 6c 65 67 61 63 79 20 61 75 74 68 6f 72 69 7a   legacy authoriz
33090 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 20  ation callbacks 
330a0 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 61 73 73  might.    ** ass
330b0 75 6d 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ume the column n
330c0 61 6d 65 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20  ame is non-NULL 
330d0 61 6e 64 20 73 65 67 66 61 75 6c 74 2e 20 20 54  and segfault.  T
330e0 68 65 20 75 73 65 20 6f 66 20 61 6e 20 65 6d 70  he use of an emp
330f0 74 79 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e 67  ty.    ** string
33100 20 66 6f 72 20 74 68 65 20 66 61 6b 65 20 63 6f   for the fake co
33110 6c 75 6d 6e 20 6e 61 6d 65 20 73 65 65 6d 73 20  lumn name seems 
33120 73 61 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  safer..    */.  
33130 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 63 6f 6c    if( pItem->col
33140 55 73 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Used==0 ){.     
33150 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
33160 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
33170 5f 52 45 41 44 2c 20 70 49 74 65 6d 2d 3e 7a 4e  _READ, pItem->zN
33180 61 6d 65 2c 20 22 22 2c 20 70 49 74 65 6d 2d 3e  ame, "", pItem->
33190 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
331a0 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
331b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
331c0 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
331d0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
331e0 45 57 29 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  EW).    /* Gener
331f0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c  ate code for all
33200 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20   sub-queries in 
33210 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
33220 20 20 20 20 2a 2f 0a 20 20 20 20 70 53 75 62 20      */.    pSub 
33230 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  = pItem->pSelect
33240 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d  ;.    if( pSub==
33250 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
33260 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20     /* Sometimes 
33270 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73  the code for a s
33280 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20  ubquery will be 
33290 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74  generated more t
332a0 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c  han.    ** once,
332b0 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
332c0 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
332d0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20  WHERE clause in 
332e0 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20  a LEFT JOIN,.   
332f0 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e   ** for example.
33300 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
33310 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74  do not regenerat
33320 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61  e the code to ma
33330 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20  nifest.    ** a 
33340 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72  view or the co-r
33350 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d  outine to implem
33360 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68 65  ent a view.  The
33370 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a   first instance.
33380 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63      ** is suffic
33390 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65  ient, though the
333a0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d   subroutine to m
333b0 61 6e 69 66 65 73 74 20 74 68 65 20 76 69 65 77  anifest the view
333c0 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a   does need.    *
333d0 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  * to be invoked 
333e0 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66  again. */.    if
333f0 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  ( pItem->addrFil
33400 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66  lSub ){.      if
33410 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43  ( pItem->fg.viaC
33420 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20  oroutine==0 ){. 
33430 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
33440 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61  broutine that ma
33450 6e 69 66 65 73 74 73 20 74 68 65 20 76 69 65 77  nifests the view
33460 20 6d 69 67 68 74 20 62 65 20 61 20 6f 6e 65 2d   might be a one-
33470 74 69 6d 65 20 72 6f 75 74 69 6e 65 2c 0a 20 20  time routine,.  
33480 20 20 20 20 20 20 2a 2a 20 6f 72 20 69 74 20 6d        ** or it m
33490 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20  ight need to be 
334a0 72 65 72 75 6e 20 6f 6e 20 65 61 63 68 20 69 74  rerun on each it
334b0 65 72 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20  eration because 
334c0 69 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 6e  it.        ** en
334d0 63 6f 64 65 73 20 61 20 63 6f 72 72 65 6c 61 74  codes a correlat
334e0 65 64 20 73 75 62 71 75 65 72 79 2e 20 2a 2f 0a  ed subquery. */.
334f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
33500 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
33510 4f 70 28 76 2c 20 70 49 74 65 6d 2d 3e 61 64 64  Op(v, pItem->add
33520 72 46 69 6c 6c 53 75 62 29 2d 3e 6f 70 63 6f 64  rFillSub)->opcod
33530 65 3d 3d 4f 50 5f 4f 6e 63 65 20 29 3b 0a 20 20  e==OP_Once );.  
33540 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
33550 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
33560 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52  sub, pItem->regR
33570 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64  eturn, pItem->ad
33580 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20  drFillSub);.    
33590 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e    }.      contin
335a0 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ue;.    }..    /
335b0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73  * Increment Pars
335c0 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65  e.nHeight by the
335d0 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c   height of the l
335e0 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f  argest expressio
335f0 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65  n.    ** tree re
33600 66 65 72 72 65 64 20 74 6f 20 62 79 20 74 68 69  ferred to by thi
33610 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65  s, the parent se
33620 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20  lect. The child 
33630 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61  select.    ** ma
33640 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73  y contain expres
33650 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74  sion trees of at
33660 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51   most.    ** (SQ
33670 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
33680 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68  PTH-Parse.nHeigh
33690 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20  t) height. This 
336a0 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20  is a bit.    ** 
336b0 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76  more conservativ
336c0 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79  e than necessary
336d0 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65  , but much easie
336e0 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67  r than enforcing
336f0 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74  .    ** an exact
33700 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   limit..    */. 
33710 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
33720 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht += sqlite3Sel
33730 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
33740 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63  ;..    /* Make c
33750 6f 70 69 65 73 20 6f 66 20 63 6f 6e 73 74 61 6e  opies of constan
33760 74 20 57 48 45 52 45 2d 63 6c 61 75 73 65 20 74  t WHERE-clause t
33770 65 72 6d 73 20 69 6e 20 74 68 65 20 6f 75 74 65  erms in the oute
33780 72 20 71 75 65 72 79 20 64 6f 77 6e 0a 20 20 20  r query down.   
33790 20 2a 2a 20 69 6e 73 69 64 65 20 74 68 65 20 73   ** inside the s
337a0 75 62 71 75 65 72 79 2e 20 20 54 68 69 73 20 63  ubquery.  This c
337b0 61 6e 20 68 65 6c 70 20 74 68 65 20 73 75 62 71  an help the subq
337c0 75 65 72 79 20 74 6f 20 72 75 6e 20 6d 6f 72 65  uery to run more
337d0 20 65 66 66 69 63 69 65 6e 74 6c 79 2e 0a 20 20   efficiently..  
337e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 4f 70 74    */.    if( Opt
337f0 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64  imizationEnabled
33800 28 64 62 2c 20 53 51 4c 49 54 45 5f 50 75 73 68  (db, SQLITE_Push
33810 44 6f 77 6e 29 0a 20 20 20 20 20 26 26 20 70 75  Down).     && pu
33820 73 68 44 6f 77 6e 57 68 65 72 65 54 65 72 6d 73  shDownWhereTerms
33830 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 70  (pParse, pSub, p
33840 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d 2d  ->pWhere, pItem-
33850 3e 69 43 75 72 73 6f 72 2c 0a 20 20 20 20 20 20  >iCursor,.      
33860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33870 20 20 20 20 20 28 70 49 74 65 6d 2d 3e 66 67 2e       (pItem->fg.
33880 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
33890 54 45 52 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a  TER)!=0).    ){.
338a0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
338b0 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 69 66  ENABLED.      if
338c0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
338d0 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
338e0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 54 52          SELECTTR
338f0 41 43 45 28 30 78 31 30 30 2c 70 50 61 72 73 65  ACE(0x100,pParse
33900 2c 70 2c 28 22 41 66 74 65 72 20 57 48 45 52 45  ,p,("After WHERE
33910 2d 63 6c 61 75 73 65 20 70 75 73 68 2d 64 6f 77  -clause push-dow
33920 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  n:\n"));.       
33930 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
33940 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
33950 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
33960 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33970 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
33980 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 50 75  00,pParse,p,("Pu
33990 73 68 2d 64 6f 77 6e 20 6e 6f 74 20 70 6f 73 73  sh-down not poss
339a0 69 62 6c 65 5c 6e 22 29 29 3b 0a 20 20 20 20 7d  ible\n"));.    }
339b0 0a 0a 20 20 20 20 7a 53 61 76 65 64 41 75 74 68  ..    zSavedAuth
339c0 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65  Context = pParse
339d0 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  ->zAuthContext;.
339e0 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
339f0 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74 65 6d  hContext = pItem
33a00 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a  ->zName;..    /*
33a10 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
33a20 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
33a30 73 75 62 71 75 65 72 79 0a 20 20 20 20 2a 2a 0a  subquery.    **.
33a40 20 20 20 20 2a 2a 20 54 68 65 20 73 75 62 71 75      ** The subqu
33a50 65 72 79 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ery is implement
33a60 65 64 20 61 73 20 61 20 63 6f 2d 72 6f 75 74 69  ed as a co-routi
33a70 6e 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65  ne if the subque
33a80 72 79 20 69 73 0a 20 20 20 20 2a 2a 20 67 75 61  ry is.    ** gua
33a90 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 74 68  ranteed to be th
33aa0 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 28 73 6f  e outer loop (so
33ab0 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
33ac0 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 20  t need to be.   
33ad0 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 6d 6f 72   ** computed mor
33ae0 65 20 74 68 61 6e 20 6f 6e 63 65 29 0a 20 20 20  e than once).   
33af0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a   **.    ** TODO:
33b00 20 41 72 65 20 74 68 65 72 65 20 6f 74 68 65 72   Are there other
33b10 20 72 65 61 73 6f 6e 73 20 62 65 73 69 64 65 20   reasons beside 
33b20 28 31 29 20 74 6f 20 75 73 65 20 61 20 63 6f 2d  (1) to use a co-
33b30 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69  routine.    ** i
33b40 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 3f 0a 20  mplementation?. 
33b50 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3d     */.    if( i=
33b60 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 61 62  =0.     && (pTab
33b70 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20  List->nSrc==1.  
33b80 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54            || (pT
33b90 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e  abList->a[1].fg.
33ba0 6a 6f 69 6e 74 79 70 65 26 28 4a 54 5f 4c 45 46  jointype&(JT_LEF
33bb0 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 29  T|JT_CROSS))!=0)
33bc0 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20    /* (1) */.    
33bd0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c  ){.      /* Impl
33be0 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69  ement a co-routi
33bf0 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74  ne that will ret
33c00 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  urn a single row
33c10 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
33c20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65       ** set on e
33c30 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a  ach invocation..
33c40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
33c50 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  nt addrTop = sql
33c60 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
33c70 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 20 0a  ddr(v)+1;.     .
33c80 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67        pItem->reg
33c90 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
33ca0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
33cb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
33cc0 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  (v, OP_InitCorou
33cd0 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
33ce0 52 65 74 75 72 6e 2c 20 30 2c 20 61 64 64 72 54  Return, 0, addrT
33cf0 6f 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  op);.      VdbeC
33d00 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c  omment((v, "%s",
33d10 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
33d20 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 70 49 74  ame));.      pIt
33d30 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20  em->addrFillSub 
33d40 3d 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20  = addrTop;.     
33d50 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
33d60 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
33d70 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74  T_Coroutine, pIt
33d80 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
33d90 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75 65        ExplainQue
33da0 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
33db0 31 2c 20 22 43 4f 2d 52 4f 55 54 49 4e 45 20 30  1, "CO-ROUTINE 0
33dc0 78 25 70 22 2c 20 70 53 75 62 29 29 3b 0a 20 20  x%p", pSub));.  
33dd0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
33de0 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20  t(pParse, pSub, 
33df0 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49  &dest);.      pI
33e00 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c  tem->pTab->nRowL
33e10 6f 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53  ogEst = pSub->nS
33e20 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20  electRow;.      
33e30 70 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  pItem->fg.viaCor
33e40 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20  outine = 1;.    
33e50 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 73 75    pItem->regResu
33e60 6c 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b  lt = dest.iSdst;
33e70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
33e80 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 76  beEndCoroutine(v
33e90 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
33ea0 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rn);.      sqlit
33eb0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
33ec0 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20  , addrTop-1);.  
33ed0 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
33ee0 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61  TempRegCache(pPa
33ef0 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rse);.    }else{
33f00 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
33f10 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
33f20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61  that will fill a
33f30 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c  n ephemeral tabl
33f40 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20  e with.      ** 
33f50 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
33f60 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20 70  his subquery.  p
33f70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
33f80 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20  b will point.   
33f90 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64 64     ** to the add
33fa0 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e 65  ress of the gene
33fb0 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  rated subroutine
33fc0 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  .  pItem->regRet
33fd0 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  urn.      ** is 
33fe0 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f 63  a register alloc
33ff0 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  ated to hold the
34000 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75   subroutine retu
34010 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20 20  rn address.     
34020 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f   */.      int to
34030 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74  pAddr;.      int
34040 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a 20   onceAddr = 0;. 
34050 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64 72       int retAddr
34060 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  ;.      struct S
34070 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 50 72  rcList_item *pPr
34080 69 6f 72 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  ior;..      asse
34090 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rt( pItem->addrF
340a0 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20  illSub==0 );.   
340b0 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74     pItem->regRet
340c0 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
340d0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41  nMem;.      topA
340e0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
340f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
34100 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d  teger, 0, pItem-
34110 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
34120 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69     pItem->addrFi
34130 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b  llSub = topAddr+
34140 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  1;.      if( pIt
34150 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61  em->fg.isCorrela
34160 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ted==0 ){.      
34170 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71    /* If the subq
34180 75 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72  uery is not corr
34190 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77 65  elated and if we
341a0 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20   are not inside 
341b0 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  of.        ** a 
341c0 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65  trigger, then we
341d0 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f   only need to co
341e0 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20  mpute the value 
341f0 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a  of the subquery.
34200 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e          ** once.
34210 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65   */.        once
34220 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
34230 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
34240 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
34250 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56  ge(v);.        V
34260 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
34270 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73  materialize \"%s
34280 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  \"", pItem->pTab
34290 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
342a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
342b0 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
342c0 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
342d0 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d   \"%s\"", pItem-
342e0 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
342f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
34300 72 69 6f 72 20 3d 20 69 73 53 65 6c 66 4a 6f 69  rior = isSelfJoi
34310 6e 56 69 65 77 28 70 54 61 62 4c 69 73 74 2c 20  nView(pTabList, 
34320 70 49 74 65 6d 29 3b 0a 20 20 20 20 20 20 69 66  pItem);.      if
34330 28 20 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ( pPrior ){.    
34340 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
34350 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
34360 44 75 70 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Dup, pItem->iCur
34370 73 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 69 43 75  sor, pPrior->iCu
34380 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 61  rsor);.        a
34390 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
343a0 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 20  Select!=0 );.   
343b0 20 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65       pSub->nSele
343c0 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
343d0 70 53 65 6c 65 63 74 2d 3e 6e 53 65 6c 65 63 74  pSelect->nSelect
343e0 52 6f 77 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Row;.      }else
343f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
34400 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
34410 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d  &dest, SRT_Ephem
34420 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Tab, pItem->iCur
34430 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 45 78  sor);.        Ex
34440 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28  plainQueryPlan((
34450 70 50 61 72 73 65 2c 20 31 2c 20 22 4d 41 54 45  pParse, 1, "MATE
34460 52 49 41 4c 49 5a 45 20 30 78 25 70 22 2c 20 70  RIALIZE 0x%p", p
34470 53 75 62 29 29 3b 0a 20 20 20 20 20 20 20 20 73  Sub));.        s
34480 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
34490 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74  rse, pSub, &dest
344a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
344b0 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52   pItem->pTab->nR
344c0 6f 77 4c 6f 67 45 73 74 20 3d 20 70 53 75 62 2d  owLogEst = pSub-
344d0 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
344e0 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20     if( onceAddr 
344f0 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
34500 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64  pHere(v, onceAdd
34510 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64  r);.      retAdd
34520 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
34530 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
34540 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  rn, pItem->regRe
34550 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62  turn);.      Vdb
34560 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
34570 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54  d %s", pItem->pT
34580 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
34590 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
345a0 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64  angeP1(v, topAdd
345b0 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20  r, retAddr);.   
345c0 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54     sqlite3ClearT
345d0 65 6d 70 52 65 67 43 61 63 68 65 28 70 50 61 72  empRegCache(pPar
345e0 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  se);.    }.    i
345f0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
34600 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  led ) goto selec
34610 74 5f 65 6e 64 3b 0a 20 20 20 20 70 50 61 72 73  t_end;.    pPars
34620 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71  e->nHeight -= sq
34630 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48  lite3SelectExprH
34640 65 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 50  eight(p);.    pP
34650 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
34660 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
34670 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66 0a 20  ontext;.#endif. 
34680 20 7d 0a 0a 20 20 2f 2a 20 56 61 72 69 6f 75 73   }..  /* Various
34690 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
346a0 20 53 45 4c 45 43 54 20 63 6f 70 69 65 64 20 69   SELECT copied i
346b0 6e 74 6f 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  nto local variab
346c0 6c 65 73 20 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e  les for.  ** con
346d0 76 65 6e 69 65 6e 63 65 20 2a 2f 0a 20 20 70 45  venience */.  pE
346e0 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74  List = p->pEList
346f0 3b 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  ;.  pWhere = p->
34700 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70  pWhere;.  pGroup
34710 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
34720 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
34730 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73  >pHaving;.  sDis
34740 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28  tinct.isTnct = (
34750 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
34760 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a  _Distinct)!=0;..
34770 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
34780 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71  ENABLED.  if( sq
34790 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
347a0 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
347b0 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30  SELECTTRACE(0x40
347c0 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
347d0 65 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  er all FROM-clau
347e0 73 65 20 61 6e 61 6c 79 73 69 73 3a 5c 6e 22 29  se analysis:\n")
347f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72  );.    sqlite3Tr
34800 65 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20  eeViewSelect(0, 
34810 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  p, 0);.  }.#endi
34820 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
34830 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f 4f 50 54  _COUNTOFVIEW_OPT
34840 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  IMIZATION.  if( 
34850 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
34860 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51  led(db, SQLITE_Q
34870 75 65 72 79 46 6c 61 74 74 65 6e 65 72 7c 53 51  ueryFlattener|SQ
34880 4c 49 54 45 5f 43 6f 75 6e 74 4f 66 56 69 65 77  LITE_CountOfView
34890 29 0a 20 20 20 26 26 20 63 6f 75 6e 74 4f 66 56  ).   && countOfV
348a0 69 65 77 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 28  iewOptimization(
348b0 70 50 61 72 73 65 2c 20 70 29 0a 20 20 29 7b 0a  pParse, p).  ){.
348c0 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
348d0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
348e0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
348f0 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
34900 73 74 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  st;.    pTabList
34910 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a   = p->pSrc;.  }.
34920 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
34930 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53  the query is DIS
34940 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52  TINCT with an OR
34950 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f  DER BY but is no
34960 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20  t an aggregate, 
34970 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  and .  ** if the
34980 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20   select-list is 
34990 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
349a0 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74  ORDER BY list, t
349b0 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20  hen this query. 
349c0 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69   ** can be rewri
349d0 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20  tten as a GROUP 
349e0 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  BY. In other wor
349f0 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ds, this:.  **. 
34a00 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44   **     SELECT D
34a10 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d  ISTINCT xyz FROM
34a20 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79   ... ORDER BY xy
34a30 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74  z.  **.  ** is t
34a40 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20  ransformed to:. 
34a50 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
34a60 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  ECT xyz FROM ...
34a70 20 47 52 4f 55 50 20 42 59 20 78 79 7a 20 4f 52   GROUP BY xyz OR
34a80 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a  DER BY xyz.  **.
34a90 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
34aa0 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72 65  form is preferre
34ab0 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  d as a single in
34ac0 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62  dex (or temp-tab
34ad0 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a  le) may be .  **
34ae0 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74   used for both t
34af0 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20  he ORDER BY and 
34b00 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73  DISTINCT process
34b10 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c  ing. As original
34b20 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e  ly .  ** written
34b30 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74 20   the query must 
34b40 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65  use a temp-table
34b50 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e   for at least on
34b60 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a  e of the ORDER .
34b70 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54    ** BY and DIST
34b80 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64  INCT, and an ind
34b90 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20 74  ex or separate t
34ba0 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68  emp-table for th
34bb0 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20  e other..  */.  
34bc0 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
34bd0 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
34be0 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
34bf0 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20  SF_Distinct .   
34c00 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  && sqlite3ExprLi
34c10 73 74 43 6f 6d 70 61 72 65 28 73 53 6f 72 74 2e  stCompare(sSort.
34c20 70 4f 72 64 65 72 42 79 2c 20 70 45 4c 69 73 74  pOrderBy, pEList
34c30 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20  , -1)==0.  ){.  
34c40 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
34c50 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
34c60 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
34c70 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
34c80 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
34c90 62 2c 20 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20  b, pEList, 0);. 
34ca0 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61     /* Notice tha
34cb0 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53  t even thought S
34cc0 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62  F_Distinct has b
34cd0 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d  een cleared from
34ce0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20   p->selFlags,.  
34cf0 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e    ** the sDistin
34d00 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69  ct.isTnct is sti
34d10 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20  ll set.  Hence, 
34d20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74  isTnct represent
34d30 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69  s the.    ** ori
34d40 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66  ginal setting of
34d50 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74   the SF_Distinct
34d60 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63   flag, not the c
34d70 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a  urrent setting *
34d80 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44  /.    assert( sD
34d90 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29  istinct.isTnct )
34da0 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41  ;..#if SELECTTRA
34db0 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 69  CE_ENABLED.    i
34dc0 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  f( sqlite3Select
34dd0 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29 7b  Trace & 0x400 ){
34de0 0a 20 20 20 20 20 20 53 45 4c 45 43 54 54 52 41  .      SELECTTRA
34df0 43 45 28 30 78 34 30 30 2c 70 50 61 72 73 65 2c  CE(0x400,pParse,
34e00 70 2c 28 22 54 72 61 6e 73 66 6f 72 6d 20 44 49  p,("Transform DI
34e10 53 54 49 4e 43 54 20 69 6e 74 6f 20 47 52 4f 55  STINCT into GROU
34e20 50 20 42 59 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  P BY:\n"));.    
34e30 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65    sqlite3TreeVie
34e40 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29  wSelect(0, p, 0)
34e50 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
34e60 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
34e70 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
34e80 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 63 72   clause, then cr
34e90 65 61 74 65 20 61 6e 20 65 70 68 65 6d 65 72 61  eate an ephemera
34ea0 6c 20 69 6e 64 65 78 20 74 6f 0a 20 20 2a 2a 20  l index to.  ** 
34eb0 64 6f 20 74 68 65 20 73 6f 72 74 69 6e 67 2e 20  do the sorting. 
34ec0 20 42 75 74 20 74 68 69 73 20 73 6f 72 74 69 6e   But this sortin
34ed0 67 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65  g ephemeral inde
34ee0 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 0a 20  x might end up. 
34ef0 20 2a 2a 20 62 65 69 6e 67 20 75 6e 75 73 65 64   ** being unused
34f00 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61 6e   if the data can
34f10 20 62 65 20 65 78 74 72 61 63 74 65 64 20 69 6e   be extracted in
34f20 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65   pre-sorted orde
34f30 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 61 74 20  r..  ** If that 
34f40 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
34f50 6e 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  n the OP_OpenEph
34f60 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
34f70 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  on will be.  ** 
34f80 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50  changed to an OP
34f90 5f 4e 6f 6f 70 20 6f 6e 63 65 20 77 65 20 66 69  _Noop once we fi
34fa0 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74 68  gure out that th
34fb0 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
34fc0 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6e 65 65 64  is.  ** not need
34fd0 65 64 2e 20 20 54 68 65 20 73 53 6f 72 74 2e 61  ed.  The sSort.a
34fe0 64 64 72 53 6f 72 74 49 6e 64 65 78 20 76 61 72  ddrSortIndex var
34ff0 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
35000 20 66 61 63 69 6c 69 74 61 74 65 0a 20 20 2a 2a   facilitate.  **
35010 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20   that change..  
35020 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74 2e 70  */.  if( sSort.p
35030 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b  OrderBy ){.    K
35040 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
35050 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
35060 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
35070 4c 69 73 74 28 70 50 61 72 73 65 2c 20 73 53 6f  List(pParse, sSo
35080 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 30 2c 20  rt.pOrderBy, 0, 
35090 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
350a0 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73      sSort.iECurs
350b0 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
350c0 62 2b 2b 3b 0a 20 20 20 20 73 53 6f 72 74 2e 61  b++;.    sSort.a
350d0 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20  ddrSortIndex =. 
350e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
350f0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
35100 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20  nEphemeral,.    
35110 20 20 20 20 20 20 73 53 6f 72 74 2e 69 45 43 75        sSort.iECu
35120 72 73 6f 72 2c 20 73 53 6f 72 74 2e 70 4f 72 64  rsor, sSort.pOrd
35130 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2b 70 45  erBy->nExpr+1+pE
35140 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a  List->nExpr, 0,.
35150 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
35160 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
35170 59 49 4e 46 4f 0a 20 20 20 20 20 20 29 3b 0a 20  YINFO.      );. 
35180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 53 6f 72   }else{.    sSor
35190 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20  t.addrSortIndex 
351a0 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
351b0 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
351c0 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
351d0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
351e0 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
351f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  ..  */.  if( pDe
35200 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
35210 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73  phemTab ){.    s
35220 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
35230 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
35240 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44  eral, pDest->iSD
35250 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Parm, pEList->nE
35260 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  xpr);.  }..  /* 
35270 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
35280 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73  .  */.  iEnd = s
35290 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
352a0 62 65 6c 28 76 29 3b 0a 20 20 69 66 28 20 28 70  bel(v);.  if( (p
352b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
352c0 46 69 78 65 64 4c 69 6d 69 74 29 3d 3d 30 20 29  FixedLimit)==0 )
352d0 7b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74  {.    p->nSelect
352e0 52 6f 77 20 3d 20 33 32 30 3b 20 20 2f 2a 20 34  Row = 320;  /* 4
352f0 20 62 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f   billion rows */
35300 0a 20 20 7d 0a 20 20 63 6f 6d 70 75 74 65 4c 69  .  }.  computeLi
35310 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
35320 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20  rse, p, iEnd);. 
35330 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d   if( p->iLimit==
35340 30 20 26 26 20 73 53 6f 72 74 2e 61 64 64 72 53  0 && sSort.addrS
35350 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20  ortIndex>=0 ){. 
35360 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
35370 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 73 53  angeOpcode(v, sS
35380 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
35390 78 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  x, OP_SorterOpen
353a0 29 3b 0a 20 20 20 20 73 53 6f 72 74 2e 73 6f 72  );.    sSort.sor
353b0 74 46 6c 61 67 73 20 7c 3d 20 53 4f 52 54 46 4c  tFlags |= SORTFL
353c0 41 47 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20  AG_UseSorter;.  
353d0 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6e 20  }..  /* Open an 
353e0 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
353f0 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 64  to use for the d
35400 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a  istinct set..  *
35410 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  /.  if( p->selFl
35420 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
35430 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69 6e  t ){.    sDistin
35440 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50 61  ct.tabTnct = pPa
35450 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
35460 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72 54   sDistinct.addrT
35470 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nct = sqlite3Vdb
35480 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70  eAddOp4(v, OP_Op
35490 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20  enEphemeral,.   
354a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
354b0 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69            sDisti
354c0 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20  nct.tabTnct, 0, 
354d0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
354e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
354f0 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72  (char*)keyInfoFr
35500 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
35510 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 30 2c 30  e, p->pEList,0,0
35520 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
35530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35540 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
35550 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
35560 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e  geP5(v, BTREE_UN
35570 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44  ORDERED);.    sD
35580 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
35590 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  e = WHERE_DISTIN
355a0 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20  CT_UNORDERED;.  
355b0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74  }else{.    sDist
355c0 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d  inct.eTnctType =
355d0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
355e0 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  NOOP;.  }..  if(
355f0 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75   !isAgg && pGrou
35600 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 57 69  pBy==0 ){.    Wi
35610 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20 70 2d 3e  ndow *pWin = p->
35620 70 57 69 6e 3b 0a 20 20 20 20 69 6e 74 20 72 65  pWin;.    int re
35630 67 50 61 72 74 20 3d 20 30 3b 0a 0a 20 20 20 20  gPart = 0;..    
35640 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20  /* No aggregate 
35650 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f  functions and no
35660 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
35670 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72   */.    u16 wctr
35680 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69  lFlags = (sDisti
35690 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45  nct.isTnct ? WHE
356a0 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
356b0 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72   : 0);.    asser
356c0 74 28 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d  t( WHERE_USE_LIM
356d0 49 54 3d 3d 53 46 5f 46 69 78 65 64 4c 69 6d 69  IT==SF_FixedLimi
356e0 74 20 29 3b 0a 20 20 20 20 77 63 74 72 6c 46 6c  t );.    wctrlFl
356f0 61 67 73 20 7c 3d 20 70 2d 3e 73 65 6c 46 6c 61  ags |= p->selFla
35700 67 73 20 26 20 53 46 5f 46 69 78 65 64 4c 69 6d  gs & SF_FixedLim
35710 69 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 57 69  it;..    if( pWi
35720 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  n ){.      int n
35730 50 61 72 74 20 3d 20 28 70 57 69 6e 2d 3e 70 50  Part = (pWin->pP
35740 61 72 74 69 74 69 6f 6e 20 3f 20 70 57 69 6e 2d  artition ? pWin-
35750 3e 70 50 61 72 74 69 74 69 6f 6e 2d 3e 6e 45 78  >pPartition->nEx
35760 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 6e  pr : 0);.      n
35770 50 61 72 74 20 2b 3d 20 28 70 57 69 6e 2d 3e 70  Part += (pWin->p
35780 4f 72 64 65 72 42 79 20 3f 20 70 57 69 6e 2d 3e  OrderBy ? pWin->
35790 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
357a0 3a 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  : 0);.      if( 
357b0 6e 50 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20  nPart ){.       
357c0 20 72 65 67 50 61 72 74 20 3d 20 70 50 61 72 73   regPart = pPars
357d0 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
357e0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
357f0 2b 3d 20 6e 50 61 72 74 3b 0a 20 20 20 20 20 20  += nPart;.      
35800 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35810 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
35820 30 2c 20 72 65 67 50 61 72 74 2c 20 72 65 67 50  0, regPart, regP
35830 61 72 74 2b 6e 50 61 72 74 2d 31 29 3b 0a 20 20  art+nPart-1);.  
35840 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
35850 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61   /* Begin the da
35860 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a  tabase scan. */.
35870 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
35880 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68 65  1,pParse,p,("Whe
35890 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20 20  reBegin\n"));.  
358a0 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
358b0 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
358c0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
358d0 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70 4f 72  Where, sSort.pOr
358e0 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
358f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35900 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2c        p->pEList,
35910 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 70 2d 3e   wctrlFlags, p->
35920 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20  nSelectRow);.   
35930 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29   if( pWInfo==0 )
35940 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
35950 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
35960 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43  3WhereOutputRowC
35970 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70  ount(pWInfo) < p
35980 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a  ->nSelectRow ){.
35990 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
359a0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65  Row = sqlite3Whe
359b0 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74  reOutputRowCount
359c0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  (pWInfo);.    }.
359d0 20 20 20 20 69 66 28 20 73 44 69 73 74 69 6e 63      if( sDistinc
359e0 74 2e 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69  t.isTnct && sqli
359f0 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e  te3WhereIsDistin
35a00 63 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  ct(pWInfo) ){.  
35a10 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
35a20 6e 63 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65  nctType = sqlite
35a30 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74  3WhereIsDistinct
35a40 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a  (pWInfo);.    }.
35a50 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e 70 4f      if( sSort.pO
35a60 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
35a70 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d 20 73  sSort.nOBSat = s
35a80 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64  qlite3WhereIsOrd
35a90 65 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  ered(pWInfo);.  
35aa0 20 20 20 20 73 53 6f 72 74 2e 62 4f 72 64 65 72      sSort.bOrder
35ab0 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20 73 71  edInnerLoop = sq
35ac0 6c 69 74 65 33 57 68 65 72 65 4f 72 64 65 72 65  lite3WhereOrdere
35ad0 64 49 6e 6e 65 72 4c 6f 6f 70 28 70 57 49 6e 66  dInnerLoop(pWInf
35ae0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 53  o);.      if( sS
35af0 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53 6f 72  ort.nOBSat==sSor
35b00 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  t.pOrderBy->nExp
35b10 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 53 6f  r ){.        sSo
35b20 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  rt.pOrderBy = 0;
35b30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
35b40 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e      /* If sortin
35b50 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73  g index that was
35b60 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
35b70 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  ior OP_OpenEphem
35b80 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73  eral .    ** ins
35b90 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75  truction ended u
35ba0 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64  p not being need
35bb0 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20  ed, then change 
35bc0 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
35bd0 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  eral.    ** into
35be0 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20   an OP_Noop..   
35bf0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 53 6f 72   */.    if( sSor
35c00 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  t.addrSortIndex>
35c10 3d 30 20 26 26 20 73 53 6f 72 74 2e 70 4f 72 64  =0 && sSort.pOrd
35c20 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  erBy==0 ){.     
35c30 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
35c40 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53 6f 72  geToNoop(v, sSor
35c50 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  t.addrSortIndex)
35c60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
35c70 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d  ert( p->pEList==
35c80 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 69 66  pEList );.    if
35c90 28 20 70 2d 3e 70 57 69 6e 20 29 7b 0a 20 20 20  ( p->pWin ){.   
35ca0 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
35cb0 69 6e 74 20 69 53 75 62 43 73 72 20 3d 20 70 2d  int iSubCsr = p-
35cc0 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 69 43 75 72  >pSrc->a[0].iCur
35cd0 73 6f 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  sor;.      int n
35ce0 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Sub = p->pSrc->a
35cf0 5b 30 5d 2e 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a  [0].pTab->nCol;.
35d00 20 20 20 20 20 20 69 6e 74 20 72 65 67 20 3d 20        int reg = 
35d10 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
35d20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63        int regRec
35d30 6f 72 64 20 3d 20 72 65 67 2b 6e 53 75 62 3b 0a  ord = reg+nSub;.
35d40 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77        int regRow
35d50 69 64 20 3d 20 72 65 67 52 65 63 6f 72 64 2b 31  id = regRecord+1
35d60 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 47  ;.      int regG
35d70 6f 73 75 62 20 3d 20 72 65 67 52 6f 77 69 64 2b  osub = regRowid+
35d80 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  1;.      int add
35d90 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  r;.      int add
35da0 72 47 6f 73 75 62 3b 0a 0a 20 20 20 20 20 20 70  rGosub;..      p
35db0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
35dc0 53 75 62 20 2b 20 33 3b 0a 0a 20 20 20 20 20 20  Sub + 3;..      
35dd0 2f 2a 20 4d 61 72 74 69 61 6c 20 74 68 65 20 72  /* Martial the r
35de0 6f 77 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ow returned by t
35df0 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 69 6e  he sub-select in
35e00 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 0a  to an array of .
35e10 20 20 20 20 20 20 2a 2a 20 72 65 67 69 73 74 65        ** registe
35e20 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  rs. */.      for
35e30 28 6b 3d 30 3b 20 6b 3c 6e 53 75 62 3b 20 6b 2b  (k=0; k<nSub; k+
35e40 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
35e50 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
35e60 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 75 62   OP_Column, iSub
35e70 43 73 72 2c 20 6b 2c 20 72 65 67 2b 6b 29 3b 0a  Csr, k, reg+k);.
35e80 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
35e90 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20  * Check if this 
35ea0 69 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  is the start of 
35eb0 61 20 6e 65 77 20 70 61 72 74 69 74 69 6f 6e 20  a new partition 
35ec0 6f 72 20 70 65 65 72 20 67 72 6f 75 70 2e 20 2a  or peer group. *
35ed0 2f 0a 20 20 20 20 20 20 69 66 28 20 72 65 67 50  /.      if( regP
35ee0 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 45  art ){.        E
35ef0 78 70 72 4c 69 73 74 20 2a 70 50 61 72 74 20 3d  xprList *pPart =
35f00 20 70 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f   pWin->pPartitio
35f10 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  n;.        int n
35f20 50 61 72 74 20 3d 20 28 70 50 61 72 74 20 3f 20  Part = (pPart ? 
35f30 70 50 61 72 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pPart->nExpr : 0
35f40 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  );.        ExprL
35f50 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20  ist *pOrderBy = 
35f60 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  pWin->pOrderBy;.
35f70 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 65 65          int nPee
35f80 72 20 3d 20 28 70 4f 72 64 65 72 42 79 20 3f 20  r = (pOrderBy ? 
35f90 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
35fa0 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  : 0);.        in
35fb0 74 20 61 64 64 72 47 6f 74 6f 20 3d 20 30 3b 0a  t addrGoto = 0;.
35fc0 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
35fd0 4a 75 6d 70 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Jump = 0;..     
35fe0 20 20 20 69 66 28 20 70 50 61 72 74 20 29 7b 0a     if( pPart ){.
35ff0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 65            int re
36000 67 4e 65 77 50 61 72 74 20 3d 20 72 65 67 20 2b  gNewPart = reg +
36010 20 70 57 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f   pWin->nBufferCo
36020 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 4b 65 79  l;.          Key
36030 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
36040 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
36050 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 50 61  List(pParse, pPa
36060 72 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  rt, 0, 0);.     
36070 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
36080 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
36090 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67   OP_Compare, reg
360a0 4e 65 77 50 61 72 74 2c 20 72 65 67 50 61 72 74  NewPart, regPart
360b0 2c 20 6e 50 61 72 74 29 3b 0a 20 20 20 20 20 20  , nPart);.      
360c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
360d0 70 70 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64  ppendP4(v, (void
360e0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
360f0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20  EYINFO);.       
36100 20 20 20 61 64 64 72 4a 75 6d 70 20 3d 20 73 71     addrJump = sq
36110 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
36120 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72  v, OP_Jump, addr
36130 2b 32 2c 20 30 2c 20 61 64 64 72 2b 32 29 3b 0a  +2, 0, addr+2);.
36140 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
36150 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
36160 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 57 69 6e  P_AggFinal, pWin
36170 2d 3e 72 65 67 41 63 63 75 6d 2c 20 70 57 69 6e  ->regAccum, pWin
36180 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 20  ->nArg);.       
36190 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
361a0 70 65 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e  pendP4(v, pWin->
361b0 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
361c0 46 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  F);.          sq
361d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
361e0 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 57 69 6e  v, OP_Copy, pWin
361f0 2d 3e 72 65 67 41 63 63 75 6d 2c 20 70 57 69 6e  ->regAccum, pWin
36200 2d 3e 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  ->regResult);.  
36210 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64          if( pOrd
36220 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
36230 20 20 20 20 61 64 64 72 47 6f 74 6f 20 3d 20 73      addrGoto = s
36240 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
36250 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
36260 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36270 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
36280 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
36290 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 4e 65         int regNe
362a0 77 50 65 65 72 20 3d 20 72 65 67 20 2b 20 70 57  wPeer = reg + pW
362b0 69 6e 2d 3e 6e 42 75 66 66 65 72 43 6f 6c 20 2b  in->nBufferCol +
362c0 20 6e 50 61 72 74 3b 0a 20 20 20 20 20 20 20 20   nPart;.        
362d0 20 20 69 6e 74 20 72 65 67 50 65 65 72 20 3d 20    int regPeer = 
362e0 72 65 67 50 61 72 74 20 2b 20 6e 50 61 72 74 3b  regPart + nPart;
362f0 0a 0a 20 20 20 20 20 20 20 20 20 20 4b 65 79 49  ..          KeyI
36300 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
36310 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
36320 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ist(pParse, pOrd
36330 65 72 42 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20  erBy, 0, 0);.   
36340 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72 4a         if( addrJ
36350 75 6d 70 20 29 20 73 71 6c 69 74 65 33 56 64 62  ump ) sqlite3Vdb
36360 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
36370 72 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20 20  rJump);.        
36380 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
36390 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
363a0 5f 43 6f 6d 70 61 72 65 2c 20 72 65 67 4e 65 77  _Compare, regNew
363b0 50 65 65 72 2c 20 72 65 67 50 65 65 72 2c 20 6e  Peer, regPeer, n
363c0 50 65 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Peer);.         
363d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
363e0 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29 70  ndP4(v, (void*)p
363f0 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
36400 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  NFO);.          
36410 61 64 64 72 4a 75 6d 70 20 3d 20 73 71 6c 69 74  addrJump = sqlit
36420 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
36430 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 2b 32 2c  OP_Jump, addr+2,
36440 20 30 2c 20 61 64 64 72 2b 32 29 3b 0a 20 20 20   0, addr+2);.   
36450 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
36460 62 65 41 64 64 4f 70 33 28 76 2c 20 0a 20 20 20  beAddOp3(v, .   
36470 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 41 67             OP_Ag
36480 67 46 69 6e 61 6c 2c 20 70 57 69 6e 2d 3e 72 65  gFinal, pWin->re
36490 67 41 63 63 75 6d 2c 20 70 57 69 6e 2d 3e 6e 41  gAccum, pWin->nA
364a0 72 67 2c 20 70 57 69 6e 2d 3e 72 65 67 52 65 73  rg, pWin->regRes
364b0 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b  ult.          );
364c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
364d0 65 33 56 64 62 65 41 70 70 65 6e 64 50 34 28 76  e3VdbeAppendP4(v
364e0 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63 2c 20 50  , pWin->pFunc, P
364f0 34 5f 46 55 4e 43 44 45 46 29 3b 0a 0a 20 20 20  4_FUNCDEF);..   
36500 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72 47         if( addrG
36510 6f 74 6f 20 29 20 73 71 6c 69 74 65 33 56 64 62  oto ) sqlite3Vdb
36520 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
36530 72 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 20 20  rGoto);.        
36540 7d 0a 0a 20 20 20 20 20 20 20 20 61 64 64 72 47  }..        addrG
36550 6f 73 75 62 20 3d 20 73 71 6c 69 74 65 33 56 64  osub = sqlite3Vd
36560 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 47  beAddOp1(v, OP_G
36570 6f 73 75 62 2c 20 72 65 67 47 6f 73 75 62 29 3b  osub, regGosub);
36580 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
36590 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
365a0 5f 52 65 73 65 74 53 6f 72 74 65 72 2c 20 70 57  _ResetSorter, pW
365b0 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a 20 20  in->iEphCsr);.  
365c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
365d0 65 41 64 64 4f 70 33 28 76 2c 4f 50 5f 43 6f 70  eAddOp3(v,OP_Cop
365e0 79 2c 72 65 67 2b 70 57 69 6e 2d 3e 6e 42 75 66  y,reg+pWin->nBuf
365f0 66 65 72 43 6f 6c 2c 72 65 67 50 61 72 74 2c 6e  ferCol,regPart,n
36600 50 61 72 74 2b 6e 50 65 65 72 2d 31 29 3b 0a 0a  Part+nPeer-1);..
36610 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
36620 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
36630 64 64 72 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20  ddrJump);.      
36640 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 76 6f  }..      /* Invo
36650 6b 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e  ke step function
36660 20 66 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e 63   for window func
36670 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 73  tions */.      s
36680 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
36690 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 30 2c  (v, OP_AggStep0,
366a0 20 30 2c 20 72 65 67 2b 70 57 69 6e 2d 3e 69 41   0, reg+pWin->iA
366b0 72 67 43 6f 6c 2c 20 70 57 69 6e 2d 3e 72 65 67  rgCol, pWin->reg
366c0 41 63 63 75 6d 29 3b 0a 20 20 20 20 20 20 73 71  Accum);.      sq
366d0 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
366e0 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46 75 6e 63  4(v, pWin->pFunc
366f0 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
36700 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
36710 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
36720 70 57 69 6e 2d 3e 6e 41 72 67 29 3b 0a 0a 20 20  pWin->nArg);..  
36730 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 68      /* Buffer th
36740 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 6e  e current row in
36750 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 74   the ephemeral t
36760 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  able. */.      i
36770 66 28 20 70 57 69 6e 2d 3e 6e 42 75 66 66 65 72  f( pWin->nBuffer
36780 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Col>0 ){.       
36790 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
367a0 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
367b0 6f 72 64 2c 20 72 65 67 2c 20 70 57 69 6e 2d 3e  ord, reg, pWin->
367c0 6e 42 75 66 66 65 72 43 6f 6c 2c 20 72 65 67 52  nBufferCol, regR
367d0 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 7d 65  ecord);.      }e
367e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
367f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
36800 2c 20 4f 50 5f 42 6c 6f 62 2c 20 30 2c 20 72 65  , OP_Blob, 0, re
36810 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
36820 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70    sqlite3VdbeApp
36830 65 6e 64 50 34 28 76 2c 20 28 76 6f 69 64 2a 29  endP4(v, (void*)
36840 22 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  "", 0);.      }.
36850 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
36860 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
36870 77 52 6f 77 69 64 2c 20 70 57 69 6e 2d 3e 69 45  wRowid, pWin->iE
36880 70 68 43 73 72 2c 20 72 65 67 52 6f 77 69 64 29  phCsr, regRowid)
36890 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
368a0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
368b0 49 6e 73 65 72 74 2c 20 70 57 69 6e 2d 3e 69 45  Insert, pWin->iE
368c0 70 68 43 73 72 2c 20 72 65 67 52 65 63 6f 72 64  phCsr, regRecord
368d0 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20  , regRowid);..  
368e0 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64      /* End the d
368f0 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f  atabase scan loo
36900 70 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  p. */.      sqli
36910 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
36920 66 6f 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  fo);..      sqli
36930 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
36940 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 57   OP_AggFinal, pW
36950 69 6e 2d 3e 72 65 67 41 63 63 75 6d 2c 20 70 57  in->regAccum, pW
36960 69 6e 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  in->nArg);.     
36970 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 65   sqlite3VdbeAppe
36980 6e 64 50 34 28 76 2c 20 70 57 69 6e 2d 3e 70 46  ndP4(v, pWin->pF
36990 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
369a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
369b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
369c0 43 6f 70 79 2c 20 70 57 69 6e 2d 3e 72 65 67 41  Copy, pWin->regA
369d0 63 63 75 6d 2c 20 70 57 69 6e 2d 3e 72 65 67 52  ccum, pWin->regR
369e0 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 73 71  esult);.      sq
369f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
36a00 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
36a10 47 6f 73 75 62 2c 20 73 71 6c 69 74 65 33 56 64  Gosub, sqlite3Vd
36a20 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
36a30 2b 32 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  +2);..      sqli
36a40 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
36a50 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20   OP_Goto);.     
36a60 20 69 66 28 20 72 65 67 50 61 72 74 20 29 7b 0a   if( regPart ){.
36a70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
36a80 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
36a90 64 64 72 47 6f 73 75 62 29 3b 0a 20 20 20 20 20  ddrGosub);.     
36aa0 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20   }.      addr = 
36ab0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
36ac0 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  1(v, OP_Rewind, 
36ad0 70 57 69 6e 2d 3e 69 45 70 68 43 73 72 29 3b 0a  pWin->iEphCsr);.
36ae0 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
36af0 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
36b00 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73 44   -1, &sSort, &sD
36b10 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 20  istinct, pDest, 
36b20 61 64 64 72 2b 31 2c 20 30 29 3b 0a 20 20 20 20  addr+1, 0);.    
36b30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
36b40 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
36b50 70 57 69 6e 2d 3e 69 45 70 68 43 73 72 2c 20 61  pWin->iEphCsr, a
36b60 64 64 72 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  ddr+1);.      sq
36b70 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
36b80 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
36b90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
36ba0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
36bb0 2c 20 72 65 67 47 6f 73 75 62 29 3b 0a 20 20 20  , regGosub);.   
36bc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
36bd0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 2d 31  mpHere(v, addr-1
36be0 29 3b 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 47  );       /* OP_G
36bf0 6f 74 6f 20 6a 75 6d 70 73 20 68 65 72 65 20 2a  oto jumps here *
36c00 2f 0a 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  /..    }else{.  
36c10 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73      /* Use the s
36c20 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f  tandard inner lo
36c30 6f 70 2e 20 2a 2f 0a 20 20 20 20 20 20 73 65 6c  op. */.      sel
36c40 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
36c50 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53 6f  rse, p, -1, &sSo
36c60 72 74 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20  rt, &sDistinct, 
36c70 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
36c80 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f 6e   sqlite3WhereCon
36c90 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e 66  tinueLabel(pWInf
36ca0 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 73 71  o),.          sq
36cb0 6c 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c  lite3WhereBreakL
36cc0 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a  abel(pWInfo));..
36cd0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65        /* End the
36ce0 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c   database scan l
36cf0 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  oop..      */.  
36d00 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
36d10 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
36d20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
36d30 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77 68 65  /* This case whe
36d40 6e 20 74 68 65 72 65 20 65 78 69 73 74 20 61 67  n there exist ag
36d50 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
36d60 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20  s or a GROUP BY 
36d70 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72  clause.    ** or
36d80 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d   both */.    Nam
36d90 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
36da0 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
36db0 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20   for processing 
36dc0 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d  aggregate inform
36dd0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  ation */.    int
36de0 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iAMem;         
36df0 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
36e00 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e  dress for storin
36e10 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  g current GROUP 
36e20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42  BY */.    int iB
36e30 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Mem;          /*
36e40 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65   First Mem addre
36e50 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20  ss for previous 
36e60 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
36e70 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20  int iUseFlag;   
36e80 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
36e90 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20  ss holding flag 
36ea0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
36eb0 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20  at least.       
36ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ed0 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74   ** one row of t
36ee0 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20  he input to the 
36ef0 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62  aggregator has b
36f00 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  een.            
36f10 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70              ** p
36f20 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20  rocessed */.    
36f30 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20  int iAbortFlag; 
36f40 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65      /* Mem addre
36f50 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20  ss which causes 
36f60 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70  query abort if p
36f70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69  ositive */.    i
36f80 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20  nt groupBySort; 
36f90 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20     /* Rows come 
36fa0 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47  from source in G
36fb0 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f  ROUP BY order */
36fc0 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64  .    int addrEnd
36fd0 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;        /* End 
36fe0 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  of processing fo
36ff0 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f  r this SELECT */
37000 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61  .    int sortPTa
37010 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75  b = 0;   /* Pseu
37020 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20  dotable used to 
37030 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72  decode sorting r
37040 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e  esults */.    in
37050 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20  t sortOut = 0;  
37060 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69    /* Output regi
37070 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f  ster from the so
37080 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rter */.    int 
37090 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30 3b 20  orderByGrp = 0; 
370a0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 47  /* True if the G
370b0 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52 44 45  ROUP BY and ORDE
370c0 52 20 42 59 20 61 72 65 20 74 68 65 20 73 61 6d  R BY are the sam
370d0 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  e */..    /* Rem
370e0 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20  ove any and all 
370f0 61 6c 69 61 73 65 73 20 62 65 74 77 65 65 6e 20  aliases between 
37100 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
37110 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52  nd the.    ** GR
37120 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
37130 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
37140 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
37150 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20  int k;          
37160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37170 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
37180 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
37190 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
371a0 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  em;  /* For loop
371b0 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65 73 73  ing over express
371c0 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f  ion in a list */
371d0 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d  ..      for(k=p-
371e0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20  >pEList->nExpr, 
371f0 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d  pItem=p->pEList-
37200 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49  >a; k>0; k--, pI
37210 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
37220 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61  pItem->u.x.iAlia
37230 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 0;.      }. 
37240 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75       for(k=pGrou
37250 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65  pBy->nExpr, pIte
37260 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b  m=pGroupBy->a; k
37270 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
37280 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
37290 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
372a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
372b0 61 73 73 65 72 74 28 20 36 36 3d 3d 73 71 6c 69  assert( 66==sqli
372c0 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29 20 29  te3LogEst(100) )
372d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
372e0 53 65 6c 65 63 74 52 6f 77 3e 36 36 20 29 20 70  SelectRow>66 ) p
372f0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 36  ->nSelectRow = 6
37300 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  6;.    }else{.  
37310 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73      assert( 0==s
37320 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20  qlite3LogEst(1) 
37330 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  );.      p->nSel
37340 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20  ectRow = 0;.    
37350 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
37360 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f  re is both a GRO
37370 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44  UP BY and an ORD
37380 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
37390 20 74 68 65 79 20 61 72 65 0a 20 20 20 20 2a 2a   they are.    **
373a0 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e   identical, then
373b0 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73 73 69   it may be possi
373c0 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65 20 74  ble to disable t
373d0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
373e0 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  se .    ** on th
373f0 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74 20 74  e grounds that t
37400 68 65 20 47 52 4f 55 50 20 42 59 20 77 69 6c 6c  he GROUP BY will
37410 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20   cause elements 
37420 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20 20 20  to come out .   
37430 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65   ** in the corre
37440 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61 6c 73  ct order. It als
37450 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68 65 20  o may not - the 
37460 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74 20 75  GROUP BY might u
37470 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61 74 61  se a.    ** data
37480 62 61 73 65 20 69 6e 64 65 78 20 74 68 61 74 20  base index that 
37490 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f 20 62  causes rows to b
374a0 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68  e grouped togeth
374b0 65 72 20 61 73 20 72 65 71 75 69 72 65 64 0a 20  er as required. 
374c0 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 61 63     ** but not ac
374d0 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e 20 45  tually sorted. E
374e0 69 74 68 65 72 20 77 61 79 2c 20 72 65 63 6f 72  ither way, recor
374f0 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
37500 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44 45 52  the.    ** ORDER
37510 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59   BY and GROUP BY
37520 20 63 6c 61 75 73 65 73 20 61 72 65 20 74 68 65   clauses are the
37530 20 73 61 6d 65 20 62 79 20 73 65 74 74 69 6e 67   same by setting
37540 20 74 68 65 20 6f 72 64 65 72 42 79 47 72 70 0a   the orderByGrp.
37550 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 2e      ** variable.
37560 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
37570 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70  ite3ExprListComp
37580 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20 73 53  are(pGroupBy, sS
37590 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20 2d 31  ort.pOrderBy, -1
375a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 72  )==0 ){.      or
375b0 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a 20 20  derByGrp = 1;.  
375c0 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65    }. .    /* Cre
375d0 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a  ate a label to j
375e0 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77  ump to when we w
375f0 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65  ant to abort the
37600 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64   query */.    ad
37610 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  drEnd = sqlite3V
37620 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
37630 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74  ..    /* Convert
37640 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73   TK_COLUMN nodes
37650 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c   into TK_AGG_COL
37660 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74  UMN and make ent
37670 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73  ries in.    ** s
37680 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20  AggInfo for all 
37690 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
376a0 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73  nodes in express
376b0 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ions of the.    
376c0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
376d0 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
376e0 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
376f0 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
37700 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
37710 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
37720 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69  SrcList = pTabLi
37730 73 74 3b 0a 20 20 20 20 73 4e 43 2e 75 4e 43 2e  st;.    sNC.uNC.
37740 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67  pAggInfo = &sAgg
37750 49 6e 66 6f 3b 0a 20 20 20 20 56 56 41 5f 4f 4e  Info;.    VVA_ON
37760 4c 59 28 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20  LY( sNC.ncFlags 
37770 3d 20 4e 43 5f 55 41 67 67 49 6e 66 6f 3b 20 29  = NC_UAggInfo; )
37780 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e  .    sAggInfo.mn
37790 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
377a0 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e  em+1;.    sAggIn
377b0 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
377c0 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
377d0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 20 3a  GroupBy->nExpr :
377e0 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
377f0 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
37800 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  upBy;.    sqlite
37810 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
37820 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
37830 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
37840 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
37850 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70 4f 72  (&sNC, sSort.pOr
37860 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20  derBy);.    if( 
37870 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20  pHaving ){.     
37880 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
37890 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
378a0 20 70 57 68 65 72 65 3d 3d 70 2d 3e 70 57 68 65   pWhere==p->pWhe
378b0 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  re );.        as
378c0 73 65 72 74 28 20 70 48 61 76 69 6e 67 3d 3d 70  sert( pHaving==p
378d0 2d 3e 70 48 61 76 69 6e 67 20 29 3b 0a 20 20 20  ->pHaving );.   
378e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 47 72       assert( pGr
378f0 6f 75 70 42 79 3d 3d 70 2d 3e 70 47 72 6f 75 70  oupBy==p->pGroup
37900 42 79 20 29 3b 0a 20 20 20 20 20 20 20 20 68 61  By );.        ha
37910 76 69 6e 67 54 6f 57 68 65 72 65 28 70 50 61 72  vingToWhere(pPar
37920 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  se, p);.        
37930 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
37940 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  re;.      }.    
37950 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
37960 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26  lyzeAggregates(&
37970 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20  sNC, pHaving);. 
37980 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
37990 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d  o.nAccumulator =
379a0 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d   sAggInfo.nColum
379b0 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 47  n;.    if( p->pG
379c0 72 6f 75 70 42 79 3d 3d 30 20 26 26 20 70 2d 3e  roupBy==0 && p->
379d0 70 48 61 76 69 6e 67 3d 3d 30 20 26 26 20 73 41  pHaving==0 && sA
379e0 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3d 3d 31 20  ggInfo.nFunc==1 
379f0 29 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61 78 46  ){.      minMaxF
37a00 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72  lag = minMaxQuer
37a10 79 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  y(db, sAggInfo.a
37a20 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 2c 20 26  Func[0].pExpr, &
37a30 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 29 3b  pMinMaxOrderBy);
37a40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
37a50 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d 20 57    minMaxFlag = W
37a60 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
37a70 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  MAL;.    }.    f
37a80 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
37a90 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a  fo.nFunc; i++){.
37aa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
37ab0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 73  xprHasProperty(s
37ac0 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d  AggInfo.aFunc[i]
37ad0 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  .pExpr, EP_xIsSe
37ae0 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73  lect) );.      s
37af0 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43  NC.ncFlags |= NC
37b00 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20  _InAggFunc;.    
37b10 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
37b20 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
37b30 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
37b40 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  [i].pExpr->x.pLi
37b50 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e  st);.      sNC.n
37b60 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e  cFlags &= ~NC_In
37b70 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20  AggFunc;.    }. 
37b80 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52 65     sAggInfo.mxRe
37b90 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
37ba0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
37bb0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74  llocFailed ) got
37bc0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 23 69  o select_end;.#i
37bd0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
37be0 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73 71  ABLED.    if( sq
37bf0 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
37c00 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20 20   & 0x400 ){.    
37c10 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
37c20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34 30  SELECTTRACE(0x40
37c30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66 74  0,pParse,p,("Aft
37c40 65 72 20 61 67 67 72 65 67 61 74 65 20 61 6e 61  er aggregate ana
37c50 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20 20 20  lysis:\n"));.   
37c60 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
37c70 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
37c80 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  );.      for(ii=
37c90 30 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  0; ii<sAggInfo.n
37ca0 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b 0a 20  Column; ii++){. 
37cb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
37cc0 62 75 67 50 72 69 6e 74 66 28 22 61 67 67 2d 63  bugPrintf("agg-c
37cd0 6f 6c 75 6d 6e 5b 25 64 5d 20 69 4d 65 6d 3d 25  olumn[%d] iMem=%
37ce0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
37cf0 20 20 69 69 2c 20 73 41 67 67 49 6e 66 6f 2e 61    ii, sAggInfo.a
37d00 43 6f 6c 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20  Col[ii].iMem);. 
37d10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
37d20 65 65 56 69 65 77 45 78 70 72 28 30 2c 20 73 41  eeViewExpr(0, sA
37d30 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69 5d 2e  ggInfo.aCol[ii].
37d40 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20  pExpr, 0);.     
37d50 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d   }.      for(ii=
37d60 30 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  0; ii<sAggInfo.n
37d70 46 75 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Func; ii++){.   
37d80 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
37d90 67 50 72 69 6e 74 66 28 22 61 67 67 2d 66 75 6e  gPrintf("agg-fun
37da0 63 5b 25 64 5d 3a 20 69 4d 65 6d 3d 25 64 5c 6e  c[%d]: iMem=%d\n
37db0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ",.            i
37dc0 69 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  i, sAggInfo.aFun
37dd0 63 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20  c[ii].iMem);.   
37de0 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
37df0 56 69 65 77 45 78 70 72 28 30 2c 20 73 41 67 67  ViewExpr(0, sAgg
37e00 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d 2e 70  Info.aFunc[ii].p
37e10 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
37e20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
37e30 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69  .    /* Processi
37e40 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
37e50 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20  s with GROUP BY 
37e60 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e  is very differen
37e70 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63  t and.    ** muc
37e80 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74  h more complex t
37e90 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77  han aggregates w
37ea0 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42  ithout a GROUP B
37eb0 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  Y..    */.    if
37ec0 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
37ed0 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
37ee0 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e  yInfo;  /* Keyin
37ef0 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
37f00 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63  r the group by c
37f10 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
37f20 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20  nt addr1;       
37f30 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d     /* A-vs-B com
37f40 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f  parision jump */
37f50 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f  .      int addrO
37f60 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74  utputRow;  /* St
37f70 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e  art of subroutin
37f80 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
37f90 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20   result row */. 
37fa0 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70       int regOutp
37fb0 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75  utRow;   /* Retu
37fc0 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
37fd0 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73  ter for output s
37fe0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20  ubroutine */.   
37ff0 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62     int addrSetAb
38000 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68  ort;   /* Set th
38010 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64  e abort flag and
38020 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20   return */.     
38030 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f   int addrTopOfLo
38040 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74  op;  /* Top of t
38050 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f  he input loop */
38060 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
38070 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68  ortingIdx; /* Th
38080 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
38090 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69  al for the sorti
380a0 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ng index */.    
380b0 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b    int addrReset;
380c0 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74        /* Subrout
380d0 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e  ine for resettin
380e0 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
380f0 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  r */.      int r
38100 65 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f  egReset;       /
38110 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
38120 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65   register for re
38130 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  set subroutine *
38140 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  /..      /* If t
38150 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20  here is a GROUP 
38160 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67  BY clause we mig
38170 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e  ht need a sortin
38180 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20  g index to.     
38190 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74   ** implement it
381a0 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74  .  Allocate that
381b0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e   sorting index n
381c0 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73  ow.  If it turns
381d0 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   out.      ** th
381e0 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  at we do not nee
381f0 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20  d it after all, 
38200 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  the OP_SorterOpe
38210 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20  n instruction.  
38220 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63      ** will be c
38230 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
38240 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f  Noop.  .      */
38250 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  .      sAggInfo.
38260 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61  sortingIdx = pPa
38270 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
38280 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
38290 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
382a0 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
382b0 42 79 2c 20 30 2c 20 73 41 67 67 49 6e 66 6f 2e  By, 0, sAggInfo.
382c0 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
382d0 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d  addrSortingIdx =
382e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
382f0 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f  p4(v, OP_SorterO
38300 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  pen, .          
38310 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
38320 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53  Idx, sAggInfo.nS
38330 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20  ortingColumn, . 
38340 20 20 20 20 20 20 20 20 20 30 2c 20 28 63 68 61           0, (cha
38350 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
38360 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20  KEYINFO);..     
38370 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d   /* Initialize m
38380 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20