/ Hex Artifact Content
Login

Artifact c937eb1fc32417fb0be022ab8372dd27ff8138242a8d377724996d817258bd8a:


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 7d 3b 0a 23 64 65 66 69 6e 65 20  ndif.};.#define 
0c20: 53 4f 52 54 46 4c 41 47 5f 55 73 65 53 6f 72 74  SORTFLAG_UseSort
0c30: 65 72 20 20 30 78 30 31 20 20 20 2f 2a 20 55 73  er  0x01   /* Us
0c40: 65 20 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73  e SorterOpen ins
0c50: 74 65 61 64 20 6f 66 20 4f 70 65 6e 45 70 68 65  tead of OpenEphe
0c60: 6d 65 72 61 6c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  meral */../*.** 
0c70: 44 65 6c 65 74 65 20 61 6c 6c 20 74 68 65 20 63  Delete all the c
0c80: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 53 65 6c 65  ontent of a Sele
0c90: 63 74 20 73 74 72 75 63 74 75 72 65 2e 20 20 44  ct structure.  D
0ca0: 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 74  eallocate the st
0cb0: 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c  ructure.** itsel
0cc0: 66 20 6f 6e 6c 79 20 69 66 20 62 46 72 65 65 20  f only if bFree 
0cd0: 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
0ce0: 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65 6c  ic void clearSel
0cf0: 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ect(sqlite3 *db,
0d00: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
0d10: 62 46 72 65 65 29 7b 0a 20 20 77 68 69 6c 65 28  bFree){.  while(
0d20: 20 70 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74   p ){.    Select
0d30: 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50   *pPrior = p->pP
0d40: 72 69 6f 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  rior;.    sqlite
0d50: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
0d60: 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  db, p->pEList);.
0d70: 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
0d80: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
0d90: 70 53 72 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  pSrc);.    sqlit
0da0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0db0: 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20   p->pWhere);.   
0dc0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0dd0: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0de0: 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71 6c  roupBy);.    sql
0df0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0e00: 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  b, p->pHaving);.
0e10: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
0e20: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
0e30: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
0e40: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
0e50: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
0e60: 3b 0a 20 20 20 20 69 66 28 20 4f 4b 5f 49 46 5f  ;.    if( OK_IF_
0e70: 41 4c 57 41 59 53 5f 54 52 55 45 28 70 2d 3e 70  ALWAYS_TRUE(p->p
0e80: 57 69 74 68 29 20 29 20 73 71 6c 69 74 65 33 57  With) ) sqlite3W
0e90: 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ithDelete(db, p-
0ea0: 3e 70 57 69 74 68 29 3b 0a 20 20 20 20 69 66 28  >pWith);.    if(
0eb0: 20 62 46 72 65 65 20 29 20 73 71 6c 69 74 65 33   bFree ) sqlite3
0ec0: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b  DbFreeNN(db, p);
0ed0: 0a 20 20 20 20 70 20 3d 20 70 50 72 69 6f 72 3b  .    p = pPrior;
0ee0: 0a 20 20 20 20 62 46 72 65 65 20 3d 20 31 3b 0a  .    bFree = 1;.
0ef0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
0f00: 74 69 61 6c 69 7a 65 20 61 20 53 65 6c 65 63 74  tialize a Select
0f10: 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a  Dest structure..
0f20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
0f30: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 53 65  electDestInit(Se
0f40: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c  lectDest *pDest,
0f50: 20 69 6e 74 20 65 44 65 73 74 2c 20 69 6e 74 20   int eDest, int 
0f60: 69 50 61 72 6d 29 7b 0a 20 20 70 44 65 73 74 2d  iParm){.  pDest-
0f70: 3e 65 44 65 73 74 20 3d 20 28 75 38 29 65 44 65  >eDest = (u8)eDe
0f80: 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53 44  st;.  pDest->iSD
0f90: 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b 0a 20 20  Parm = iParm;.  
0fa0: 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73 74 20  pDest->zAffSdst 
0fb0: 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e 69 53  = 0;.  pDest->iS
0fc0: 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74  dst = 0;.  pDest
0fd0: 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d 0a 0a  ->nSdst = 0;.}..
0fe0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
0ff0: 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73 74 72  a new Select str
1000: 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72  ucture and retur
1010: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1020: 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  hat.** structure
1030: 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73 71 6c  ..*/.Select *sql
1040: 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 0a 20  ite3SelectNew(. 
1050: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1060: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1070: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
1080: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
1090: 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20 63 6f       /* which co
10a0: 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75 64 65  lumns to include
10b0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a   in the result *
10c0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
10d0: 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  c,        /* the
10e0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d 2d 20   FROM clause -- 
10f0: 77 68 69 63 68 20 74 61 62 6c 65 73 20 74 6f 20  which tables to 
1100: 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  scan */.  Expr *
1110: 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20  pWhere,         
1120: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
1130: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
1140: 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20 20 2f  t *pGroupBy,   /
1150: 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  * the GROUP BY c
1160: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20  lause */.  Expr 
1170: 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20 20 20  *pHaving,       
1180: 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47 20 63   /* the HAVING c
1190: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
11a0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
11b0: 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59   /* the ORDER BY
11c0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 75 33 32   clause */.  u32
11d0: 20 73 65 6c 46 6c 61 67 73 2c 20 20 20 20 20 20   selFlags,      
11e0: 20 20 20 2f 2a 20 46 6c 61 67 20 70 61 72 61 6d     /* Flag param
11f0: 65 74 65 72 73 2c 20 73 75 63 68 20 61 73 20 53  eters, such as S
1200: 46 5f 44 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20  F_Distinct */.  
1210: 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 20 20 20  Expr *pLimit    
1220: 20 20 20 20 20 20 2f 2a 20 4c 49 4d 49 54 20 76        /* LIMIT v
1230: 61 6c 75 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e  alue.  NULL mean
1240: 73 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 29 7b  s not used */.){
1250: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b  .  Select *pNew;
1260: 0a 20 20 53 65 6c 65 63 74 20 73 74 61 6e 64 69  .  Select standi
1270: 6e 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  n;.  pNew = sqli
1280: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
1290: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
12a0: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
12b0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
12c0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
12d0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
12e0: 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77 20  led );.    pNew 
12f0: 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 7d 0a  = &standin;.  }.
1300: 20 20 69 66 28 20 70 45 4c 69 73 74 3d 3d 30 20    if( pEList==0 
1310: 29 7b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  ){.    pEList = 
1320: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
1330: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
1340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 28      sqlite3Expr(
1370: 70 50 61 72 73 65 2d 3e 64 62 2c 54 4b 5f 41 53  pParse->db,TK_AS
1380: 54 45 52 49 53 4b 2c 30 29 29 3b 0a 20 20 7d 0a  TERISK,0));.  }.
1390: 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d    pNew->pEList =
13a0: 20 70 45 4c 69 73 74 3b 0a 20 20 70 4e 65 77 2d   pEList;.  pNew-
13b0: 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b  >op = TK_SELECT;
13c0: 0a 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67  .  pNew->selFlag
13d0: 73 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20  s = selFlags;.  
13e0: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 30  pNew->iLimit = 0
13f0: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65  ;.  pNew->iOffse
1400: 74 20 3d 20 30 3b 0a 23 69 66 20 53 45 4c 45 43  t = 0;.#if SELEC
1410: 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20  TTRACE_ENABLED. 
1420: 20 70 4e 65 77 2d 3e 7a 53 65 6c 4e 61 6d 65 5b   pNew->zSelName[
1430: 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  0] = 0;.#endif. 
1440: 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45   pNew->addrOpenE
1450: 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70  phm[0] = -1;.  p
1460: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
1470: 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[1] = -1;.  pNe
1480: 77 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  w->nSelectRow = 
1490: 30 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30  0;.  if( pSrc==0
14a0: 20 29 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65   ) pSrc = sqlite
14b0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
14c0: 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
14d0: 28 2a 70 53 72 63 29 29 3b 0a 20 20 70 4e 65 77  (*pSrc));.  pNew
14e0: 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
14f0: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
1500: 70 57 68 65 72 65 3b 0a 20 20 70 4e 65 77 2d 3e  pWhere;.  pNew->
1510: 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75  pGroupBy = pGrou
1520: 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  pBy;.  pNew->pHa
1530: 76 69 6e 67 20 3d 20 70 48 61 76 69 6e 67 3b 0a  ving = pHaving;.
1540: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
1550: 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70   = pOrderBy;.  p
1560: 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b  New->pPrior = 0;
1570: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
1580: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d   0;.  pNew->pLim
1590: 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70  it = pLimit;.  p
15a0: 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a  New->pWith = 0;.
15b0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
15c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
15d0: 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65   {.    clearSele
15e0: 63 74 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ct(pParse->db, p
15f0: 4e 65 77 2c 20 70 4e 65 77 21 3d 26 73 74 61 6e  New, pNew!=&stan
1600: 64 69 6e 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d  din);.    pNew =
1610: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1620: 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
1630: 53 72 63 21 3d 30 20 7c 7c 20 70 50 61 72 73 65  Src!=0 || pParse
1640: 2d 3e 6e 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a  ->nErr>0 );.  }.
1650: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d    assert( pNew!=
1660: 26 73 74 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65  &standin );.  re
1670: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 23 69  turn pNew;.}..#i
1680: 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
1690: 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ABLED./*.** Set 
16a0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 53 65  the name of a Se
16b0: 6c 65 63 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76  lect object.*/.v
16c0: 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
16d0: 74 53 65 74 4e 61 6d 65 28 53 65 6c 65 63 74 20  tSetName(Select 
16e0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
16f0: 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 20  zName){.  if( p 
1700: 26 26 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  && zName ){.    
1710: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1720: 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 53 65 6c 4e  (sizeof(p->zSelN
1730: 61 6d 65 29 2c 20 70 2d 3e 7a 53 65 6c 4e 61 6d  ame), p->zSelNam
1740: 65 2c 20 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  e, "%s", zName);
1750: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
1760: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
1770: 20 67 69 76 65 6e 20 53 65 6c 65 63 74 20 73 74   given Select st
1780: 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 20  ructure and all 
1790: 6f 66 20 69 74 73 20 73 75 62 73 74 72 75 63 74  of its substruct
17a0: 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ures..*/.void sq
17b0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
17c0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  e(sqlite3 *db, S
17d0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28  elect *p){.  if(
17e0: 20 4f 4b 5f 49 46 5f 41 4c 57 41 59 53 5f 54 52   OK_IF_ALWAYS_TR
17f0: 55 45 28 70 29 20 29 20 63 6c 65 61 72 53 65 6c  UE(p) ) clearSel
1800: 65 63 74 28 64 62 2c 20 70 2c 20 31 29 3b 0a 7d  ect(db, p, 1);.}
1810: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1820: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1830: 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43  right-most SELEC
1840: 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 61  T statement in a
1850: 20 63 6f 6d 70 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   compound..*/.st
1860: 61 74 69 63 20 53 65 6c 65 63 74 20 2a 66 69 6e  atic Select *fin
1870: 64 52 69 67 68 74 6d 6f 73 74 28 53 65 6c 65 63  dRightmost(Selec
1880: 74 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20  t *p){.  while( 
1890: 70 2d 3e 70 4e 65 78 74 20 29 20 70 20 3d 20 70  p->pNext ) p = p
18a0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 72 65 74 75 72  ->pNext;.  retur
18b0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n p;.}../*.** Gi
18c0: 76 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74  ven 1 to 3 ident
18d0: 69 66 69 65 72 73 20 70 72 65 63 65 64 69 6e 67  ifiers preceding
18e0: 20 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72   the JOIN keywor
18f0: 64 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  d, determine the
1900: 0a 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e  .** type of join
1910: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
1920: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  eger constant th
1930: 61 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61  at expresses tha
1940: 74 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72  t type.** in ter
1950: 6d 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ms of the follow
1960: 69 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a  ing bit values:.
1970: 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e  **.**     JT_INN
1980: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f  ER.**     JT_CRO
1990: 53 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54  SS.**     JT_OUT
19a0: 45 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54  ER.**     JT_NAT
19b0: 55 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c  URAL.**     JT_L
19c0: 45 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49  EFT.**     JT_RI
19d0: 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c  GHT.**.** A full
19e0: 20 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74   outer join is t
19f0: 68 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  he combination o
1a00: 66 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54  f JT_LEFT and JT
1a10: 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66  _RIGHT..**.** If
1a20: 20 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75   an illegal or u
1a30: 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20  nsupported join 
1a40: 74 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68  type is seen, th
1a50: 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a  en still return.
1a60: 2a 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20  ** a join type, 
1a70: 62 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72  but put an error
1a80: 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
1a90: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
1aa0: 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65   sqlite3JoinType
1ab0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1ac0: 54 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e  Token *pA, Token
1ad0: 20 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29   *pB, Token *pC)
1ae0: 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65  {.  int jointype
1af0: 20 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61   = 0;.  Token *a
1b00: 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e  pAll[3];.  Token
1b10: 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20   *p;.           
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b30: 20 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38    /*   012345678
1b40: 39 20 31 32 33 34 35 36 37 38 39 20 31 32 33 34  9 123456789 1234
1b50: 35 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73  56789 123 */.  s
1b60: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1b70: 20 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e   zKeyText[] = "n
1b80: 61 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67  aturaleftouterig
1b90: 68 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73  htfullinnercross
1ba0: 22 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ";.  static cons
1bb0: 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75  t struct {.    u
1bc0: 38 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  8 i;        /* B
1bd0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77  eginning of keyw
1be0: 6f 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79  ord text in zKey
1bf0: 54 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38  Text[] */.    u8
1c00: 20 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65   nChar;    /* Le
1c10: 6e 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77  ngth of the keyw
1c20: 6f 72 64 20 69 6e 20 63 68 61 72 61 63 74 65 72  ord in character
1c30: 73 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65  s */.    u8 code
1c40: 3b 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79  ;     /* Join ty
1c50: 70 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61  pe mask */.  } a
1c60: 4b 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20  Keyword[] = {.  
1c70: 20 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20    /* natural */ 
1c80: 7b 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55  { 0,  7, JT_NATU
1c90: 52 41 4c 20 20 20 20 20 20 20 20 20 20 20 20 20  RAL             
1ca0: 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66     },.    /* lef
1cb0: 74 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c  t    */ { 6,  4,
1cc0: 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45   JT_LEFT|JT_OUTE
1cd0: 52 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  R          },.  
1ce0: 20 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20    /* outer   */ 
1cf0: 7b 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45  { 10, 5, JT_OUTE
1d00: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1d10: 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67     },.    /* rig
1d20: 68 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c  ht   */ { 14, 5,
1d30: 20 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54   JT_RIGHT|JT_OUT
1d40: 45 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  ER         },.  
1d50: 20 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20    /* full    */ 
1d60: 7b 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54  { 19, 4, JT_LEFT
1d70: 7c 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54  |JT_RIGHT|JT_OUT
1d80: 45 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e  ER },.    /* inn
1d90: 65 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c  er   */ { 23, 5,
1da0: 20 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20   JT_INNER       
1db0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
1dc0: 20 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20    /* cross   */ 
1dd0: 7b 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45  { 28, 5, JT_INNE
1de0: 52 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20  R|JT_CROSS      
1df0: 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74     },.  };.  int
1e00: 20 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30   i, j;.  apAll[0
1e10: 5d 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b  ] = pA;.  apAll[
1e20: 31 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c  1] = pB;.  apAll
1e30: 5b 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28  [2] = pC;.  for(
1e40: 69 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c  i=0; i<3 && apAl
1e50: 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l[i]; i++){.    
1e60: 70 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20  p = apAll[i];.  
1e70: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72    for(j=0; j<Arr
1e80: 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29  aySize(aKeyword)
1e90: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
1ea0: 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64  ( p->n==aKeyword
1eb0: 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20  [j].nChar .     
1ec0: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53       && sqlite3S
1ed0: 74 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70  trNICmp((char*)p
1ee0: 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61  ->z, &zKeyText[a
1ef0: 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70  Keyword[j].i], p
1f00: 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->n)==0 ){.     
1f10: 20 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61     jointype |= a
1f20: 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b  Keyword[j].code;
1f30: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1f40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f50: 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30    testcase( j==0
1f60: 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32   || j==1 || j==2
1f70: 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34   || j==3 || j==4
1f80: 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36   || j==5 || j==6
1f90: 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41   );.    if( j>=A
1fa0: 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72  rraySize(aKeywor
1fb0: 64 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e  d) ){.      join
1fc0: 74 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52  type |= JT_ERROR
1fd0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1fe0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20     }.  }.  if(. 
1ff0: 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20      (jointype & 
2000: 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54  (JT_INNER|JT_OUT
2010: 45 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c  ER))==(JT_INNER|
2020: 4a 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20  JT_OUTER) ||.   
2030: 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54    (jointype & JT
2040: 5f 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a  _ERROR)!=0.  ){.
2050: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2060: 7a 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61  zSp = " ";.    a
2070: 73 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a  ssert( pB!=0 );.
2080: 20 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b      if( pC==0 ){
2090: 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71   zSp++; }.    sq
20a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
20b0: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f  arse, "unknown o
20c0: 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f  r unsupported jo
20d0: 69 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20  in type: ".     
20e0: 20 20 22 25 54 20 25 54 25 73 25 54 22 2c 20 70    "%T %T%s%T", p
20f0: 41 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b  A, pB, zSp, pC);
2100: 0a 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20  .    jointype = 
2110: 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73  JT_INNER;.  }els
2120: 65 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20  e if( (jointype 
2130: 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a  & JT_OUTER)!=0 .
2140: 20 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69           && (joi
2150: 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54  ntype & (JT_LEFT
2160: 7c 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f  |JT_RIGHT))!=JT_
2170: 4c 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69  LEFT ){.    sqli
2180: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2190: 73 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48  se, .      "RIGH
21a0: 54 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52  T and FULL OUTER
21b0: 20 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63   JOINs are not c
21c0: 75 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74  urrently support
21d0: 65 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79  ed");.    jointy
21e0: 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20  pe = JT_INNER;. 
21f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e   }.  return join
2200: 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  type;.}../*.** R
2210: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
2220: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61  of a column in a
2230: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
2240: 2d 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e  -1 if the column
2250: 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  .** is not conta
2260: 69 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c  ined in the tabl
2270: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2280: 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62   columnIndex(Tab
2290: 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20  le *pTab, const 
22a0: 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69  char *zCol){.  i
22b0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
22c0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
22d0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
22e0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62  ite3StrICmp(pTab
22f0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c  ->aCol[i].zName,
2300: 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75   zCol)==0 ) retu
2310: 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn i;.  }.  retu
2320: 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn -1;.}../*.** 
2330: 53 65 61 72 63 68 20 74 68 65 20 66 69 72 73 74  Search the first
2340: 20 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72   N tables in pSr
2350: 63 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  c, from left to 
2360: 72 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66  right, looking f
2370: 6f 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68  or a.** table th
2380: 61 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20  at has a column 
2390: 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a  named zCol.  .**
23a0: 0a 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20  .** When found, 
23b0: 73 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20 2a  set *piTab and *
23c0: 70 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61 62  piCol to the tab
23d0: 6c 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c  le index and col
23e0: 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20  umn index.** of 
23f0: 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c  the matching col
2400: 75 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 54  umn and return T
2410: 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  RUE..**.** If no
2420: 74 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  t found, return 
2430: 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  FALSE..*/.static
2440: 20 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c   int tableAndCol
2450: 75 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63 4c  umnIndex(.  SrcL
2460: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
2470: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61 62   /* Array of tab
2480: 6c 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  les to search */
2490: 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
24a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
24b0: 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 70  r of tables in p
24c0: 53 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72  Src->a[] to sear
24d0: 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ch */.  const ch
24e0: 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20  ar *zCol,    /* 
24f0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
2500: 6d 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  mn we are lookin
2510: 67 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  g for */.  int *
2520: 70 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  piTab,          
2530: 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f  /* Write index o
2540: 66 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65  f pSrc->a[] here
2550: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c   */.  int *piCol
2560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
2570: 69 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72  ite index of pSr
2580: 63 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61  c->a[*piTab].pTa
2590: 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a  b->aCol[] here *
25a0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
25c0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
25d0: 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20 2a  tables in pSrc *
25e0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  /.  int iCol;   
25f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2600: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63  x of column matc
2610: 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20  hing zCol */..  
2620: 61 73 73 65 72 74 28 20 28 70 69 54 61 62 3d 3d  assert( (piTab==
2630: 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29  0)==(piCol==0) )
2640: 3b 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65  ;  /* Both or ne
2650: 69 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a  ither are NULL *
2660: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e  /.  for(i=0; i<N
2670: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c  ; i++){.    iCol
2680: 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70   = columnIndex(p
2690: 53 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20  Src->a[i].pTab, 
26a0: 7a 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 69  zCol);.    if( i
26b0: 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col>=0 ){.      
26c0: 69 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20 20  if( piTab ){.   
26d0: 20 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69 3b       *piTab = i;
26e0: 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20  .        *piCol 
26f0: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a  = iCol;.      }.
2700: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2710: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2720: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
2730: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2740: 75 73 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d  used to add term
2750: 73 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49  s implied by JOI
2760: 4e 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a  N syntax to the.
2770: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
2780: 65 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20  expression of a 
2790: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
27a0: 2e 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20  . The new term, 
27b0: 77 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65  which.** is ANDe
27c0: 64 20 77 69 74 68 20 74 68 65 20 65 78 69 73 74  d with the exist
27d0: 69 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73 65  ing WHERE clause
27e0: 2c 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  , is of the form
27f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31  :.**.**    (tab1
2800: 2e 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c  .col1 = tab2.col
2810: 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74  2).**.** where t
2820: 61 62 31 20 69 73 20 74 68 65 20 69 53 72 63 27  ab1 is the iSrc'
2830: 74 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c  th table in SrcL
2840: 69 73 74 20 70 53 72 63 20 61 6e 64 20 74 61 62  ist pSrc and tab
2850: 32 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53  2 is the .** (iS
2860: 72 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e  rc+1)'th. Column
2870: 20 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20   col1 is column 
2880: 69 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31  iColLeft of tab1
2890: 2c 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a  , and col2 is.**
28a0: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68   column iColRigh
28b0: 74 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74  t of tab2..*/.st
28c0: 61 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65  atic void addWhe
28d0: 72 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20  reTerm(.  Parse 
28e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
28f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
2900: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
2910: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
2940: 6c 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75  les in FROM clau
2950: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66  se */.  int iLef
2960: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2970: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2980: 20 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65 20   of first table 
2990: 74 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20  to join in pSrc 
29a0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66  */.  int iColLef
29b0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
29c0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
29d0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74   column in first
29e0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
29f0: 69 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  iRight,         
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2a10: 6e 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20 74  ndex of second t
2a20: 61 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a  able in pSrc */.
2a30: 20 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c    int iColRight,
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a50: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
2a60: 6c 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74  lumn in second t
2a70: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  able */.  int is
2a80: 4f 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20  OuterJoin,      
2a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2aa0: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
2ab0: 4f 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20  OUTER join */.  
2ac0: 45 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20 20  Expr **ppWhere  
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57  /* IN/OUT: The W
2af0: 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61  HERE clause to a
2b00: 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71  dd to */.){.  sq
2b10: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2b20: 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a  se->db;.  Expr *
2b30: 70 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45 32  pE1;.  Expr *pE2
2b40: 3b 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a  ;.  Expr *pEq;..
2b50: 20 20 61 73 73 65 72 74 28 20 69 4c 65 66 74 3c    assert( iLeft<
2b60: 69 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65  iRight );.  asse
2b70: 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69  rt( pSrc->nSrc>i
2b80: 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72  Right );.  asser
2b90: 74 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74  t( pSrc->a[iLeft
2ba0: 5d 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65  ].pTab );.  asse
2bb0: 72 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69 67  rt( pSrc->a[iRig
2bc0: 68 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70  ht].pTab );..  p
2bd0: 45 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  E1 = sqlite3Crea
2be0: 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c  teColumnExpr(db,
2bf0: 20 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 43   pSrc, iLeft, iC
2c00: 6f 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d  olLeft);.  pE2 =
2c10: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f   sqlite3CreateCo
2c20: 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72  lumnExpr(db, pSr
2c30: 63 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c 52  c, iRight, iColR
2c40: 69 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20  ight);..  pEq = 
2c50: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
2c60: 72 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c  rse, TK_EQ, pE1,
2c70: 20 70 45 32 29 3b 0a 20 20 69 66 28 20 70 45 71   pE2);.  if( pEq
2c80: 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69 6e 20   && isOuterJoin 
2c90: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
2ca0: 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 46  operty(pEq, EP_F
2cb0: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73  romJoin);.    as
2cc0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
2cd0: 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 54  operty(pEq, EP_T
2ce0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
2cf0: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
2d00: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
2d10: 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  Eq, EP_NoReduce)
2d20: 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69 67 68  ;.    pEq->iRigh
2d30: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28 69 31  tJoinTable = (i1
2d40: 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20  6)pE2->iTable;. 
2d50: 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20 3d 20   }.  *ppWhere = 
2d60: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
2d70: 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70 45 71  b, *ppWhere, pEq
2d80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
2d90: 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  the EP_FromJoin 
2da0: 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20  property on all 
2db0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67 69 76  terms of the giv
2dc0: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  en expression..*
2dd0: 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20 45 78  * And set the Ex
2de0: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
2df0: 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66 6f 72  le to iTable for
2e00: 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
2e10: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
2e20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46  ..**.** The EP_F
2e30: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
2e40: 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65 72 6d   is used on term
2e50: 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  s of an expressi
2e60: 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68  on to tell.** th
2e70: 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  e LEFT OUTER JOI
2e80: 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  N processing log
2e90: 69 63 20 74 68 61 74 20 74 68 69 73 20 74 65 72  ic that this ter
2ea0: 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  m is part of the
2eb0: 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72 69 63  .** join restric
2ec0: 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 20 69  tion specified i
2ed0: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
2ee0: 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74  G clause and not
2ef0: 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68   a part.** of th
2f00: 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c 20 57  e more general W
2f10: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 54 68  HERE clause.  Th
2f20: 65 73 65 20 74 65 72 6d 73 20 61 72 65 20 6d 6f  ese terms are mo
2f30: 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a  ved over to the.
2f40: 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ** WHERE clause 
2f50: 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63  during join proc
2f60: 65 73 73 69 6e 67 20 62 75 74 20 77 65 20 6e 65  essing but we ne
2f70: 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
2f80: 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67  hat they.** orig
2f90: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
2fa0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2fb0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72  ..**.** The Expr
2fc0: 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  .iRightJoinTable
2fd0: 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45 52 45   tells the WHERE
2fe0: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
2ff0: 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 65  ng that the.** e
3000: 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65 6e 64  xpression depend
3010: 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69 67 68  s on table iRigh
3020: 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65 6e 20  tJoinTable even 
3030: 69 66 20 74 68 61 74 20 74 61 62 6c 65 20 69 73  if that table is
3040: 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74   not.** explicit
3050: 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20  ly mentioned in 
3060: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  the expression. 
3070: 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f   That informatio
3080: 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66  n is needed.** f
3090: 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68  or cases like th
30a0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c  is:.**.**    SEL
30b0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
30c0: 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
30d0: 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31 2e 78  .a=t2.b AND t1.x
30e0: 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65  =5.**.** The whe
30f0: 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64 73 20  re clause needs 
3100: 74 6f 20 64 65 66 65 72 20 74 68 65 20 68 61 6e  to defer the han
3110: 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74 31 2e  dling of the t1.
3120: 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69  x=5.** term unti
3130: 6c 20 61 66 74 65 72 20 74 68 65 20 74 32 20 6c  l after the t2 l
3140: 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  oop of the join.
3150: 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20 61    In that way, a
3160: 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20  .** NULL t2 row 
3170: 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
3180: 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78 21 3d   whenever t1.x!=
3190: 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  5.  If we do not
31a0: 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20 68 61  .** defer the ha
31b0: 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35  ndling of t1.x=5
31c0: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70 72 6f  , it will be pro
31d0: 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61 74 65  cessed immediate
31e0: 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68 65 20  ly.** after the 
31f0: 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73  t1 loop and rows
3200: 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20 77 69   with t1.x!=5 wi
3210: 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61 72 20  ll never appear 
3220: 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70 75 74  in.** the output
3230: 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63 6f 72  , which is incor
3240: 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rect..*/.static 
3250: 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78 70 72  void setJoinExpr
3260: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 54  (Expr *p, int iT
3270: 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65 28 20  able){.  while( 
3280: 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  p ){.    ExprSet
3290: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 46  Property(p, EP_F
32a0: 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73  romJoin);.    as
32b0: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
32c0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
32d0: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
32e0: 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65  d) );.    ExprSe
32f0: 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 2c 20  tVVAProperty(p, 
3300: 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 20 20  EP_NoReduce);.  
3310: 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54    p->iRightJoinT
3320: 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54 61 62  able = (i16)iTab
3330: 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f  le;.    if( p->o
3340: 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26  p==TK_FUNCTION &
3350: 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20 29 7b 0a  & p->x.pList ){.
3360: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
3370: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
3380: 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  >x.pList->nExpr;
3390: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
33a0: 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 78 2e  etJoinExpr(p->x.
33b0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
33c0: 72 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  r, iTable);.    
33d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65    }.    }.    se
33e0: 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65  tJoinExpr(p->pLe
33f0: 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20  ft, iTable);.   
3400: 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a   p = p->pRight;.
3410: 20 20 7d 20 0a 7d 0a 0a 2f 2a 20 55 6e 64 6f 20    } .}../* Undo 
3420: 74 68 65 20 77 6f 72 6b 20 6f 66 20 73 65 74 4a  the work of setJ
3430: 6f 69 6e 45 78 70 72 28 29 2e 20 20 49 6e 20 74  oinExpr().  In t
3440: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  he expression tr
3450: 65 65 20 70 2c 20 63 6f 6e 76 65 72 74 20 65 76  ee p, convert ev
3460: 65 72 79 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74  ery.** term that
3470: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
3480: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 61 6e 64 20  EP_FromJoin and 
3490: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d  iRightJoinTable=
34a0: 3d 69 54 61 62 6c 65 20 69 6e 74 6f 0a 2a 2a 20  =iTable into.** 
34b0: 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 65 72 6d  an ordinary term
34c0: 20 74 68 61 74 20 6f 6d 69 74 73 20 74 68 65 20   that omits the 
34d0: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 6d 61 72 6b  EP_FromJoin mark
34e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 68 61 70  ..**.** This hap
34f0: 70 65 6e 73 20 77 68 65 6e 20 61 20 4c 45 46 54  pens when a LEFT
3500: 20 4a 4f 49 4e 20 69 73 20 73 69 6d 70 6c 69 66   JOIN is simplif
3510: 69 65 64 20 69 6e 74 6f 20 61 6e 20 6f 72 64 69  ied into an ordi
3520: 6e 61 72 79 20 4a 4f 49 4e 2e 0a 2a 2f 0a 73 74  nary JOIN..*/.st
3530: 61 74 69 63 20 76 6f 69 64 20 75 6e 73 65 74 4a  atic void unsetJ
3540: 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70 2c  oinExpr(Expr *p,
3550: 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20   int iTable){.  
3560: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
3570: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
3580: 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f  rty(p, EP_FromJo
3590: 69 6e 29 0a 20 20 20 20 20 26 26 20 28 69 54 61  in).     && (iTa
35a0: 62 6c 65 3c 30 20 7c 7c 20 70 2d 3e 69 52 69 67  ble<0 || p->iRig
35b0: 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61  htJoinTable==iTa
35c0: 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 45 78  ble) ){.      Ex
35d0: 70 72 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  prClearProperty(
35e0: 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  p, EP_FromJoin);
35f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
3600: 2d 3e 6f 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op==TK_FUNCTIO
3610: 4e 20 26 26 20 70 2d 3e 78 2e 70 4c 69 73 74 20  N && p->x.pList 
3620: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
3630: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
3640: 3c 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  <p->x.pList->nEx
3650: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
3660: 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72 28    unsetJoinExpr(
3670: 70 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  p->x.pList->a[i]
3680: 2e 70 45 78 70 72 2c 20 69 54 61 62 6c 65 29 3b  .pExpr, iTable);
3690: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
36a0: 20 20 20 75 6e 73 65 74 4a 6f 69 6e 45 78 70 72     unsetJoinExpr
36b0: 28 70 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c  (p->pLeft, iTabl
36c0: 65 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  e);.    p = p->p
36d0: 52 69 67 68 74 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f  Right;.  } .}../
36e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
36f0: 65 20 70 72 6f 63 65 73 73 65 73 20 74 68 65 20  e processes the 
3700: 6a 6f 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  join information
3710: 20 66 6f 72 20 61 20 53 45 4c 45 43 54 20 73 74   for a SELECT st
3720: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4f 4e 20 61  atement..** ON a
3730: 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
3740: 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20 69   are converted i
3750: 6e 74 6f 20 65 78 74 72 61 20 74 65 72 6d 73 20  nto extra terms 
3760: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
3770: 75 73 65 2e 0a 2a 2a 20 4e 41 54 55 52 41 4c 20  use..** NATURAL 
3780: 6a 6f 69 6e 73 20 61 6c 73 6f 20 63 72 65 61 74  joins also creat
3790: 65 20 65 78 74 72 61 20 57 48 45 52 45 20 63 6c  e extra WHERE cl
37a0: 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a  ause terms..**.*
37b0: 2a 20 54 68 65 20 74 65 72 6d 73 20 6f 66 20 61  * The terms of a
37c0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 72 65   FROM clause are
37d0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
37e0: 65 20 53 65 6c 65 63 74 2e 70 53 72 63 20 73 74  e Select.pSrc st
37f0: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 54 68 65 20  ructure..** The 
3800: 6c 65 66 74 20 6d 6f 73 74 20 74 61 62 6c 65 20  left most table 
3810: 69 73 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  is the first ent
3820: 72 79 20 69 6e 20 53 65 6c 65 63 74 2e 70 53 72  ry in Select.pSr
3830: 63 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  c.  The right-mo
3840: 73 74 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 74  st.** table is t
3850: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2e 20 20  he last entry.  
3860: 54 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  The join operato
3870: 72 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68 65  r is held in the
3880: 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 65   entry to.** the
3890: 20 6c 65 66 74 2e 20 20 54 68 75 73 20 65 6e 74   left.  Thus ent
38a0: 72 79 20 30 20 63 6f 6e 74 61 69 6e 73 20 74 68  ry 0 contains th
38b0: 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
38c0: 66 6f 72 20 74 68 65 20 6a 6f 69 6e 20 62 65 74  for the join bet
38d0: 77 65 65 6e 0a 2a 2a 20 65 6e 74 72 69 65 73 20  ween.** entries 
38e0: 30 20 61 6e 64 20 31 2e 20 20 41 6e 79 20 4f 4e  0 and 1.  Any ON
38f0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
3900: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
3910: 68 20 74 68 65 20 6a 6f 69 6e 20 61 72 65 0a 2a  h the join are.*
3920: 2a 20 61 6c 73 6f 20 61 74 74 61 63 68 65 64 20  * also attached 
3930: 74 6f 20 74 68 65 20 6c 65 66 74 20 65 6e 74 72  to the left entr
3940: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
3950: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
3960: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
3970: 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  rs encountered..
3980: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
3990: 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
39a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
39b0: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 72 63  elect *p){.  Src
39c0: 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20  List *pSrc;     
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
39e0: 41 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  All tables in th
39f0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
3a00: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a20: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
3a30: 65 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ers */.  struct 
3a40: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  SrcList_item *pL
3a50: 65 66 74 3b 20 20 20 20 20 2f 2a 20 4c 65 66 74  eft;     /* Left
3a60: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f 69   table being joi
3a70: 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
3a80: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 52  SrcList_item *pR
3a90: 69 67 68 74 3b 20 20 20 20 2f 2a 20 52 69 67 68  ight;    /* Righ
3aa0: 74 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6a 6f  t table being jo
3ab0: 69 6e 65 64 20 2a 2f 0a 0a 20 20 70 53 72 63 20  ined */..  pSrc 
3ac0: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 4c 65  = p->pSrc;.  pLe
3ad0: 66 74 20 3d 20 26 70 53 72 63 2d 3e 61 5b 30 5d  ft = &pSrc->a[0]
3ae0: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 26 70 4c  ;.  pRight = &pL
3af0: 65 66 74 5b 31 5d 3b 0a 20 20 66 6f 72 28 69 3d  eft[1];.  for(i=
3b00: 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 2d  0; i<pSrc->nSrc-
3b10: 31 3b 20 69 2b 2b 2c 20 70 52 69 67 68 74 2b 2b  1; i++, pRight++
3b20: 2c 20 70 4c 65 66 74 2b 2b 29 7b 0a 20 20 20 20  , pLeft++){.    
3b30: 54 61 62 6c 65 20 2a 70 52 69 67 68 74 54 61 62  Table *pRightTab
3b40: 20 3d 20 70 52 69 67 68 74 2d 3e 70 54 61 62 3b   = pRight->pTab;
3b50: 0a 20 20 20 20 69 6e 74 20 69 73 4f 75 74 65 72  .    int isOuter
3b60: 3b 0a 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  ;..    if( NEVER
3b70: 28 70 4c 65 66 74 2d 3e 70 54 61 62 3d 3d 30 20  (pLeft->pTab==0 
3b80: 7c 7c 20 70 52 69 67 68 74 54 61 62 3d 3d 30 29  || pRightTab==0)
3b90: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
3ba0: 20 69 73 4f 75 74 65 72 20 3d 20 28 70 52 69 67   isOuter = (pRig
3bb0: 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  ht->fg.jointype 
3bc0: 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 3b 0a  & JT_OUTER)!=0;.
3bd0: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  .    /* When the
3be0: 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64   NATURAL keyword
3bf0: 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61 64 64   is present, add
3c00: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
3c10: 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 65  rms for.    ** e
3c20: 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68 61 74  very column that
3c30: 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20   the two tables 
3c40: 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e 2e 0a  have in common..
3c50: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
3c60: 52 69 67 68 74 2d 3e 66 67 2e 6a 6f 69 6e 74 79  Right->fg.jointy
3c70: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20  pe & JT_NATURAL 
3c80: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69  ){.      if( pRi
3c90: 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67  ght->pOn || pRig
3ca0: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
3cb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
3cc0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
3cd0: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61   NATURAL join ma
3ce0: 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20  y not have ".   
3cf0: 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f          "an ON o
3d00: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c  r USING clause",
3d10: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   0);.        ret
3d20: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
3d30: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3d40: 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b  pRightTab->nCol;
3d50: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
3d60: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a  har *zName;   /*
3d70: 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20   Name of column 
3d80: 69 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62  in the right tab
3d90: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
3da0: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20  t iLeft;     /* 
3db0: 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61  Matching left ta
3dc0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ble */.        i
3dd0: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a  nt iLeftCol;  /*
3de0: 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   Matching column
3df0: 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62   in the left tab
3e00: 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a  le */..        z
3e10: 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62  Name = pRightTab
3e20: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
3e30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62  .        if( tab
3e40: 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
3e50: 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d  (pSrc, i+1, zNam
3e60: 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66  e, &iLeft, &iLef
3e70: 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  tCol) ){.       
3e80: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
3e90: 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c  pParse, pSrc, iL
3ea0: 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69  eft, iLeftCol, i
3eb0: 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20  +1, j,.         
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
3ed0: 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72  Outer, &p->pWher
3ee0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
3ef0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
3f00: 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74   /* Disallow bot
3f10: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  h ON and USING c
3f20: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
3f30: 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20  me join.    */. 
3f40: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
3f50: 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55  On && pRight->pU
3f60: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  sing ){.      sq
3f70: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3f80: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61  arse, "cannot ha
3f90: 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ve both ON and U
3fa0: 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22  SING ".        "
3fb0: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
3fc0: 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20  ame join");.    
3fd0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3fe0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  }..    /* Add th
3ff0: 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74  e ON clause to t
4000: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
4010: 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e  ERE clause, conn
4020: 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20  ected by.    ** 
4030: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
4040: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
4050: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20  pRight->pOn ){. 
4060: 20 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72       if( isOuter
4070: 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70   ) setJoinExpr(p
4080: 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67  Right->pOn, pRig
4090: 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ht->iCursor);.  
40a0: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
40b0: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
40c0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57  Parse->db, p->pW
40d0: 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f  here, pRight->pO
40e0: 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  n);.      pRight
40f0: 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  ->pOn = 0;.    }
4100: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
4110: 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74  extra terms on t
4120: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4130: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
4140: 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  named.    ** in 
4150: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
4160: 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  .  Example: If t
4170: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f  he two tables to
4180: 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a   be joined are .
4190: 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61      ** A and B a
41a0: 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  nd the USING cla
41b0: 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20  use names X, Y, 
41c0: 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20  and Z, then add 
41d0: 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  this.    ** to t
41e0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a  he WHERE clause:
41f0: 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20      A.X=B.X AND 
4200: 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d  A.Y=B.Y AND A.Z=
4210: 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72  B.Z.    ** Repor
4220: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e  t an error if an
4230: 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e  y column mention
4240: 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ed in the USING 
4250: 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a  clause is.    **
4260: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
4270: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f  n both tables to
4280: 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20   be joined..    
4290: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
42a0: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
42b0: 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74     IdList *pList
42c0: 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e   = pRight->pUsin
42d0: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  g;.      for(j=0
42e0: 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; j<pList->nId; 
42f0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
4300: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f  ar *zName;     /
4310: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65  * Name of the te
4320: 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  rm in the USING 
4330: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
4340: 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20    int iLeft;    
4350: 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74     /* Table on t
4360: 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74  he left with mat
4370: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ching column nam
4380: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
4390: 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a   iLeftCol;    /*
43a0: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
43b0: 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  f matching colum
43c0: 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f  n on the left */
43d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69  .        int iRi
43e0: 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c  ghtCol;   /* Col
43f0: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  umn number of ma
4400: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e  tching column on
4410: 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20   the right */.. 
4420: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70         zName = p
4430: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
4440: 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74  ;.        iRight
4450: 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65  Col = columnInde
4460: 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61  x(pRightTab, zNa
4470: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
4480: 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20   iRightCol<0.   
4490: 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41        || !tableA
44a0: 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53  ndColumnIndex(pS
44b0: 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20  rc, i+1, zName, 
44c0: 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f  &iLeft, &iLeftCo
44d0: 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  l).        ){.  
44e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
44f0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4500: 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69  "cannot join usi
4510: 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63  ng column %s - c
4520: 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20  olumn ".        
4530: 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74      "not present
4540: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22   in both tables"
4550: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
4560: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
4570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4580: 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61  addWhereTerm(pPa
4590: 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74  rse, pSrc, iLeft
45a0: 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c  , iLeftCol, i+1,
45b0: 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20   iRightCol,.    
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45d0: 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57   isOuter, &p->pW
45e0: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  here);.      }. 
45f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
4600: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  n 0;.}../* Forwa
4610: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
4620: 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a  static KeyInfo *
4630: 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
4640: 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ist(.  Parse *pP
4650: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
4660: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
4670: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
4680: 69 73 74 2c 20 20 20 20 20 2f 2a 20 46 6f 72 6d  ist,     /* Form
4690: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a   the KeyInfo obj
46a0: 65 63 74 20 66 72 6f 6d 20 74 68 69 73 20 45 78  ect from this Ex
46b0: 70 72 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  prList */.  int 
46c0: 69 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20  iStart,         
46d0: 20 2f 2a 20 42 65 67 69 6e 20 77 69 74 68 20 74   /* Begin with t
46e0: 68 69 73 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c  his column of pL
46f0: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ist */.  int nEx
4700: 74 72 61 20 20 20 20 20 20 20 20 20 20 20 2f 2a  tra           /*
4710: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 65   Add this many e
4720: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  xtra columns to 
4730: 74 68 65 20 65 6e 64 20 2a 2f 0a 29 3b 0a 0a 2f  the end */.);../
4740: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
4750: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  de that will pus
4760: 68 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 20  h the record in 
4770: 72 65 67 69 73 74 65 72 73 20 72 65 67 44 61 74  registers regDat
4780: 61 0a 2a 2a 20 74 68 72 6f 75 67 68 20 72 65 67  a.** through reg
4790: 44 61 74 61 2b 6e 44 61 74 61 2d 31 20 6f 6e 74  Data+nData-1 ont
47a0: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f  o the sorter..*/
47b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
47c0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50  hOntoSorter(.  P
47d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
47e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
47f0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 6f 72  context */.  Sor
4800: 74 43 74 78 20 2a 70 53 6f 72 74 2c 20 20 20 20  tCtx *pSort,    
4810: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
4820: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 4f 52 44  on about the ORD
4830: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
4840: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
4850: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
4860: 77 68 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61  whole SELECT sta
4870: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
4880: 72 65 67 44 61 74 61 2c 20 20 20 20 20 20 20 20  regData,        
4890: 20 20 20 2f 2a 20 46 69 72 73 74 20 72 65 67 69     /* First regi
48a0: 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64 61 74  ster holding dat
48b0: 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  a to be sorted *
48c0: 2f 0a 20 20 69 6e 74 20 72 65 67 4f 72 69 67 44  /.  int regOrigD
48d0: 61 74 61 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  ata,       /* Fi
48e0: 72 73 74 20 72 65 67 69 73 74 65 72 20 68 6f 6c  rst register hol
48f0: 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65  ding data before
4900: 20 70 61 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e   packing */.  in
4910: 74 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20  t nData,        
4920: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4930: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
4940: 65 20 64 61 74 61 20 61 72 72 61 79 20 2a 2f 0a  e data array */.
4950: 20 20 69 6e 74 20 6e 50 72 65 66 69 78 52 65 67    int nPrefixReg
4960: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2e 20           /* No. 
4970: 6f 66 20 72 65 67 20 70 72 69 6f 72 20 74 6f 20  of reg prior to 
4980: 72 65 67 44 61 74 61 20 61 76 61 69 6c 61 62 6c  regData availabl
4990: 65 20 66 6f 72 20 75 73 65 20 2a 2f 0a 29 7b 0a  e for use */.){.
49a0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
49b0: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49d0: 20 20 20 2f 2a 20 53 74 6d 74 20 75 6e 64 65 72     /* Stmt under
49e0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
49f0: 0a 20 20 69 6e 74 20 62 53 65 71 20 3d 20 28 28  .  int bSeq = ((
4a00: 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c 61 67 73  pSort->sortFlags
4a10: 20 26 20 53 4f 52 54 46 4c 41 47 5f 55 73 65 53   & SORTFLAG_UseS
4a20: 6f 72 74 65 72 29 3d 3d 30 29 3b 0a 20 20 69 6e  orter)==0);.  in
4a30: 74 20 6e 45 78 70 72 20 3d 20 70 53 6f 72 74 2d  t nExpr = pSort-
4a40: 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  >pOrderBy->nExpr
4a50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4a60: 2a 20 4e 6f 2e 20 6f 66 20 4f 52 44 45 52 20 42  * No. of ORDER B
4a70: 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e 74  Y terms */.  int
4a80: 20 6e 42 61 73 65 20 3d 20 6e 45 78 70 72 20 2b   nBase = nExpr +
4a90: 20 62 53 65 71 20 2b 20 6e 44 61 74 61 3b 20 20   bSeq + nData;  
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4ab0: 20 46 69 65 6c 64 73 20 69 6e 20 73 6f 72 74 65   Fields in sorte
4ac0: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
4ad0: 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4b00: 2a 20 52 65 67 73 20 66 6f 72 20 73 6f 72 74 65  * Regs for sorte
4b10: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
4b20: 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 2b 2b  t regRecord = ++
4b30: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20  pParse->nMem;   
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4b50: 2a 20 41 73 73 65 6d 62 6c 65 64 20 73 6f 72 74  * Assembled sort
4b60: 65 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  er record */.  i
4b70: 6e 74 20 6e 4f 42 53 61 74 20 3d 20 70 53 6f 72  nt nOBSat = pSor
4b80: 74 2d 3e 6e 4f 42 53 61 74 3b 20 20 20 20 20 20  t->nOBSat;      
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ba0: 2f 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  /* ORDER BY term
4bb0: 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20 69  s to skip */.  i
4bc0: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4be0: 20 20 2f 2a 20 4f 70 63 6f 64 65 20 74 6f 20 61    /* Opcode to a
4bf0: 64 64 20 73 6f 72 74 65 72 20 72 65 63 6f 72 64  dd sorter record
4c00: 20 74 6f 20 73 6f 72 74 65 72 20 2a 2f 0a 20 20   to sorter */.  
4c10: 69 6e 74 20 69 4c 69 6d 69 74 3b 20 20 20 20 20  int iLimit;     
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c30: 20 20 20 2f 2a 20 4c 49 4d 49 54 20 63 6f 75 6e     /* LIMIT coun
4c40: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
4c50: 28 20 62 53 65 71 3d 3d 30 20 7c 7c 20 62 53 65  ( bSeq==0 || bSe
4c60: 71 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  q==1 );.  assert
4c70: 28 20 6e 44 61 74 61 3d 3d 31 20 7c 7c 20 72 65  ( nData==1 || re
4c80: 67 44 61 74 61 3d 3d 72 65 67 4f 72 69 67 44 61  gData==regOrigDa
4c90: 74 61 20 7c 7c 20 72 65 67 4f 72 69 67 44 61 74  ta || regOrigDat
4ca0: 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 50  a==0 );.  if( nP
4cb0: 72 65 66 69 78 52 65 67 20 29 7b 0a 20 20 20 20  refixReg ){.    
4cc0: 61 73 73 65 72 74 28 20 6e 50 72 65 66 69 78 52  assert( nPrefixR
4cd0: 65 67 3d 3d 6e 45 78 70 72 2b 62 53 65 71 20 29  eg==nExpr+bSeq )
4ce0: 3b 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20  ;.    regBase = 
4cf0: 72 65 67 44 61 74 61 20 2d 20 6e 45 78 70 72 20  regData - nExpr 
4d00: 2d 20 62 53 65 71 3b 0a 20 20 7d 65 6c 73 65 7b  - bSeq;.  }else{
4d10: 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 70  .    regBase = p
4d20: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
4d30: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
4d40: 6d 20 2b 3d 20 6e 42 61 73 65 3b 0a 20 20 7d 0a  m += nBase;.  }.
4d50: 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63    assert( pSelec
4d60: 74 2d 3e 69 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t->iOffset==0 ||
4d70: 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74   pSelect->iLimit
4d80: 21 3d 30 20 29 3b 0a 20 20 69 4c 69 6d 69 74 20  !=0 );.  iLimit 
4d90: 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73  = pSelect->iOffs
4da0: 65 74 20 3f 20 70 53 65 6c 65 63 74 2d 3e 69 4f  et ? pSelect->iO
4db0: 66 66 73 65 74 2b 31 20 3a 20 70 53 65 6c 65 63  ffset+1 : pSelec
4dc0: 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 70 53 6f  t->iLimit;.  pSo
4dd0: 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 20 3d 20  rt->labelDone = 
4de0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
4df0: 61 62 65 6c 28 76 29 3b 0a 20 20 73 71 6c 69 74  abel(v);.  sqlit
4e00: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
4e10: 73 74 28 70 50 61 72 73 65 2c 20 70 53 6f 72 74  st(pParse, pSort
4e20: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42  ->pOrderBy, regB
4e30: 61 73 65 2c 20 72 65 67 4f 72 69 67 44 61 74 61  ase, regOrigData
4e40: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
4e60: 54 45 5f 45 43 45 4c 5f 44 55 50 20 7c 20 28 72  TE_ECEL_DUP | (r
4e70: 65 67 4f 72 69 67 44 61 74 61 3f 20 53 51 4c 49  egOrigData? SQLI
4e80: 54 45 5f 45 43 45 4c 5f 52 45 46 20 3a 20 30 29  TE_ECEL_REF : 0)
4e90: 29 3b 0a 20 20 69 66 28 20 62 53 65 71 20 29 7b  );.  if( bSeq ){
4ea0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
4eb0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71  AddOp2(v, OP_Seq
4ec0: 75 65 6e 63 65 2c 20 70 53 6f 72 74 2d 3e 69 45  uence, pSort->iE
4ed0: 43 75 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b  Cursor, regBase+
4ee0: 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 69 66  nExpr);.  }.  if
4ef0: 28 20 6e 50 72 65 66 69 78 52 65 67 3d 3d 30 20  ( nPrefixReg==0 
4f00: 26 26 20 6e 44 61 74 61 3e 30 20 29 7b 0a 20 20  && nData>0 ){.  
4f10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
4f20: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
4f30: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
4f40: 45 78 70 72 2b 62 53 65 71 2c 20 6e 44 61 74 61  Expr+bSeq, nData
4f50: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4f 42  );.  }.  if( nOB
4f60: 53 61 74 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  Sat>0 ){.    int
4f70: 20 72 65 67 50 72 65 76 4b 65 79 3b 20 20 20 2f   regPrevKey;   /
4f80: 2a 20 54 68 65 20 66 69 72 73 74 20 6e 4f 42 53  * The first nOBS
4f90: 61 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  at columns of th
4fa0: 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 2a  e previous row *
4fb0: 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 46 69  /.    int addrFi
4fc0: 72 73 74 3b 20 20 20 20 2f 2a 20 41 64 64 72 65  rst;    /* Addre
4fd0: 73 73 20 6f 66 20 74 68 65 20 4f 50 5f 49 66 4e  ss of the OP_IfN
4fe0: 6f 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  ot opcode */.   
4ff0: 20 69 6e 74 20 61 64 64 72 4a 6d 70 3b 20 20 20   int addrJmp;   
5000: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
5010: 20 74 68 65 20 4f 50 5f 4a 75 6d 70 20 6f 70 63   the OP_Jump opc
5020: 6f 64 65 20 2a 2f 0a 20 20 20 20 56 64 62 65 4f  ode */.    VdbeO
5030: 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 2f 2a 20  p *pOp;      /* 
5040: 4f 70 63 6f 64 65 20 74 68 61 74 20 6f 70 65 6e  Opcode that open
5050: 73 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a  s the sorter */.
5060: 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 20 20 20      int nKey;   
5070: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5080: 6f 66 20 73 6f 72 74 69 6e 67 20 6b 65 79 20 63  of sorting key c
5090: 6f 6c 75 6d 6e 73 2c 20 69 6e 63 6c 75 64 69 6e  olumns, includin
50a0: 67 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 2a 2f  g OP_Sequence */
50b0: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
50c0: 49 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  I;     /* Origin
50d0: 61 6c 20 4b 65 79 49 6e 66 6f 20 6f 6e 20 74 68  al KeyInfo on th
50e0: 65 20 73 6f 72 74 65 72 20 74 61 62 6c 65 20 2a  e sorter table *
50f0: 2f 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  /..    sqlite3Vd
5100: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
5110: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61  akeRecord, regBa
5120: 73 65 2b 6e 4f 42 53 61 74 2c 20 6e 42 61 73 65  se+nOBSat, nBase
5130: 2d 6e 4f 42 53 61 74 2c 72 65 67 52 65 63 6f 72  -nOBSat,regRecor
5140: 64 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 4b  d);.    regPrevK
5150: 65 79 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ey = pParse->nMe
5160: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
5170: 3e 6e 4d 65 6d 20 2b 3d 20 70 53 6f 72 74 2d 3e  >nMem += pSort->
5180: 6e 4f 42 53 61 74 3b 0a 20 20 20 20 6e 4b 65 79  nOBSat;.    nKey
5190: 20 3d 20 6e 45 78 70 72 20 2d 20 70 53 6f 72 74   = nExpr - pSort
51a0: 2d 3e 6e 4f 42 53 61 74 20 2b 20 62 53 65 71 3b  ->nOBSat + bSeq;
51b0: 0a 20 20 20 20 69 66 28 20 62 53 65 71 20 29 7b  .    if( bSeq ){
51c0: 0a 20 20 20 20 20 20 61 64 64 72 46 69 72 73 74  .      addrFirst
51d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
51e0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  dOp1(v, OP_IfNot
51f0: 2c 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29  , regBase+nExpr)
5200: 3b 20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ; .    }else{.  
5210: 20 20 20 20 61 64 64 72 46 69 72 73 74 20 3d 20      addrFirst = 
5220: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5230: 31 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  1(v, OP_Sequence
5240: 54 65 73 74 2c 20 70 53 6f 72 74 2d 3e 69 45 43  Test, pSort->iEC
5250: 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ursor);.    }.  
5260: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
5270: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
5280: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
5290: 6f 6d 70 61 72 65 2c 20 72 65 67 50 72 65 76 4b  ompare, regPrevK
52a0: 65 79 2c 20 72 65 67 42 61 73 65 2c 20 70 53 6f  ey, regBase, pSo
52b0: 72 74 2d 3e 6e 4f 42 53 61 74 29 3b 0a 20 20 20  rt->nOBSat);.   
52c0: 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
52d0: 62 65 47 65 74 4f 70 28 76 2c 20 70 53 6f 72 74  beGetOp(v, pSort
52e0: 2d 3e 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  ->addrSortIndex)
52f0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
5300: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
5310: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ed ) return;.   
5320: 20 70 4f 70 2d 3e 70 32 20 3d 20 6e 4b 65 79 20   pOp->p2 = nKey 
5330: 2b 20 6e 44 61 74 61 3b 0a 20 20 20 20 70 4b 49  + nData;.    pKI
5340: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
5350: 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  nfo;.    memset(
5360: 70 4b 49 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  pKI->aSortOrder,
5370: 20 30 2c 20 70 4b 49 2d 3e 6e 4b 65 79 46 69 65   0, pKI->nKeyFie
5380: 6c 64 29 3b 20 2f 2a 20 4d 61 6b 65 73 20 4f 50  ld); /* Makes OP
5390: 5f 4a 75 6d 70 20 74 65 73 74 61 62 6c 65 20 2a  _Jump testable *
53a0: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
53b0: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
53c0: 20 28 63 68 61 72 2a 29 70 4b 49 2c 20 50 34 5f   (char*)pKI, P4_
53d0: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 74 65  KEYINFO);.    te
53e0: 73 74 63 61 73 65 28 20 70 4b 49 2d 3e 6e 41 6c  stcase( pKI->nAl
53f0: 6c 46 69 65 6c 64 20 3e 20 70 4b 49 2d 3e 6e 4b  lField > pKI->nK
5400: 65 79 46 69 65 6c 64 2b 32 20 29 3b 0a 20 20 20  eyField+2 );.   
5410: 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66   pOp->p4.pKeyInf
5420: 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
5430: 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
5440: 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2c  pSort->pOrderBy,
5450: 20 6e 4f 42 53 61 74 2c 0a 20 20 20 20 20 20 20   nOBSat,.       
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5480: 20 20 20 20 70 4b 49 2d 3e 6e 41 6c 6c 46 69 65      pKI->nAllFie
5490: 6c 64 2d 70 4b 49 2d 3e 6e 4b 65 79 46 69 65 6c  ld-pKI->nKeyFiel
54a0: 64 2d 31 29 3b 0a 20 20 20 20 61 64 64 72 4a 6d  d-1);.    addrJm
54b0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
54c0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
54d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
54e0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
54f0: 20 61 64 64 72 4a 6d 70 2b 31 2c 20 30 2c 20 61   addrJmp+1, 0, a
5500: 64 64 72 4a 6d 70 2b 31 29 3b 20 56 64 62 65 43  ddrJmp+1); VdbeC
5510: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
5520: 70 53 6f 72 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75  pSort->labelBkOu
5530: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
5540: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
5550: 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75 72   pSort->regRetur
5560: 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  n = ++pParse->nM
5570: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  em;.    sqlite3V
5580: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5590: 47 6f 73 75 62 2c 20 70 53 6f 72 74 2d 3e 72 65  Gosub, pSort->re
55a0: 67 52 65 74 75 72 6e 2c 20 70 53 6f 72 74 2d 3e  gReturn, pSort->
55b0: 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20 20  labelBkOut);.   
55c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
55d0: 70 31 28 76 2c 20 4f 50 5f 52 65 73 65 74 53 6f  p1(v, OP_ResetSo
55e0: 72 74 65 72 2c 20 70 53 6f 72 74 2d 3e 69 45 43  rter, pSort->iEC
55f0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  ursor);.    if( 
5600: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
5610: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5620: 32 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 69  2(v, OP_IfNot, i
5630: 4c 69 6d 69 74 2c 20 70 53 6f 72 74 2d 3e 6c 61  Limit, pSort->la
5640: 62 65 6c 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20  belDone);.      
5650: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
5660: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
5670: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
5680: 2c 20 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  , addrFirst);.  
5690: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
56a0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
56b0: 67 42 61 73 65 2c 20 72 65 67 50 72 65 76 4b 65  gBase, regPrevKe
56c0: 79 2c 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74  y, pSort->nOBSat
56d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
56e0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
56f0: 64 72 4a 6d 70 29 3b 0a 20 20 7d 0a 20 20 69 66  drJmp);.  }.  if
5700: 28 20 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ( iLimit ){.    
5710: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
5720: 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20   the values for 
5730: 74 68 65 20 6e 65 77 20 73 6f 72 74 65 72 20 65  the new sorter e
5740: 6e 74 72 79 20 61 72 65 20 73 74 6f 72 65 64 0a  ntry are stored.
5750: 20 20 20 20 2a 2a 20 69 6e 20 61 6e 20 61 72 72      ** in an arr
5760: 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e  ay of registers.
5770: 20 54 68 65 79 20 6e 65 65 64 20 74 6f 20 62 65   They need to be
5780: 20 63 6f 6d 70 6f 73 65 64 20 69 6e 74 6f 20 61   composed into a
5790: 20 72 65 63 6f 72 64 0a 20 20 20 20 2a 2a 20 61   record.    ** a
57a0: 6e 64 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  nd inserted into
57b0: 20 74 68 65 20 73 6f 72 74 65 72 20 69 66 20 65   the sorter if e
57c0: 69 74 68 65 72 20 28 61 29 20 74 68 65 72 65 20  ither (a) there 
57d0: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  are currently.  
57e0: 20 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 4c    ** less than L
57f0: 49 4d 49 54 2b 4f 46 46 53 45 54 20 69 74 65 6d  IMIT+OFFSET item
5800: 73 20 6f 72 20 28 62 29 20 74 68 65 20 6e 65 77  s or (b) the new
5810: 20 72 65 63 6f 72 64 20 69 73 20 73 6d 61 6c 6c   record is small
5820: 65 72 20 74 68 61 6e 20 0a 20 20 20 20 2a 2a 20  er than .    ** 
5830: 74 68 65 20 6c 61 72 67 65 73 74 20 72 65 63 6f  the largest reco
5840: 72 64 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  rd currently in 
5850: 74 68 65 20 73 6f 72 74 65 72 2e 20 49 66 20 28  the sorter. If (
5860: 62 29 20 69 73 20 74 72 75 65 20 61 6e 64 20 74  b) is true and t
5870: 68 65 72 65 0a 20 20 20 20 2a 2a 20 61 72 65 20  here.    ** are 
5880: 61 6c 72 65 61 64 79 20 4c 49 4d 49 54 2b 4f 46  already LIMIT+OF
5890: 46 53 45 54 20 69 74 65 6d 73 20 69 6e 20 74 68  FSET items in th
58a0: 65 20 73 6f 72 74 65 72 2c 20 64 65 6c 65 74 65  e sorter, delete
58b0: 20 74 68 65 20 6c 61 72 67 65 73 74 0a 20 20 20   the largest.   
58c0: 20 2a 2a 20 65 6e 74 72 79 20 62 65 66 6f 72 65   ** entry before
58d0: 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 20 6e   inserting the n
58e0: 65 77 20 6f 6e 65 2e 20 54 68 69 73 20 77 61 79  ew one. This way
58f0: 20 74 68 65 72 65 20 61 72 65 20 6e 65 76 65 72   there are never
5900: 20 6d 6f 72 65 20 0a 20 20 20 20 2a 2a 20 74 68   more .    ** th
5910: 61 6e 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 20  an LIMIT+OFFSET 
5920: 69 74 65 6d 73 20 69 6e 20 74 68 65 20 73 6f 72  items in the sor
5930: 74 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ter..    **.    
5940: 2a 2a 20 49 66 20 74 68 65 20 6e 65 77 20 72 65  ** If the new re
5950: 63 6f 72 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65  cord does not ne
5960: 65 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  ed to be inserte
5970: 64 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65  d into the sorte
5980: 72 2c 0a 20 20 20 20 2a 2a 20 6a 75 6d 70 20 74  r,.    ** jump t
5990: 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
59a0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
59b0: 2e 20 4f 72 2c 20 69 66 20 74 68 65 0a 20 20 20  . Or, if the.   
59c0: 20 2a 2a 20 70 53 6f 72 74 2d 3e 62 4f 72 64 65   ** pSort->bOrde
59d0: 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 66 6c 61  redInnerLoop fla
59e0: 67 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69  g is set to indi
59f0: 63 61 74 65 20 74 68 61 74 20 74 68 65 20 69 6e  cate that the in
5a00: 6e 65 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 20  ner.    ** loop 
5a10: 64 65 6c 69 76 65 72 73 20 69 74 65 6d 73 20 69  delivers items i
5a20: 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c 20  n sorted order, 
5a30: 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74  jump to the next
5a40: 20 69 74 65 72 61 74 69 6f 6e 0a 20 20 20 20 2a   iteration.    *
5a50: 2a 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c  * of the outer l
5a60: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
5a70: 69 6e 74 20 69 43 73 72 20 3d 20 70 53 6f 72 74  int iCsr = pSort
5a80: 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 20 20  ->iECursor;.    
5a90: 69 6e 74 20 69 4a 6d 70 20 3d 20 73 71 6c 69 74  int iJmp = sqlit
5aa0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
5ab0: 72 28 76 29 2b 35 2b 28 6e 4f 42 53 61 74 3c 3d  r(v)+5+(nOBSat<=
5ac0: 30 29 2b 70 53 6f 72 74 2d 3e 62 4f 72 64 65 72  0)+pSort->bOrder
5ad0: 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 0a 20 20 20  edInnerLoop;.   
5ae0: 20 61 73 73 65 72 74 28 20 70 53 6f 72 74 2d 3e   assert( pSort->
5af0: 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f  bOrderedInnerLoo
5b00: 70 3d 3d 30 20 7c 7c 20 70 53 6f 72 74 2d 3e 62  p==0 || pSort->b
5b10: 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70  OrderedInnerLoop
5b20: 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==1 );.    sqlit
5b30: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5b40: 4f 50 5f 49 66 4e 6f 74 5a 65 72 6f 2c 20 69 4c  OP_IfNotZero, iL
5b50: 69 6d 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62  imit, sqlite3Vdb
5b60: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b  eCurrentAddr(v)+
5b70: 34 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65  4);.    VdbeCove
5b80: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
5b90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5ba0: 2c 20 4f 50 5f 4c 61 73 74 2c 20 69 43 73 72 2c  , OP_Last, iCsr,
5bb0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
5bc0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
5bd0: 20 4f 50 5f 49 64 78 4c 45 2c 20 69 43 73 72 2c   OP_IdxLE, iCsr,
5be0: 20 69 4a 6d 70 2c 20 72 65 67 42 61 73 65 2b 6e   iJmp, regBase+n
5bf0: 4f 42 53 61 74 2c 20 6e 45 78 70 72 2d 6e 4f 42  OBSat, nExpr-nOB
5c00: 53 61 74 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  Sat);.    VdbeCo
5c10: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
5c20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
5c30: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69  (v, OP_Delete, i
5c40: 43 73 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Csr);.  }.  if( 
5c50: 6e 4f 42 53 61 74 3c 3d 30 20 29 7b 0a 20 20 20  nOBSat<=0 ){.   
5c60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5c70: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
5c80: 6f 72 64 2c 20 72 65 67 42 61 73 65 2b 6e 4f 42  ord, regBase+nOB
5c90: 53 61 74 2c 20 6e 42 61 73 65 2d 6e 4f 42 53 61  Sat, nBase-nOBSa
5ca0: 74 2c 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  t,regRecord);.  
5cb0: 7d 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73  }.  if( pSort->s
5cc0: 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46  ortFlags & SORTF
5cd0: 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b  LAG_UseSorter ){
5ce0: 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f 72  .    op = OP_Sor
5cf0: 74 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65 6c  terInsert;.  }el
5d00: 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f  se{.    op = OP_
5d10: 49 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a 20  IdxInsert;.  }. 
5d20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5d30: 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 70 53 6f  p4Int(v, op, pSo
5d40: 72 74 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72 65  rt->iECursor, re
5d50: 67 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20  gRecord,.       
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d70: 72 65 67 42 61 73 65 2b 6e 4f 42 53 61 74 2c 20  regBase+nOBSat, 
5d80: 6e 42 61 73 65 2d 6e 4f 42 53 61 74 29 3b 0a 7d  nBase-nOBSat);.}
5d90: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65  ../*.** Add code
5da0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
5db0: 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61 74  e OFFSET.*/.stat
5dc0: 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66 73  ic void codeOffs
5dd0: 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20  et(.  Vdbe *v,  
5de0: 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
5df0: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
5e00: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 69  is VM */.  int i
5e10: 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a 20  Offset,      /* 
5e20: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
5e30: 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75 6e   the offset coun
5e40: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ter */.  int iCo
5e50: 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75  ntinue     /* Ju
5e60: 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20  mp here to skip 
5e70: 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f  the current reco
5e80: 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69  rd */.){.  if( i
5e90: 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20  Offset>0 ){.    
5ea0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5eb0: 33 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  3(v, OP_IfPos, i
5ec0: 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75  Offset, iContinu
5ed0: 65 2c 20 31 29 3b 20 56 64 62 65 43 6f 76 65 72  e, 1); VdbeCover
5ee0: 61 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65  age(v);.    Vdbe
5ef0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46  Comment((v, "OFF
5f00: 53 45 54 22 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  SET"));.  }.}../
5f10: 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68  *.** Add code th
5f20: 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f  at will check to
5f30: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e   make sure the N
5f40: 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74   registers start
5f50: 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66  ing at iMem.** f
5f60: 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65  orm a distinct e
5f70: 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61  ntry.  iTab is a
5f80: 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
5f90: 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f  hat holds previo
5fa0: 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d  usly.** seen com
5fb0: 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  binations of the
5fc0: 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65   N values.  A ne
5fd0: 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20  w entry is made 
5fe0: 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68  in iTab.** if th
5ff0: 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75  e current N valu
6000: 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a  es are new..**.*
6010: 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72  * A jump to addr
6020: 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61  Repeat is made a
6030: 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65  nd the N+1 value
6040: 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f  s are popped fro
6050: 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69  m the.** stack i
6060: 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d  f the top N elem
6070: 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73  ents are not dis
6080: 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  tinct..*/.static
6090: 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e   void codeDistin
60a0: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
60b0: 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
60c0: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
60d0: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
60e0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
60f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72          /* A sor
6100: 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20  ting index used 
6110: 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74  to test for dist
6120: 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e  inctness */.  in
6130: 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20  t addrRepeat,   
6140: 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65   /* Jump to here
6150: 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74   if not distinct
6160: 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20   */.  int N,    
6170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6180: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a  er of elements *
6190: 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20  /.  int iMem    
61a0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
61b0: 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  element */.){.  
61c0: 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72  Vdbe *v;.  int r
61d0: 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65  1;..  v = pParse
61e0: 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20  ->pVdbe;.  r1 = 
61f0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
6200: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
6210: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
6220: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
6230: 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c  Tab, addrRepeat,
6240: 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65 43   iMem, N); VdbeC
6250: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
6260: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6270: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
6280: 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a  , iMem, N, r1);.
6290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
62a0: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78  Op4Int(v, OP_Idx
62b0: 49 6e 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31  Insert, iTab, r1
62c0: 2c 20 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71  , iMem, N);.  sq
62d0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
62e0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
62f0: 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71  EEKRESULT);.  sq
6300: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
6310: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
6320: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
6330: 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f  E_ENABLE_SORTER_
6340: 52 45 46 45 52 45 4e 43 45 53 0a 2f 2a 0a 2a 2a  REFERENCES./*.**
6350: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
6360: 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
6370: 20 6f 66 20 69 6e 6e 65 72 2d 6c 6f 6f 70 20 67   of inner-loop g
6380: 65 6e 65 72 61 74 69 6f 6e 20 66 6f 72 20 61 20  eneration for a 
6390: 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
63a0: 65 6e 74 20 77 69 74 68 20 61 6e 20 4f 52 44 45  ent with an ORDE
63b0: 52 20 42 59 20 74 68 61 74 20 69 73 20 6e 6f 74  R BY that is not
63c0: 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 61 6e   optimized by an
63d0: 20 69 6e 64 65 78 2e 20 49 74 20 0a 2a 2a 20 64   index. It .** d
63e0: 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 65 78  etermines the ex
63f0: 70 72 65 73 73 69 6f 6e 73 2c 20 69 66 20 61 6e  pressions, if an
6400: 79 2c 20 74 68 61 74 20 74 68 65 20 73 6f 72 74  y, that the sort
6410: 65 72 2d 72 65 66 65 72 65 6e 63 65 20 0a 2a 2a  er-reference .**
6420: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 68   optimization sh
6430: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72  ould be used for
6440: 2e 20 54 68 65 20 73 6f 72 74 65 72 2d 72 65 66  . The sorter-ref
6450: 65 72 65 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74  erence optimizat
6460: 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20 66  ion.** is used f
6470: 6f 72 20 53 45 4c 45 43 54 20 71 75 65 72 69 65  or SELECT querie
6480: 73 20 6c 69 6b 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  s like:.**.**   
6490: 53 45 4c 45 43 54 20 61 2c 20 62 69 67 62 6c 6f  SELECT a, bigblo
64a0: 62 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  b FROM t1 ORDER 
64b0: 42 59 20 61 20 4c 49 4d 49 54 20 31 30 0a 2a 2a  BY a LIMIT 10.**
64c0: 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d  .** If the optim
64d0: 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  ization is used 
64e0: 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 22  for expression "
64f0: 62 69 67 62 6c 6f 62 22 2c 20 74 68 65 6e 20 69  bigblob", then i
6500: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73 74 6f  nstead of.** sto
6510: 72 69 6e 67 20 76 61 6c 75 65 73 20 72 65 61 64  ring values read
6520: 20 66 72 6f 6d 20 74 68 61 74 20 63 6f 6c 75 6d   from that colum
6530: 6e 20 69 6e 20 74 68 65 20 73 6f 72 74 65 72 20  n in the sorter 
6540: 72 65 63 6f 72 64 73 2c 20 74 68 65 20 50 4b 20  records, the PK 
6550: 6f 66 0a 2a 2a 20 74 68 65 20 72 6f 77 20 66 72  of.** the row fr
6560: 6f 6d 20 74 61 62 6c 65 20 74 31 20 69 73 20 73  om table t1 is s
6570: 74 6f 72 65 64 20 69 6e 73 74 65 61 64 2e 20 54  tored instead. T
6580: 68 65 6e 2c 20 61 73 20 72 65 63 6f 72 64 73 20  hen, as records 
6590: 61 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72  are extracted fr
65a0: 6f 6d 0a 2a 2a 20 74 68 65 20 73 6f 72 74 65 72  om.** the sorter
65b0: 20 74 6f 20 72 65 74 75 72 6e 20 74 6f 20 74 68   to return to th
65c0: 65 20 75 73 65 72 2c 20 74 68 65 20 72 65 71 75  e user, the requ
65d0: 69 72 65 64 20 76 61 6c 75 65 20 6f 66 20 62 69  ired value of bi
65e0: 67 62 6c 6f 62 20 69 73 0a 2a 2a 20 72 65 74 72  gblob is.** retr
65f0: 69 65 76 65 64 20 64 69 72 65 63 74 6c 79 20 66  ieved directly f
6600: 72 6f 6d 20 74 61 62 6c 65 20 74 31 2e 20 49 66  rom table t1. If
6610: 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 20   the values are 
6620: 76 65 72 79 20 6c 61 72 67 65 2c 20 74 68 69 73  very large, this
6630: 20 0a 2a 2a 20 63 61 6e 20 62 65 20 6d 6f 72 65   .** can be more
6640: 20 65 66 66 69 63 69 65 6e 74 20 74 68 61 6e 20   efficient than 
6650: 73 74 6f 72 69 6e 67 20 74 68 65 6d 20 64 69 72  storing them dir
6660: 65 63 74 6c 79 20 69 6e 20 74 68 65 20 73 6f 72  ectly in the sor
6670: 74 65 72 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a  ter records..**.
6680: 2a 2a 20 54 68 65 20 45 78 70 72 4c 69 73 74 5f  ** The ExprList_
6690: 69 74 65 6d 2e 62 53 6f 72 74 65 72 52 65 66 20  item.bSorterRef 
66a0: 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20  flag is set for 
66b0: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
66c0: 69 6e 20 70 45 4c 69 73 74 20 0a 2a 2a 20 66 6f  in pEList .** fo
66d0: 72 20 77 68 69 63 68 20 74 68 65 20 73 6f 72 74  r which the sort
66e0: 65 72 2d 72 65 66 65 72 65 6e 63 65 20 6f 70 74  er-reference opt
66f0: 69 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c 64  imization should
6700: 20 62 65 20 65 6e 61 62 6c 65 64 2e 20 0a 2a 2a   be enabled. .**
6710: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74   Additionally, t
6720: 68 65 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72  he pSort->aDefer
6730: 5b 5d 20 61 72 72 61 79 20 69 73 20 70 6f 70 75  [] array is popu
6740: 6c 61 74 65 64 20 77 69 74 68 20 65 6e 74 72 69  lated with entri
6750: 65 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 63 75  es.** for all cu
6760: 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20 74  rsors required t
6770: 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 73  o evaluate all s
6780: 65 6c 65 63 74 65 64 20 65 78 70 72 65 73 73 69  elected expressi
6790: 6f 6e 73 2e 20 46 69 6e 61 6c 6c 79 2e 0a 2a 2a  ons. Finally..**
67a0: 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
67b0: 20 28 2a 70 70 45 78 74 72 61 29 20 69 73 20 73   (*ppExtra) is s
67c0: 65 74 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  et to an express
67d0: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ion list contain
67e0: 69 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ing.** expressio
67f0: 6e 73 20 66 6f 72 20 61 6c 6c 20 65 78 74 72 61  ns for all extra
6800: 20 50 4b 20 76 61 6c 75 65 73 20 74 68 61 74 20   PK values that 
6810: 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64  should be stored
6820: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 6f 72 74 65   in the.** sorte
6830: 72 20 72 65 63 6f 72 64 73 2e 0a 2a 2f 0a 73 74  r records..*/.st
6840: 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
6850: 45 78 70 72 44 65 66 65 72 28 0a 20 20 50 61 72  ExprDefer(.  Par
6860: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
6870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6880: 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
6890: 68 65 72 65 20 2a 2f 0a 20 20 53 6f 72 74 43 74  here */.  SortCt
68a0: 78 20 2a 70 53 6f 72 74 2c 20 20 20 20 20 20 20  x *pSort,       
68b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72            /* Sor
68c0: 74 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ter context */. 
68d0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
68e0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
68f0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
6900: 64 65 73 74 69 6e 65 64 20 66 6f 72 20 73 6f 72  destined for sor
6910: 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ter */.  ExprLis
6920: 74 20 2a 2a 70 70 45 78 74 72 61 20 20 20 20 20  t **ppExtra     
6930: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
6940: 65 73 73 69 6f 6e 73 20 74 6f 20 61 70 70 65 6e  essions to appen
6950: 64 20 74 6f 20 73 6f 72 74 65 72 20 72 65 63 6f  d to sorter reco
6960: 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  rd */.){.  int i
6970: 3b 0a 20 20 69 6e 74 20 6e 44 65 66 65 72 20 3d  ;.  int nDefer =
6980: 20 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   0;.  ExprList *
6990: 70 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 66 6f  pExtra = 0;.  fo
69a0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
69b0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
69c0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
69d0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
69e0: 26 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  &pEList->a[i];. 
69f0: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e     if( pItem->u.
6a00: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  x.iOrderByCol==0
6a10: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
6a20: 70 45 78 70 72 20 3d 20 70 49 74 65 6d 2d 3e 70  pExpr = pItem->p
6a30: 45 78 70 72 3b 0a 20 20 20 20 20 20 54 61 62 6c  Expr;.      Tabl
6a40: 65 20 2a 70 54 61 62 20 3d 20 70 45 78 70 72 2d  e *pTab = pExpr-
6a50: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  >pTab;.      if(
6a60: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
6a70: 4f 4c 55 4d 4e 20 26 26 20 70 54 61 62 20 26 26  OLUMN && pTab &&
6a80: 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
6a90: 29 0a 20 20 20 20 20 20 20 26 26 20 28 70 54 61  ).       && (pTa
6aa0: 62 2d 3e 61 43 6f 6c 5b 70 45 78 70 72 2d 3e 69  b->aCol[pExpr->i
6ab0: 43 6f 6c 75 6d 6e 5d 2e 63 6f 6c 46 6c 61 67 73  Column].colFlags
6ac0: 20 26 20 43 4f 4c 46 4c 41 47 5f 53 4f 52 54 45   & COLFLAG_SORTE
6ad0: 52 52 45 46 29 0a 23 69 66 20 30 0a 20 20 20 20  RREF).#if 0.    
6ae0: 20 20 20 20 20 20 26 26 20 70 54 61 62 2d 3e 70        && pTab->p
6af0: 53 63 68 65 6d 61 20 26 26 20 70 54 61 62 2d 3e  Schema && pTab->
6b00: 70 53 65 6c 65 63 74 3d 3d 30 20 26 26 20 21 49  pSelect==0 && !I
6b10: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 0a 23  sVirtual(pTab).#
6b20: 65 6e 64 69 66 0a 20 20 20 20 20 20 29 7b 0a 20  endif.      ){. 
6b30: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
6b40: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
6b50: 3c 6e 44 65 66 65 72 3b 20 6a 2b 2b 29 7b 0a 20  <nDefer; j++){. 
6b60: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 6f           if( pSo
6b70: 72 74 2d 3e 61 44 65 66 65 72 5b 6a 5d 2e 69 43  rt->aDefer[j].iC
6b80: 73 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  sr==pExpr->iTabl
6b90: 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  e ) break;.     
6ba0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
6bb0: 20 6a 3d 3d 6e 44 65 66 65 72 20 29 7b 0a 20 20   j==nDefer ){.  
6bc0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 65 66          if( nDef
6bd0: 65 72 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 53  er==ArraySize(pS
6be0: 6f 72 74 2d 3e 61 44 65 66 65 72 29 20 29 7b 0a  ort->aDefer) ){.
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
6c00: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
6c10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
6c20: 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 31 3b     int nKey = 1;
6c30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
6c40: 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   k;.            
6c50: 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 0a  Index *pPk = 0;.
6c60: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
6c70: 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20  !HasRowid(pTab) 
6c80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
6c90: 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72   pPk = sqlite3Pr
6ca0: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
6cb0: 61 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ab);.           
6cc0: 20 20 20 6e 4b 65 79 20 3d 20 70 50 6b 2d 3e 6e     nKey = pPk->n
6cd0: 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  KeyCol;.        
6ce0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6cf0: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65    for(k=0; k<nKe
6d00: 79 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; k++){.       
6d10: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65         Expr *pNe
6d20: 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  w = sqlite3PExpr
6d30: 28 70 50 61 72 73 65 2c 20 54 4b 5f 43 4f 4c 55  (pParse, TK_COLU
6d40: 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  MN, 0, 0);.     
6d50: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
6d60: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  w ){.           
6d70: 20 20 20 20 20 70 4e 65 77 2d 3e 69 54 61 62 6c       pNew->iTabl
6d80: 65 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  e = pExpr->iTabl
6d90: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
6da0: 20 20 20 70 4e 65 77 2d 3e 70 54 61 62 20 3d 20     pNew->pTab = 
6db0: 70 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20  pExpr->pTab;.   
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
6dd0: 77 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 50 6b  w->iColumn = pPk
6de0: 20 3f 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   ? pPk->aiColumn
6df0: 5b 6b 5d 20 3a 20 2d 31 3b 0a 20 20 20 20 20 20  [k] : -1;.      
6e00: 20 20 20 20 20 20 20 20 20 20 70 45 78 74 72 61            pExtra
6e10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
6e20: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
6e30: 20 70 45 78 74 72 61 2c 20 70 4e 65 77 29 3b 0a   pExtra, pNew);.
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
6e60: 20 20 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d            pSort-
6e70: 3e 61 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e  >aDefer[nDefer].
6e80: 70 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 70 54  pTab = pExpr->pT
6e90: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
6ea0: 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 6e 44  pSort->aDefer[nD
6eb0: 65 66 65 72 5d 2e 69 43 73 72 20 3d 20 70 45 78  efer].iCsr = pEx
6ec0: 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pr->iTable;.    
6ed0: 20 20 20 20 20 20 20 20 70 53 6f 72 74 2d 3e 61          pSort->a
6ee0: 44 65 66 65 72 5b 6e 44 65 66 65 72 5d 2e 6e 4b  Defer[nDefer].nK
6ef0: 65 79 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 20  ey = nKey;.     
6f00: 20 20 20 20 20 20 20 6e 44 65 66 65 72 2b 2b 3b         nDefer++;
6f10: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6f20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
6f30: 49 74 65 6d 2d 3e 62 53 6f 72 74 65 72 52 65 66  Item->bSorterRef
6f40: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
6f50: 20 20 7d 0a 20 20 7d 0a 20 20 70 53 6f 72 74 2d    }.  }.  pSort-
6f60: 3e 6e 44 65 66 65 72 20 3d 20 28 75 38 29 6e 44  >nDefer = (u8)nD
6f70: 65 66 65 72 3b 0a 20 20 2a 70 70 45 78 74 72 61  efer;.  *ppExtra
6f80: 20 3d 20 70 45 78 74 72 61 3b 0a 7d 0a 23 65 6e   = pExtra;.}.#en
6f90: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
6fa0: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
6fb0: 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74  s the code for t
6fc0: 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65  he inside of the
6fd0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f   inner loop.** o
6fe0: 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a  f a SELECT..**.*
6ff0: 2a 20 49 66 20 73 72 63 54 61 62 20 69 73 20 6e  * If srcTab is n
7000: 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68  egative, then th
7010: 65 20 70 2d 3e 70 45 4c 69 73 74 20 65 78 70 72  e p->pEList expr
7020: 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65  essions.** are e
7030: 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65  valuated in orde
7040: 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74  r to get the dat
7050: 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20  a for this row. 
7060: 20 49 66 20 73 72 63 54 61 62 20 69 73 0a 2a 2a   If srcTab is.**
7070: 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74   zero or more, t
7080: 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c  hen data is pull
7090: 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61  ed from srcTab a
70a0: 6e 64 20 70 2d 3e 70 45 4c 69 73 74 20 69 73 20  nd p->pEList is 
70b0: 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f  used only .** to
70c0: 20 67 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   get the number 
70d0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74  of columns and t
70e0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
70f0: 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63  uence for each c
7100: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  olumn..*/.static
7110: 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65   void selectInne
7120: 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a  rLoop(.  Parse *
7130: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
7140: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
7150: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
7160: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
7170: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
7180: 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  ete select state
7190: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
71a0: 20 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62   */.  int srcTab
71b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
71c0: 20 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20   Pull data from 
71d0: 74 68 69 73 20 74 61 62 6c 65 20 69 66 20 6e 6f  this table if no
71e0: 6e 2d 6e 65 67 61 74 69 76 65 20 2a 2f 0a 20 20  n-negative */.  
71f0: 53 6f 72 74 43 74 78 20 2a 70 53 6f 72 74 2c 20  SortCtx *pSort, 
7200: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
7210: 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20  t NULL, info on 
7220: 68 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 4f  how to process O
7230: 52 44 45 52 20 42 59 20 2a 2f 0a 20 20 44 69 73  RDER BY */.  Dis
7240: 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73 74 69  tinctCtx *pDisti
7250: 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74 20 4e  nct, /* If not N
7260: 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68 6f 77  ULL, info on how
7270: 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49 53 54   to process DIST
7280: 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65 63 74  INCT */.  Select
7290: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20  Dest *pDest,    
72a0: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
72b0: 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ose of the resul
72c0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  ts */.  int iCon
72d0: 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20 20 20  tinue,          
72e0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
72f0: 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e 65  continue with ne
7300: 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20  xt row */.  int 
7310: 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
7320: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
7330: 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
7340: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20   the inner loop 
7350: 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
7360: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
7370: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
7380: 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20 20 20  hasDistinct;    
7390: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
73a0: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
73b0: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
73c0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73  nt */.  int eDes
73d0: 74 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74  t = pDest->eDest
73e0: 3b 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69  ;   /* How to di
73f0: 73 70 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73  spose of results
7400: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20   */.  int iParm 
7410: 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  = pDest->iSDParm
7420: 3b 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d  ; /* First argum
7430: 65 6e 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20  ent to disposal 
7440: 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20  method */.  int 
7450: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20  nResultCol;     
7460: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7470: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
7480: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 72  mns */.  int nPr
7490: 65 66 69 78 52 65 67 20 3d 20 30 3b 20 20 20 20  efixReg = 0;    
74a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
74b0: 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
74c0: 73 20 62 65 66 6f 72 65 20 72 65 67 52 65 73 75  s before regResu
74d0: 6c 74 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 75 61  lt */..  /* Usua
74e0: 6c 6c 79 2c 20 72 65 67 52 65 73 75 6c 74 20 69  lly, regResult i
74f0: 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c  s the first cell
7500: 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20   in an array of 
7510: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 0a 20 20 2a  memory cells.  *
7520: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
7530: 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 20   current result 
7540: 72 6f 77 2e 20 49 6e 20 74 68 69 73 20 63 61 73  row. In this cas
7550: 65 20 72 65 67 4f 72 69 67 20 69 73 20 73 65 74  e regOrig is set
7560: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d   to the.  ** sam
7570: 65 20 76 61 6c 75 65 2e 20 48 6f 77 65 76 65 72  e value. However
7580: 2c 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 73  , if the results
7590: 20 61 72 65 20 62 65 69 6e 67 20 73 65 6e 74 20   are being sent 
75a0: 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2c 20 74  to the sorter, t
75b0: 68 65 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 66  he.  ** values f
75c0: 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  or any expressio
75d0: 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f  ns that are also
75e0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 6f 72   part of the sor
75f0: 74 2d 6b 65 79 20 61 72 65 20 6f 6d 69 74 74 65  t-key are omitte
7600: 64 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 69 73  d.  ** from this
7610: 20 61 72 72 61 79 2e 20 49 6e 20 74 68 69 73 20   array. In this 
7620: 63 61 73 65 20 72 65 67 4f 72 69 67 20 69 73 20  case regOrig is 
7630: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 2a 2f  set to zero.  */
7640: 0a 20 20 69 6e 74 20 72 65 67 52 65 73 75 6c 74  .  int regResult
7650: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7660: 2a 20 53 74 61 72 74 20 6f 66 20 6d 65 6d 6f 72  * Start of memor
7670: 79 20 68 6f 6c 64 69 6e 67 20 63 75 72 72 65 6e  y holding curren
7680: 74 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  t results */.  i
7690: 6e 74 20 72 65 67 4f 72 69 67 3b 20 20 20 20 20  nt regOrig;     
76a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
76b0: 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f  art of memory ho
76c0: 6c 64 69 6e 67 20 66 75 6c 6c 20 72 65 73 75 6c  lding full resul
76d0: 74 20 28 6f 72 20 30 29 20 2a 2f 0a 0a 20 20 61  t (or 0) */..  a
76e0: 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 61 73  ssert( v );.  as
76f0: 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21  sert( p->pEList!
7700: 3d 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69  =0 );.  hasDisti
7710: 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20  nct = pDistinct 
7720: 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ? pDistinct->eTn
7730: 63 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44  ctType : WHERE_D
7740: 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20  ISTINCT_NOOP;.  
7750: 69 66 28 20 70 53 6f 72 74 20 26 26 20 70 53 6f  if( pSort && pSo
7760: 72 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  rt->pOrderBy==0 
7770: 29 20 70 53 6f 72 74 20 3d 20 30 3b 0a 20 20 69  ) pSort = 0;.  i
7780: 66 28 20 70 53 6f 72 74 3d 3d 30 20 26 26 20 21  f( pSort==0 && !
7790: 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  hasDistinct ){. 
77a0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6e 74     assert( iCont
77b0: 69 6e 75 65 21 3d 30 20 29 3b 0a 20 20 20 20 63  inue!=0 );.    c
77c0: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
77d0: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
77e0: 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  ue);.  }..  /* P
77f0: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
7800: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
7810: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70    nResultCol = p
7820: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
7830: 0a 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69  ..  if( pDest->i
7840: 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Sdst==0 ){.    i
7850: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
7860: 20 20 6e 50 72 65 66 69 78 52 65 67 20 3d 20 70    nPrefixReg = p
7870: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
7880: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  nExpr;.      if(
7890: 20 21 28 70 53 6f 72 74 2d 3e 73 6f 72 74 46 6c   !(pSort->sortFl
78a0: 61 67 73 20 26 20 53 4f 52 54 46 4c 41 47 5f 55  ags & SORTFLAG_U
78b0: 73 65 53 6f 72 74 65 72 29 20 29 20 6e 50 72 65  seSorter) ) nPre
78c0: 66 69 78 52 65 67 2b 2b 3b 0a 20 20 20 20 20 20  fixReg++;.      
78d0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20  pParse->nMem += 
78e0: 6e 50 72 65 66 69 78 52 65 67 3b 0a 20 20 20 20  nPrefixReg;.    
78f0: 7d 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64  }.    pDest->iSd
7900: 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  st = pParse->nMe
7910: 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
7920: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
7930: 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Col;.  }else if(
7940: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e 52   pDest->iSdst+nR
7950: 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72 73  esultCol > pPars
7960: 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 2f  e->nMem ){.    /
7970: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72 72  * This is an err
7980: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68 61  or condition tha
7990: 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66 6f  t can result, fo
79a0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
79b0: 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  a SELECT.    ** 
79c0: 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
79d0: 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e 53  d side of an INS
79e0: 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72  ERT contains mor
79f0: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  e result columns
7a00: 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68 65   than.    ** the
7a10: 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20 69  re are columns i
7a20: 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  n the table on t
7a30: 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65 72  he left.  The er
7a40: 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75 67  ror will be caug
7a50: 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  ht.    ** and re
7a60: 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20 42  ported later.  B
7a70: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d 61  ut we need to ma
7a80: 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20 6d  ke sure enough m
7a90: 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61 74  emory is allocat
7aa0: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f  ed.    ** to avo
7ab0: 69 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f 75  id other spuriou
7ac0: 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65 20  s errors in the 
7ad0: 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20 20  meantime. */.   
7ae0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
7af0: 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d   nResultCol;.  }
7b00: 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20  .  pDest->nSdst 
7b10: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
7b20: 72 65 67 4f 72 69 67 20 3d 20 72 65 67 52 65 73  regOrig = regRes
7b30: 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69 53 64  ult = pDest->iSd
7b40: 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54 61 62  st;.  if( srcTab
7b50: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
7b60: 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  =0; i<nResultCol
7b70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
7b80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7b90: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
7ba0: 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75  cTab, i, regResu
7bb0: 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56 64 62  lt+i);.      Vdb
7bc0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
7bd0: 22 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  ", p->pEList->a[
7be0: 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  i].zName));.    
7bf0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44  }.  }else if( eD
7c00: 65 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20  est!=SRT_Exists 
7c10: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
7c20: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
7c30: 45 46 45 52 45 4e 43 45 53 0a 20 20 20 20 45 78  EFERENCES.    Ex
7c40: 70 72 4c 69 73 74 20 2a 70 45 78 74 72 61 20 3d  prList *pExtra =
7c50: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f   0;.#endif.    /
7c60: 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61  * If the destina
7c70: 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54  tion is an EXIST
7c80: 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f  S(...) expressio
7c90: 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20  n, the actual.  
7ca0: 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75    ** values retu
7cb0: 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45  rned by the SELE
7cc0: 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69  CT are not requi
7cd0: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
7ce0: 75 38 20 65 63 65 6c 46 6c 61 67 73 3b 0a 20 20  u8 ecelFlags;.  
7cf0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
7d00: 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74 3d 3d 53  _Mem || eDest==S
7d10: 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65  RT_Output || eDe
7d20: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
7d30: 65 20 29 7b 0a 20 20 20 20 20 20 65 63 65 6c 46  e ){.      ecelF
7d40: 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 45 43  lags = SQLITE_EC
7d50: 45 4c 5f 44 55 50 3b 0a 20 20 20 20 7d 65 6c 73  EL_DUP;.    }els
7d60: 65 7b 0a 20 20 20 20 20 20 65 63 65 6c 46 6c 61  e{.      ecelFla
7d70: 67 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  gs = 0;.    }.  
7d80: 20 20 69 66 28 20 70 53 6f 72 74 20 26 26 20 68    if( pSort && h
7d90: 61 73 44 69 73 74 69 6e 63 74 3d 3d 30 20 26 26  asDistinct==0 &&
7da0: 20 65 44 65 73 74 21 3d 53 52 54 5f 45 70 68 65   eDest!=SRT_Ephe
7db0: 6d 54 61 62 20 26 26 20 65 44 65 73 74 21 3d 53  mTab && eDest!=S
7dc0: 52 54 5f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  RT_Table ){.    
7dd0: 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 65 78    /* For each ex
7de0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 70 2d 3e 70  pression in p->p
7df0: 45 4c 69 73 74 20 74 68 61 74 20 69 73 20 61 20  EList that is a 
7e00: 63 6f 70 79 20 6f 66 20 61 6e 20 65 78 70 72 65  copy of an expre
7e10: 73 73 69 6f 6e 20 69 6e 0a 20 20 20 20 20 20 2a  ssion in.      *
7e20: 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
7e30: 6c 61 75 73 65 20 28 70 53 6f 72 74 2d 3e 70 4f  lause (pSort->pO
7e40: 72 64 65 72 42 79 29 2c 20 73 65 74 20 74 68 65  rderBy), set the
7e50: 20 61 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20   associated .   
7e60: 20 20 20 2a 2a 20 69 4f 72 64 65 72 42 79 43 6f     ** iOrderByCo
7e70: 6c 20 76 61 6c 75 65 20 74 6f 20 6f 6e 65 20 6d  l value to one m
7e80: 6f 72 65 20 74 68 61 6e 20 74 68 65 20 69 6e 64  ore than the ind
7e90: 65 78 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ex of the ORDER 
7ea0: 42 59 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  BY .      ** exp
7eb0: 72 65 73 73 69 6f 6e 20 77 69 74 68 69 6e 20 74  ression within t
7ec0: 68 65 20 73 6f 72 74 2d 6b 65 79 20 74 68 61 74  he sort-key that
7ed0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
7ee0: 29 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e  ) will generate.
7ef0: 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 61  .      ** This a
7f00: 6c 6c 6f 77 73 20 74 68 65 20 70 2d 3e 70 45 4c  llows the p->pEL
7f10: 69 73 74 20 66 69 65 6c 64 20 74 6f 20 62 65 20  ist field to be 
7f20: 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65  omitted from the
7f30: 20 73 6f 72 74 65 64 20 72 65 63 6f 72 64 2c 0a   sorted record,.
7f40: 20 20 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20        ** saving 
7f50: 73 70 61 63 65 20 61 6e 64 20 43 50 55 20 63 79  space and CPU cy
7f60: 63 6c 65 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  cles.  */.      
7f70: 65 63 65 6c 46 6c 61 67 73 20 7c 3d 20 28 53 51  ecelFlags |= (SQ
7f80: 4c 49 54 45 5f 45 43 45 4c 5f 4f 4d 49 54 52 45  LITE_ECEL_OMITRE
7f90: 46 7c 53 51 4c 49 54 45 5f 45 43 45 4c 5f 52 45  F|SQLITE_ECEL_RE
7fa0: 46 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  F);.      for(i=
7fb0: 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b 20 69  pSort->nOBSat; i
7fc0: 3c 70 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79  <pSort->pOrderBy
7fd0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
7fe0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
7ff0: 20 20 20 20 20 20 69 66 28 20 28 6a 20 3d 20 70        if( (j = p
8000: 53 6f 72 74 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Sort->pOrderBy->
8010: 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42  a[i].u.x.iOrderB
8020: 79 43 6f 6c 29 3e 30 20 29 7b 0a 20 20 20 20 20  yCol)>0 ){.     
8030: 20 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 2d 3e       p->pEList->
8040: 61 5b 6a 2d 31 5d 2e 75 2e 78 2e 69 4f 72 64 65  a[j-1].u.x.iOrde
8050: 72 42 79 43 6f 6c 20 3d 20 69 2b 31 2d 70 53 6f  rByCol = i+1-pSo
8060: 72 74 2d 3e 6e 4f 42 53 61 74 3b 0a 20 20 20 20  rt->nOBSat;.    
8070: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
8080: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8090: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
80a0: 4e 43 45 53 0a 20 20 20 20 20 20 73 65 6c 65 63  NCES.      selec
80b0: 74 45 78 70 72 44 65 66 65 72 28 70 50 61 72 73  tExprDefer(pPars
80c0: 65 2c 20 70 53 6f 72 74 2c 20 70 2d 3e 70 45 4c  e, pSort, p->pEL
80d0: 69 73 74 2c 20 26 70 45 78 74 72 61 29 3b 0a 20  ist, &pExtra);. 
80e0: 20 20 20 20 20 69 66 28 20 70 45 78 74 72 61 20       if( pExtra 
80f0: 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  && pParse->db->m
8100: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
8110: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
8120: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 65 78  there are any ex
8130: 74 72 61 20 50 4b 20 63 6f 6c 75 6d 6e 73 20 74  tra PK columns t
8140: 6f 20 61 64 64 20 74 6f 20 74 68 65 20 73 6f 72  o add to the sor
8150: 74 65 72 20 72 65 63 6f 72 64 73 2c 0a 20 20 20  ter records,.   
8160: 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
8170: 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 63 65   extra memory ce
8180: 6c 6c 73 20 61 6e 64 20 61 64 6a 75 73 74 20 74  lls and adjust t
8190: 68 65 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  he OpenEphemeral
81a0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73   .        ** ins
81b0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 61 63 63 6f  truction to acco
81c0: 75 6e 74 20 66 6f 72 20 74 68 65 20 6c 61 72 67  unt for the larg
81d0: 65 72 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73  er records. This
81e0: 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20 20 20 20   is only.       
81f0: 20 2a 2a 20 72 65 71 75 69 72 65 64 20 69 66 20   ** required if 
8200: 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72  there are one or
8210: 20 6d 6f 72 65 20 57 49 54 48 4f 55 54 20 52 4f   more WITHOUT RO
8220: 57 49 44 20 74 61 62 6c 65 73 20 77 69 74 68 0a  WID tables with.
8230: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6f          ** compo
8240: 73 69 74 65 20 70 72 69 6d 61 72 79 20 6b 65 79  site primary key
8250: 73 20 69 6e 20 74 68 65 20 53 6f 72 74 43 74 78  s in the SortCtx
8260: 2e 61 44 65 66 65 72 5b 5d 20 61 72 72 61 79 2e  .aDefer[] array.
8270: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 56 64 62    */.        Vdb
8280: 65 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74  eOp *pOp = sqlit
8290: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
82a0: 53 6f 72 74 2d 3e 61 64 64 72 53 6f 72 74 49 6e  Sort->addrSortIn
82b0: 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  dex);.        pO
82c0: 70 2d 3e 70 32 20 2b 3d 20 28 70 45 78 74 72 61  p->p2 += (pExtra
82d0: 2d 3e 6e 45 78 70 72 20 2d 20 70 53 6f 72 74 2d  ->nExpr - pSort-
82e0: 3e 6e 44 65 66 65 72 29 3b 0a 20 20 20 20 20 20  >nDefer);.      
82f0: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
8300: 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 2b 3d  fo->nAllField +=
8310: 20 28 70 45 78 74 72 61 2d 3e 6e 45 78 70 72 20   (pExtra->nExpr 
8320: 2d 20 70 53 6f 72 74 2d 3e 6e 44 65 66 65 72 29  - pSort->nDefer)
8330: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
8340: 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 45 78 74 72 61  ->nMem += pExtra
8350: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 7d  ->nExpr;.      }
8360: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
8370: 67 4f 72 69 67 20 3d 20 30 3b 0a 20 20 20 20 20  gOrig = 0;.     
8380: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
8390: 53 52 54 5f 53 65 74 20 7c 7c 20 65 44 65 73 74  SRT_Set || eDest
83a0: 3d 3d 53 52 54 5f 4d 65 6d 20 0a 20 20 20 20 20  ==SRT_Mem .     
83b0: 20 20 20 20 20 20 7c 7c 20 65 44 65 73 74 3d 3d        || eDest==
83c0: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 7c 7c  SRT_Coroutine ||
83d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
83e0: 75 74 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ut );.    }.    
83f0: 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 73 71 6c  nResultCol = sql
8400: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
8410: 4c 69 73 74 28 70 50 61 72 73 65 2c 70 2d 3e 70  List(pParse,p->p
8420: 45 4c 69 73 74 2c 72 65 67 52 65 73 75 6c 74 2c  EList,regResult,
8430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8450: 20 20 20 20 20 20 20 20 20 20 30 2c 65 63 65 6c            0,ecel
8460: 46 6c 61 67 73 29 3b 0a 23 69 66 64 65 66 20 53  Flags);.#ifdef S
8470: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52  QLITE_ENABLE_SOR
8480: 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20  TER_REFERENCES. 
8490: 20 20 20 69 66 28 20 70 45 78 74 72 61 20 29 7b     if( pExtra ){
84a0: 0a 20 20 20 20 20 20 6e 52 65 73 75 6c 74 43 6f  .      nResultCo
84b0: 6c 20 2b 3d 20 73 71 6c 69 74 65 33 45 78 70 72  l += sqlite3Expr
84c0: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20  CodeExprList(.  
84d0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
84e0: 70 45 78 74 72 61 2c 20 72 65 67 52 65 73 75 6c  pExtra, regResul
84f0: 74 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  t + nResultCol, 
8500: 30 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  0, 0.      );.  
8510: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
8520: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
8530: 2d 3e 64 62 2c 20 70 45 78 74 72 61 29 3b 0a 20  ->db, pExtra);. 
8540: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
8550: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44 49 53  .  /* If the DIS
8560: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 77 61  TINCT keyword wa
8570: 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74 68 65  s present on the
8580: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
8590: 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69 73 20  t.  ** and this 
85a0: 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73 65 65  row has been see
85b0: 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e 20 64  n before, then d
85c0: 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69 73 20  o not make this 
85d0: 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20 6f 66  row.  ** part of
85e0: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
85f0: 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73 74 69  /.  if( hasDisti
8600: 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69 74 63  nct ){.    switc
8610: 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54  h( pDistinct->eT
8620: 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20 20 20  nctType ){.     
8630: 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
8640: 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20 7b 0a  INCT_ORDERED: {.
8650: 20 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a          VdbeOp *
8660: 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  pOp;            
8670: 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72 65 71  /* No longer req
8680: 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65 6d 65  uired OpenEpheme
8690: 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a 20 20  ral instr. */.  
86a0: 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d 70 3b        int iJump;
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
86c0: 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   Jump destinatio
86d0: 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  n */.        int
86e0: 20 72 65 67 50 72 65 76 3b 20 20 20 20 20 20 20   regPrev;       
86f0: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
8700: 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a   row content */.
8710: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f  .        /* Allo
8720: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
8730: 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20  he previous row 
8740: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67 50 72  */.        regPr
8750: 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ev = pParse->nMe
8760: 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  m+1;.        pPa
8770: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
8780: 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20 20 20  sultCol;..      
8790: 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20    /* Change the 
87a0: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
87b0: 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20 74   coded earlier t
87c0: 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20  o an OP_Null.   
87d0: 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65       ** sets the
87e0: 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69 74   MEM_Cleared bit
87f0: 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72 65   on the first re
8800: 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20 20  gister of the.  
8810: 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
8820: 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20 77  s value.  This w
8830: 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f 50  ill cause the OP
8840: 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c 77  _Ne below to alw
8850: 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  ays.        ** f
8860: 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73 74  ail on the first
8870: 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
8880: 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20 74  e loop even if t
8890: 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 20  he first.       
88a0: 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20 4e   ** row is all N
88b0: 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ULLs..        */
88c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
88d0: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
88e0: 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61  (v, pDistinct->a
88f0: 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20  ddrTnct);.      
8900: 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
8910: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69 73  dbeGetOp(v, pDis
8920: 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29  tinct->addrTnct)
8930: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f  ;.        pOp->o
8940: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b  pcode = OP_Null;
8950: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31  .        pOp->p1
8960: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 1;.        pO
8970: 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76 3b  p->p2 = regPrev;
8980: 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70 20  ..        iJump 
8990: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
89a0: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e 52  rentAddr(v) + nR
89b0: 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 20 20  esultCol;.      
89c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
89d0: 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  sultCol; i++){. 
89e0: 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71           CollSeq
89f0: 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65   *pColl = sqlite
8a00: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
8a10: 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  rse, p->pEList->
8a20: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
8a30: 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65         if( i<nRe
8a40: 73 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20  sultCol-1 ){.   
8a50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8a60: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8a70: 5f 4e 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  _Ne, regResult+i
8a80: 2c 20 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76  , iJump, regPrev
8a90: 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +i);.           
8aa0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
8ab0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
8ac0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
8ad0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8ae0: 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67 52 65  (v, OP_Eq, regRe
8af0: 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69 6e 75  sult+i, iContinu
8b00: 65 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20  e, regPrev+i);. 
8b10: 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
8b20: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
8b30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8b40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
8b50: 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63  angeP4(v, -1, (c
8b60: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c  onst char *)pCol
8b70: 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
8b80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8b90: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
8ba0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b   SQLITE_NULLEQ);
8bb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8bc0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
8bd0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
8be0: 72 28 76 29 3d 3d 69 4a 75 6d 70 20 7c 7c 20 70  r(v)==iJump || p
8bf0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
8c00: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
8c10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8c20: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp3(v, OP_Copy,
8c30: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50   regResult, regP
8c40: 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d  rev, nResultCol-
8c50: 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  1);.        brea
8c60: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
8c70: 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53    case WHERE_DIS
8c80: 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a  TINCT_UNIQUE: {.
8c90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8ca0: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
8cb0: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
8cc0: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
8cd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
8ce0: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
8cf0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
8d00: 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ( pDistinct->eTn
8d10: 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49  ctType==WHERE_DI
8d20: 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
8d30: 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   );.        code
8d40: 44 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c  Distinct(pParse,
8d50: 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54   pDistinct->tabT
8d60: 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  nct, iContinue, 
8d70: 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20  nResultCol,.    
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d90: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
8da0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8db0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
8dc0: 28 20 70 53 6f 72 74 3d 3d 30 20 29 7b 0a 20 20  ( pSort==0 ){.  
8dd0: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
8de0: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
8df0: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
8e00: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
8e10: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
8e20: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
8e30: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
8e40: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
8e50: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
8e60: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
8e70: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  arm..    */.#ifn
8e80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8e90: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
8ea0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
8eb0: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  on: {.      int 
8ec0: 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  r1;.      r1 = s
8ed0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
8ee0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
8ef0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8f00: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
8f10: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
8f20: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a  ResultCol, r1);.
8f30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8f40: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
8f50: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
8f60: 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75 6c 74  m, r1, regResult
8f70: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
8f80: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
8f90: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
8fa0: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
8fb0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
8fc0: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
8fd0: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
8fe0: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
8ff0: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
9000: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
9010: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
9020: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
9030: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
9040: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
9050: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
9060: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
9070: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
9080: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9090: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
90a0: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
90b0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
90c0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  tCol);.      bre
90d0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
90e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
90f0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
9100: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65  */..    /* Store
9110: 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64   the result as d
9120: 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71  ata using a uniq
9130: 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20  ue key..    */. 
9140: 20 20 20 63 61 73 65 20 53 52 54 5f 46 69 66 6f     case SRT_Fifo
9150: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 44  :.    case SRT_D
9160: 69 73 74 46 69 66 6f 3a 0a 20 20 20 20 63 61 73  istFifo:.    cas
9170: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
9180: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
9190: 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
91a0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
91b0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
91c0: 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b 0a   nPrefixReg+1);.
91d0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
91e0: 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
91f0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
9200: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45  se( eDest==SRT_E
9210: 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
9220: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
9230: 3d 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a 20 20  ==SRT_Fifo );.  
9240: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
9250: 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 46 69 66  est==SRT_DistFif
9260: 6f 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  o );.      sqlit
9270: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
9280: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
9290: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
92a0: 74 43 6f 6c 2c 20 72 31 2b 6e 50 72 65 66 69 78  tCol, r1+nPrefix
92b0: 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Reg);.#ifndef SQ
92c0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
92d0: 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53      if( eDest==S
92e0: 52 54 5f 44 69 73 74 46 69 66 6f 20 29 7b 0a 20  RT_DistFifo ){. 
92f0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
9300: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
9310: 44 69 73 74 46 69 66 6f 2c 20 74 68 65 6e 20 63  DistFifo, then c
9320: 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29 20  ursor (iParm+1) 
9330: 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20  is open.        
9340: 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65 72  ** on an ephemer
9350: 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65  al index. If the
9360: 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20   current row is 
9370: 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 0a  already present.
9380: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
9390: 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74 20  e index, do not 
93a0: 77 72 69 74 65 20 69 74 20 74 6f 20 74 68 65 20  write it to the 
93b0: 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c 20  output. If not, 
93c0: 61 64 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  add the.        
93d0: 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 20 74  ** current row t
93e0: 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  o the index and 
93f0: 70 72 6f 63 65 65 64 20 77 69 74 68 20 77 72 69  proceed with wri
9400: 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65 0a 20  ting it to the. 
9410: 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75 74         ** output
9420: 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e 20   table as well. 
9430: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
9440: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
9450: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
9460: 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 73 71   + 4;.        sq
9470: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
9480: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
9490: 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72  iParm+1, addr, r
94a0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 56  1, 0);.        V
94b0: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
94c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
94d0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
94e0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
94f0: 61 72 6d 2b 31 2c 20 72 31 2c 72 65 67 52 65 73  arm+1, r1,regRes
9500: 75 6c 74 2c 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  ult,nResultCol);
9510: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9520: 20 70 53 6f 72 74 3d 3d 30 20 29 3b 0a 20 20 20   pSort==0 );.   
9530: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
9540: 20 20 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20    if( pSort ){. 
9550: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
9560: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 53  orter(pParse, pS
9570: 6f 72 74 2c 20 70 2c 20 72 31 2b 6e 50 72 65 66  ort, p, r1+nPref
9580: 69 78 52 65 67 2c 72 65 67 52 65 73 75 6c 74 2c  ixReg,regResult,
9590: 31 2c 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20  1,nPrefixReg);. 
95a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
95b0: 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c      int r2 = sql
95c0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
95d0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
95e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
95f0: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
9600: 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20  , iParm, r2);.  
9610: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9620: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
9630: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c  sert, iParm, r1,
9640: 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r2);.        sq
9650: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
9660: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
9670: 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ND);.        sql
9680: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
9690: 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
96a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
96b0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
96c0: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 31  Range(pParse, r1
96d0: 2c 20 6e 50 72 65 66 69 78 52 65 67 2b 31 29 3b  , nPrefixReg+1);
96e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
96f0: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
9700: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
9710: 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  Y.    /* If we a
9720: 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65  re creating a se
9730: 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49  t for an "expr I
9740: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
9750: 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a  construct,.    *
9760: 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f  * then there sho
9770: 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20  uld be a single 
9780: 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63  item on the stac
9790: 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20  k.  Write this. 
97a0: 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20     ** item into 
97b0: 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69  the set table wi
97c0: 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20  th bogus data.. 
97d0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
97e0: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
97f0: 69 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20  if( pSort ){.   
9800: 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74       /* At first
9810: 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c   glance you woul
9820: 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64  d think we could
9830: 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68   optimize out th
9840: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44  e.        ** ORD
9850: 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61  ER BY in this ca
9860: 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64  se since the ord
9870: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
9880: 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20   the set.       
9890: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   ** does not mat
98a0: 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20  ter.  But there 
98b0: 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54  might be a LIMIT
98c0: 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63   clause, in whic
98d0: 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73  h.        ** cas
98e0: 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73  e the order does
98f0: 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20   matter */.     
9900: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
9910: 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r(.            p
9920: 50 61 72 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c  Parse, pSort, p,
9930: 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65 67 4f   regResult, regO
9940: 72 69 67 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  rig, nResultCol,
9950: 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a 20 20   nPrefixReg);.  
9960: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9970: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
9980: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
9990: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61  arse);.        a
99a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 74  ssert( sqlite3St
99b0: 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41  rlen30(pDest->zA
99c0: 66 66 53 64 73 74 29 3d 3d 6e 52 65 73 75 6c 74  ffSdst)==nResult
99d0: 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 73  Col );.        s
99e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
99f0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
9a00: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
9a10: 65 73 75 6c 74 43 6f 6c 2c 20 0a 20 20 20 20 20  esultCol, .     
9a20: 20 20 20 20 20 20 20 72 31 2c 20 70 44 65 73 74         r1, pDest
9a30: 2d 3e 7a 41 66 66 53 64 73 74 2c 20 6e 52 65 73  ->zAffSdst, nRes
9a40: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
9a50: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
9a60: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
9a70: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
9a80: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
9a90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9aa0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
9ab0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
9ac0: 61 72 6d 2c 20 72 31 2c 20 72 65 67 52 65 73 75  arm, r1, regResu
9ad0: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
9ae0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9af0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
9b00: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
9b10: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
9b20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
9b30: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
9b40: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
9b50: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
9b60: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
9b70: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
9b80: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
9b90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9ba0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
9bb0: 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20  er, 1, iParm);. 
9bc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
9bd0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
9be0: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
9bf0: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
9c00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
9c10: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
9c20: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
9c30: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
9c40: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
9c50: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
9c60: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
9c70: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
9c80: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6f 72 20   memory cell or 
9c90: 61 72 72 61 79 20 6f 66 20 0a 20 20 20 20 2a 2a  array of .    **
9ca0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 6e   memory cells an
9cb0: 64 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  d break out of t
9cc0: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
9cd0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
9ce0: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 69  T_Mem: {.      i
9cf0: 66 28 20 70 53 6f 72 74 20 29 7b 0a 20 20 20 20  f( pSort ){.    
9d00: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
9d10: 75 6c 74 43 6f 6c 3c 3d 70 44 65 73 74 2d 3e 6e  ultCol<=pDest->n
9d20: 53 64 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Sdst );.        
9d30: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a  pushOntoSorter(.
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
9d50: 73 65 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65  se, pSort, p, re
9d60: 67 52 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67  gResult, regOrig
9d70: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 6e 50  , nResultCol, nP
9d80: 72 65 66 69 78 52 65 67 29 3b 0a 20 20 20 20 20  refixReg);.     
9d90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9da0: 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43  assert( nResultC
9db0: 6f 6c 3d 3d 70 44 65 73 74 2d 3e 6e 53 64 73 74  ol==pDest->nSdst
9dc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
9dd0: 72 74 28 20 72 65 67 52 65 73 75 6c 74 3d 3d 69  rt( regResult==i
9de0: 50 61 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  Parm );.        
9df0: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
9e00: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
9e10: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
9e20: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r us */.      }.
9e30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9e40: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
9e50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9e60: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
9e70: 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
9e80: 74 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53  tine:       /* S
9e90: 65 6e 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f  end data to a co
9ea0: 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  -routine */.    
9eb0: 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a  case SRT_Output:
9ec0: 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74   {        /* Ret
9ed0: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  urn the results 
9ee0: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
9ef0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
9f00: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
9f10: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
9f20: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
9f30: 20 20 20 20 20 20 69 66 28 20 70 53 6f 72 74 20        if( pSort 
9f40: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
9f50: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
9f60: 2c 20 70 53 6f 72 74 2c 20 70 2c 20 72 65 67 52  , pSort, p, regR
9f70: 65 73 75 6c 74 2c 20 72 65 67 4f 72 69 67 2c 20  esult, regOrig, 
9f80: 6e 52 65 73 75 6c 74 43 6f 6c 2c 0a 20 20 20 20  nResultCol,.    
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fa0: 20 20 20 6e 50 72 65 66 69 78 52 65 67 29 3b 0a     nPrefixReg);.
9fb0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
9fc0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
9fd0: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tine ){.        
9fe0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9ff0: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
a000: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
a010: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a020: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a030: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
a040: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
a050: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
a060: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
a070: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
a080: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
a090: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
a0a0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tCol);.      }. 
a0b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a0c0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
a0d0: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f  E_OMIT_CTE.    /
a0e0: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75  * Write the resu
a0f0: 6c 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72  lts into a prior
a100: 69 74 79 20 71 75 65 75 65 20 74 68 61 74 20 69  ity queue that i
a110: 73 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e  s order accordin
a120: 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73  g to.    ** pDes
a130: 74 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20  t->pOrderBy (in 
a140: 70 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53  pSO).  pDest->iS
a150: 44 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29  DParm (in iParm)
a160: 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66   is the cursor f
a170: 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64  or an.    ** ind
a180: 65 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78  ex with pSO->nEx
a190: 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42  pr+2 columns.  B
a1a0: 75 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67  uild a key using
a1b0: 20 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72   pSO for the fir
a1c0: 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e  st.    ** pSO->n
a1d0: 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  Expr columns, th
a1e0: 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  en make sure all
a1f0: 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65   keys are unique
a200: 20 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20   by adding a.   
a210: 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71   ** final OP_Seq
a220: 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54  uence column.  T
a230: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
a240: 73 20 74 68 65 20 72 65 63 6f 72 64 20 61 73 20  s the record as 
a250: 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  a blob..    */. 
a260: 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74     case SRT_Dist
a270: 51 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20  Queue:.    case 
a280: 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20  SRT_Queue: {.   
a290: 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20     int nKey;.   
a2a0: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
a2b0: 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  3;.      int add
a2c0: 72 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  rTest = 0;.     
a2d0: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a   ExprList *pSO;.
a2e0: 20 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73        pSO = pDes
a2f0: 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  t->pOrderBy;.   
a300: 20 20 20 61 73 73 65 72 74 28 20 70 53 4f 20 29     assert( pSO )
a310: 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70  ;.      nKey = p
a320: 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  SO->nExpr;.     
a330: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
a340: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
a350: 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
a360: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
a370: 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b  pParse, nKey+2);
a380: 0a 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e  .      r3 = r2+n
a390: 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20 69 66 28  Key+1;.      if(
a3a0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
a3b0: 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Queue ){.       
a3c0: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
a3d0: 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75  nation is DistQu
a3e0: 65 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72  eue, then cursor
a3f0: 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70   (iParm+1) is op
a400: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  en.        ** on
a410: 20 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65   a second epheme
a420: 72 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68  ral index that h
a430: 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20  olds all values 
a440: 65 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79  every previously
a450: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65  .        ** adde
a460: 64 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20  d to the queue. 
a470: 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64 72 54  */.        addrT
a480: 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  est = sqlite3Vdb
a490: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
a4a0: 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c  _Found, iParm+1,
a4b0: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   0, .           
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
a4e0: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
a4f0: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  ol);.        Vdb
a500: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
a510: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
a520: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a530: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
a540: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
a550: 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20 20  ltCol, r3);.    
a560: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
a570: 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20 20  _DistQueue ){.  
a580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a590: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
a5a0: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
a5b0: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73  , r3);.        s
a5c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
a5d0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
a5e0: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20  SEEKRESULT);.   
a5f0: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
a600: 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29  =0; i<nKey; i++)
a610: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a620: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
a630: 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20  P_SCopy,.       
a640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a650: 20 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70     regResult + p
a660: 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  SO->a[i].u.x.iOr
a670: 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20  derByCol - 1,.  
a680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a690: 20 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20          r2+i);. 
a6a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
a6b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a6c0: 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69  , OP_Sequence, i
a6d0: 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a  Parm, r2+nKey);.
a6e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a6f0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
a700: 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b  keRecord, r2, nK
a710: 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20  ey+2, r1);.     
a720: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a730: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 49  p4Int(v, OP_IdxI
a740: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
a750: 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20  , r2, nKey+2);. 
a760: 20 20 20 20 20 69 66 28 20 61 64 64 72 54 65 73       if( addrTes
a770: 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  t ) sqlite3VdbeJ
a780: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54  umpHere(v, addrT
a790: 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
a7a0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
a7b0: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
a7c0: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
a7d0: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
a7e0: 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29  rse, r2, nKey+2)
a7f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a800: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
a810: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a  QLITE_OMIT_CTE *
a820: 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  /....#if !define
a830: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
a840: 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69  IGGER).    /* Di
a850: 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c 74  scard the result
a860: 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
a870: 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74   for SELECT stat
a880: 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20  ements inside.  
a890: 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66    ** the body of
a8a0: 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68 65   a TRIGGER.  The
a8b0: 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68   purpose of such
a8c0: 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63   selects is to c
a8d0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d  all.    ** user-
a8e0: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
a8f0: 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64 65  s that have side
a900: 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f   effects.  We do
a910: 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a   not care.    **
a920: 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75 61   about the actua
a930: 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  l results of the
a940: 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   select..    */.
a950: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
a960: 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44 65       assert( eDe
a970: 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20  st==SRT_Discard 
a980: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a990: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
a9a0: 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
a9b0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
a9c0: 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
a9d0: 69 73 20 72 65 61 63 68 65 64 2e 20 20 45 78 63  is reached.  Exc
a9e0: 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65  ept, if.  ** the
a9f0: 72 65 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20  re is a sorter, 
aa00: 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
aa10: 65 20 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72  e sorter has alr
aa20: 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a  eady limited.  *
aa30: 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72  * the output for
aa40: 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   us..  */.  if( 
aa50: 70 53 6f 72 74 3d 3d 30 20 26 26 20 70 2d 3e 69  pSort==0 && p->i
aa60: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
aa70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
aa80: 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
aa90: 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42  o, p->iLimit, iB
aaa0: 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72  reak); VdbeCover
aab0: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  age(v);.  }.}../
aac0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
aad0: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73  KeyInfo object s
aae0: 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e  ufficient for an
aaf0: 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20   index of N key 
ab00: 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58  columns and.** X
ab10: 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a   extra columns..
ab20: 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69  */.KeyInfo *sqli
ab30: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
ab40: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
ab50: 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20 69 6e   N, int X){.  in
ab60: 74 20 6e 45 78 74 72 61 20 3d 20 28 4e 2b 58 29  t nExtra = (N+X)
ab70: 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71  *(sizeof(CollSeq
ab80: 2a 29 2b 31 29 20 2d 20 73 69 7a 65 6f 66 28 43  *)+1) - sizeof(C
ab90: 6f 6c 6c 53 65 71 2a 29 3b 0a 20 20 4b 65 79 49  ollSeq*);.  KeyI
aba0: 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  nfo *p = sqlite3
abb0: 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62  DbMallocRawNN(db
abc0: 2c 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f  , sizeof(KeyInfo
abd0: 29 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  ) + nExtra);.  i
abe0: 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  f( p ){.    p->a
abf0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
ac00: 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b  )&p->aColl[N+X];
ac10: 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 46 69 65 6c  .    p->nKeyFiel
ac20: 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20  d = (u16)N;.    
ac30: 70 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 3d 20 28  p->nAllField = (
ac40: 75 31 36 29 28 4e 2b 58 29 3b 0a 20 20 20 20 70  u16)(N+X);.    p
ac50: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
ac60: 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  .    p->db = db;
ac70: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31  .    p->nRef = 1
ac80: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 5b  ;.    memset(&p[
ac90: 31 5d 2c 20 30 2c 20 6e 45 78 74 72 61 29 3b 0a  1], 0, nExtra);.
aca0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
acb0: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29  ite3OomFault(db)
acc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
acd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
ace0: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
acf0: 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73  object.*/.void s
ad00: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
ad10: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
ad20: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
ad30: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
ad40: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d   );.    p->nRef-
ad50: 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  -;.    if( p->nR
ad60: 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44  ef==0 ) sqlite3D
ad70: 62 46 72 65 65 4e 4e 28 70 2d 3e 64 62 2c 20 70  bFreeNN(p->db, p
ad80: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
ad90: 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69 6e 74  Make a new point
ada0: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
adb0: 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66  object.*/.KeyInf
adc0: 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
add0: 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29  oRef(KeyInfo *p)
ade0: 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  {.  if( p ){.   
adf0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
ae00: 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  >0 );.    p->nRe
ae10: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  f++;.  }.  retur
ae20: 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n p;.}..#ifdef S
ae30: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
ae40: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
ae50: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
ae60: 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 2e  t can be change.
ae70: 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62    The KeyInfo ob
ae80: 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79  ject.** can only
ae90: 20 62 65 20 63 68 61 6e 67 65 64 20 69 66 20 74   be changed if t
aea0: 68 69 73 20 69 73 20 6a 75 73 74 20 61 20 73 69  his is just a si
aeb0: 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65 20 74  ngle reference t
aec0: 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a  o the object..**
aed0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
aee0: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e   is used only in
aef0: 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28 29  side of assert()
af00: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
af10: 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  int sqlite3KeyIn
af20: 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 4b 65  foIsWriteable(Ke
af30: 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74 75 72  yInfo *p){ retur
af40: 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a  n p->nRef==1; }.
af50: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
af60: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
af70: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
af80: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
af90: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
afa0: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
afb0: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
afc0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
afd0: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
afe0: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
aff0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
b000: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
b010: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
b020: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
b030: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
b040: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
b050: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
b060: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
b070: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
b080: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
b090: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
b0a0: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
b0b0: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
b0c0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
b0d0: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
b0e0: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
b0f0: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
b100: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
b110: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
b120: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
b130: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
b140: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
b150: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
b160: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
b170: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
b180: 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63  m malloc.  The c
b190: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
b1a0: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
b1b0: 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61  e for seeing tha
b1c0: 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
b1d0: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
b1e0: 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  * freed..*/.stat
b1f0: 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49  ic KeyInfo *keyI
b200: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
b210: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b220: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
b230: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
b240: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
b250: 20 20 20 20 20 2f 2a 20 46 6f 72 6d 20 74 68 65       /* Form the
b260: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
b270: 66 72 6f 6d 20 74 68 69 73 20 45 78 70 72 4c 69  from this ExprLi
b280: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  st */.  int iSta
b290: 72 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  rt,          /* 
b2a0: 42 65 67 69 6e 20 77 69 74 68 20 74 68 69 73 20  Begin with this 
b2b0: 63 6f 6c 75 6d 6e 20 6f 66 20 70 4c 69 73 74 20  column of pList 
b2c0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  */.  int nExtra 
b2d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
b2e0: 20 74 68 69 73 20 6d 61 6e 79 20 65 78 74 72 61   this many extra
b2f0: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
b300: 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  end */.){.  int 
b310: 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f  nExpr;.  KeyInfo
b320: 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   *pInfo;.  struc
b330: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
b340: 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
b350: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
b360: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  db;.  int i;..  
b370: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
b380: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
b390: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
b3a0: 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2d 69 53  loc(db, nExpr-iS
b3b0: 74 61 72 74 2c 20 6e 45 78 74 72 61 2b 31 29 3b  tart, nExtra+1);
b3c0: 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a  .  if( pInfo ){.
b3d0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
b3e0: 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
b3f0: 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a  eable(pInfo) );.
b400: 20 20 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74      for(i=iStart
b410: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
b420: 2b 69 53 74 61 72 74 3b 20 69 3c 6e 45 78 70 72  +iStart; i<nExpr
b430: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
b440: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  .      pInfo->aC
b450: 6f 6c 6c 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  oll[i-iStart] = 
b460: 73 71 6c 69 74 65 33 45 78 70 72 4e 4e 43 6f 6c  sqlite3ExprNNCol
b470: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74  lSeq(pParse, pIt
b480: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
b490: 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72    pInfo->aSortOr
b4a0: 64 65 72 5b 69 2d 69 53 74 61 72 74 5d 20 3d 20  der[i-iStart] = 
b4b0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
b4c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
b4d0: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 2f  turn pInfo;.}../
b4e0: 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  *.** Name of the
b4f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72   connection oper
b500: 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65  ator, used for e
b510: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a  rror messages..*
b520: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
b530: 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d  har *selectOpNam
b540: 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61  e(int id){.  cha
b550: 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20  r *z;.  switch( 
b560: 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  id ){.    case T
b570: 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d  K_ALL:       z =
b580: 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20   "UNION ALL";   
b590: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
b5a0: 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20  TK_INTERSECT: z 
b5b0: 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20  = "INTERSECT";  
b5c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
b5d0: 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a   TK_EXCEPT:    z
b5e0: 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20 20   = "EXCEPT";    
b5f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
b600: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
b610: 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20  z = "UNION";    
b620: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
b630: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66  return z;.}..#if
b640: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b650: 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55  _EXPLAIN./*.** U
b660: 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49  nless an "EXPLAI
b670: 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f  N QUERY PLAN" co
b680: 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70  mmand is being p
b690: 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20 66  rocessed, this f
b6a0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20  unction.** is a 
b6b0: 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
b6c0: 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e 67  , it adds a sing
b6d0: 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  le row of output
b6e0: 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73 75   to the EQP resu
b6f0: 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65  lt,.** where the
b700: 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74   caption is of t
b710: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
b720: 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45   "USE TEMP B-TRE
b730: 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a  E FOR xxx".**.**
b740: 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e   where xxx is on
b750: 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c  e of "DISTINCT",
b760: 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22   "ORDER BY" or "
b770: 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74  GROUP BY". Exact
b780: 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ly which.** is d
b790: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
b7a0: 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74   zUsage argument
b7b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b7c0: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
b7d0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
b7e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73   const char *zUs
b7f0: 61 67 65 29 7b 0a 20 20 45 78 70 6c 61 69 6e 51  age){.  ExplainQ
b800: 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
b810: 2c 20 30 2c 20 22 55 53 45 20 54 45 4d 50 20 42  , 0, "USE TEMP B
b820: 2d 54 52 45 45 20 46 4f 52 20 25 73 22 2c 20 7a  -TREE FOR %s", z
b830: 55 73 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Usage));.}../*.*
b840: 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65 73 73  * Assign express
b850: 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65 20  ion b to lvalue 
b860: 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d  a. A second, no-
b870: 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  op, version of t
b880: 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20  his macro.** is 
b890: 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53 51  provided when SQ
b8a0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
b8b0: 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68  N is defined. Th
b8c0: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f  is allows the co
b8d0: 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33  de.** in sqlite3
b8e0: 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73 69  Select() to assi
b8f0: 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74 72  gn values to str
b900: 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76 61  ucture member va
b910: 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20  riables that.** 
b920: 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53 51  only exist if SQ
b930: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
b940: 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  N is not defined
b950: 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69   without polluti
b960: 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  ng the.** code w
b970: 69 74 68 20 23 69 66 6e 64 65 66 20 64 69 72 65  ith #ifndef dire
b980: 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66  ctives..*/.# def
b990: 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  ine explainSetIn
b9a0: 74 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d 20  teger(a, b) a = 
b9b0: 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f  b..#else./* No-o
b9c0: 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  p versions of th
b9d0: 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66  e explainXXX() f
b9e0: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63  unctions and mac
b9f0: 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65  ros. */.# define
ba00: 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
ba10: 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20  e(y,z).# define 
ba20: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
ba30: 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 0a  r(y,z).#endif...
ba40: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e  /*.** If the inn
ba50: 65 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65  er loop was gene
ba60: 72 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f  rated using a no
ba70: 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20  n-null pOrderBy 
ba80: 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65  argument,.** the
ba90: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65  n the results we
baa0: 72 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73  re placed in a s
bab0: 6f 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68  orter.  After th
bac0: 65 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e  e loop is termin
bad0: 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20  ated.** we need 
bae0: 74 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65  to run the sorte
baf0: 72 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  r and output the
bb00: 20 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66   results.  The f
bb10: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74  ollowing.** rout
bb20: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68  ine generates th
bb30: 65 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f  e code needed to
bb40: 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61   do that..*/.sta
bb50: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
bb60: 65 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72  eSortTail(.  Par
bb70: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
bb80: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
bb90: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
bba0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
bbb0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
bbc0: 20 2a 2f 0a 20 20 53 6f 72 74 43 74 78 20 2a 70   */.  SortCtx *p
bbd0: 53 6f 72 74 2c 20 20 20 2f 2a 20 49 6e 66 6f 72  Sort,   /* Infor
bbe0: 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 4f 52  mation on the OR
bbf0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
bc00: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
bc10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
bc20: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
bc30: 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
bc40: 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74  t *pDest /* Writ
bc50: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
bc60: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
bc70: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
bc80: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bca0: 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
bcb0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
bcc0: 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20 70 53  t addrBreak = pS
bcd0: 6f 72 74 2d 3e 6c 61 62 65 6c 44 6f 6e 65 3b 20  ort->labelDone; 
bce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
bcf0: 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74 20  mp here to exit 
bd00: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
bd10: 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c  drContinue = sql
bd20: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
bd30: 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68  l(v);  /* Jump h
bd40: 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79 63  ere for next cyc
bd50: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
bd60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bd70: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
bd80: 66 20 6f 75 74 70 75 74 20 6c 6f 6f 70 2e 20 4a  f output loop. J
bd90: 75 6d 70 20 66 6f 72 20 4e 65 78 74 2e 20 2a 2f  ump for Next. */
bda0: 0a 20 20 69 6e 74 20 61 64 64 72 4f 6e 63 65 20  .  int addrOnce 
bdb0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b  = 0;.  int iTab;
bdc0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
bdd0: 64 65 72 42 79 20 3d 20 70 53 6f 72 74 2d 3e 70  derBy = pSort->p
bde0: 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 65  OrderBy;.  int e
bdf0: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
be00: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
be10: 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72   = pDest->iSDPar
be20: 6d 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 3b  m;.  int regRow;
be30: 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b  .  int regRowid;
be40: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69  .  int iCol;.  i
be50: 6e 74 20 6e 4b 65 79 3b 20 20 20 20 20 20 20 20  nt nKey;        
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
be70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b 65 79 20  * Number of key 
be80: 63 6f 6c 75 6d 6e 73 20 69 6e 20 73 6f 72 74 65  columns in sorte
be90: 72 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  r record */.  in
bea0: 74 20 69 53 6f 72 74 54 61 62 3b 20 20 20 20 20  t iSortTab;     
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bec0: 20 53 6f 72 74 65 72 20 63 75 72 73 6f 72 20 74   Sorter cursor t
bed0: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
bee0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 53   int i;.  int bS
bef0: 65 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eq;             
bf00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
bf10: 65 20 69 66 20 73 6f 72 74 65 72 20 72 65 63 6f  e if sorter reco
bf20: 72 64 20 69 6e 63 6c 75 64 65 73 20 73 65 71 2e  rd includes seq.
bf30: 20 6e 6f 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   no. */.  int nR
bf40: 65 66 4b 65 79 20 3d 20 30 3b 0a 20 20 73 74 72  efKey = 0;.  str
bf50: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
bf60: 6d 20 2a 61 4f 75 74 45 78 20 3d 20 70 2d 3e 70  m *aOutEx = p->p
bf70: 45 4c 69 73 74 2d 3e 61 3b 0a 0a 20 20 61 73 73  EList->a;..  ass
bf80: 65 72 74 28 20 61 64 64 72 42 72 65 61 6b 3c 30  ert( addrBreak<0
bf90: 20 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d   );.  if( pSort-
bfa0: 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b 0a 20  >labelBkOut ){. 
bfb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bfc0: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
bfd0: 2c 20 70 53 6f 72 74 2d 3e 72 65 67 52 65 74 75  , pSort->regRetu
bfe0: 72 6e 2c 20 70 53 6f 72 74 2d 3e 6c 61 62 65 6c  rn, pSort->label
bff0: 42 6b 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69  BkOut);.    sqli
c000: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
c010: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 73  ddrBreak);.    s
c020: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
c030: 65 4c 61 62 65 6c 28 76 2c 20 70 53 6f 72 74 2d  eLabel(v, pSort-
c040: 3e 6c 61 62 65 6c 42 6b 4f 75 74 29 3b 0a 20 20  >labelBkOut);.  
c050: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
c060: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
c070: 45 46 45 52 45 4e 43 45 53 0a 20 20 2f 2a 20 4f  EFERENCES.  /* O
c080: 70 65 6e 20 61 6e 79 20 63 75 72 73 6f 72 73 20  pen any cursors 
c090: 6e 65 65 64 65 64 20 66 6f 72 20 73 6f 72 74 65  needed for sorte
c0a0: 72 2d 72 65 66 65 72 65 6e 63 65 20 65 78 70 72  r-reference expr
c0b0: 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72  essions */.  for
c0c0: 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e  (i=0; i<pSort->n
c0d0: 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  Defer; i++){.   
c0e0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
c0f0: 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e  Sort->aDefer[i].
c100: 70 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 69 44  pTab;.    int iD
c110: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
c120: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
c130: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
c140: 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ma);.    sqlite3
c150: 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
c160: 2c 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b  , pSort->aDefer[
c170: 69 5d 2e 69 43 73 72 2c 20 69 44 62 2c 20 70 54  i].iCsr, iDb, pT
c180: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
c190: 3b 0a 20 20 20 20 6e 52 65 66 4b 65 79 20 3d 20  ;.    nRefKey = 
c1a0: 4d 41 58 28 6e 52 65 66 4b 65 79 2c 20 70 53 6f  MAX(nRefKey, pSo
c1b0: 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 6e 4b  rt->aDefer[i].nK
c1c0: 65 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ey);.  }.#endif.
c1d0: 0a 20 20 69 54 61 62 20 3d 20 70 53 6f 72 74 2d  .  iTab = pSort-
c1e0: 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 69 66 28  >iECursor;.  if(
c1f0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
c200: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
c210: 5f 43 6f 72 6f 75 74 69 6e 65 20 7c 7c 20 65 44  _Coroutine || eD
c220: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 29 7b 0a  est==SRT_Mem ){.
c230: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30      regRowid = 0
c240: 3b 0a 20 20 20 20 72 65 67 52 6f 77 20 3d 20 70  ;.    regRow = p
c250: 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 7d  Dest->iSdst;.  }
c260: 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77  else{.    regRow
c270: 69 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  id = sqlite3GetT
c280: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
c290: 20 20 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c      regRow = sql
c2a0: 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
c2b0: 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 75 6d 6e  (pParse, nColumn
c2c0: 29 3b 0a 20 20 7d 0a 20 20 6e 4b 65 79 20 3d 20  );.  }.  nKey = 
c2d0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
c2e0: 2d 20 70 53 6f 72 74 2d 3e 6e 4f 42 53 61 74 3b  - pSort->nOBSat;
c2f0: 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e 73 6f  .  if( pSort->so
c300: 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54 46 4c  rtFlags & SORTFL
c310: 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  AG_UseSorter ){.
c320: 20 20 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f      int regSortO
c330: 75 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ut = ++pParse->n
c340: 4d 65 6d 3b 0a 20 20 20 20 69 53 6f 72 74 54 61  Mem;.    iSortTa
c350: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
c360: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 53 6f 72  ++;.    if( pSor
c370: 74 2d 3e 6c 61 62 65 6c 42 6b 4f 75 74 20 29 7b  t->labelBkOut ){
c380: 0a 20 20 20 20 20 20 61 64 64 72 4f 6e 63 65 20  .      addrOnce 
c390: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
c3a0: 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b  Op0(v, OP_Once);
c3b0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
c3c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
c3d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
c3e0: 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
c3f0: 69 53 6f 72 74 54 61 62 2c 20 72 65 67 53 6f 72  iSortTab, regSor
c400: 74 4f 75 74 2c 20 0a 20 20 20 20 20 20 20 20 6e  tOut, .        n
c410: 4b 65 79 2b 31 2b 6e 43 6f 6c 75 6d 6e 2b 6e 52  Key+1+nColumn+nR
c420: 65 66 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20  efKey);.    if( 
c430: 61 64 64 72 4f 6e 63 65 20 29 20 73 71 6c 69 74  addrOnce ) sqlit
c440: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
c450: 2c 20 61 64 64 72 4f 6e 63 65 29 3b 0a 20 20 20  , addrOnce);.   
c460: 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69   addr = 1 + sqli
c470: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
c480: 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
c490: 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29  iTab, addrBreak)
c4a0: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
c4b0: 67 65 28 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f  ge(v);.    codeO
c4c0: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
c4d0: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
c4e0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
c4f0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
c500: 53 6f 72 74 65 72 44 61 74 61 2c 20 69 54 61 62  SorterData, iTab
c510: 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 69 53  , regSortOut, iS
c520: 6f 72 74 54 61 62 29 3b 0a 20 20 20 20 62 53 65  ortTab);.    bSe
c530: 71 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  q = 0;.  }else{.
c540: 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73      addr = 1 + s
c550: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
c560: 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61  (v, OP_Sort, iTa
c570: 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56  b, addrBreak); V
c580: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
c590: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
c5a0: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64  , p->iOffset, ad
c5b0: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20  drContinue);.   
c5c0: 20 69 53 6f 72 74 54 61 62 20 3d 20 69 54 61 62   iSortTab = iTab
c5d0: 3b 0a 20 20 20 20 62 53 65 71 20 3d 20 31 3b 0a  ;.    bSeq = 1;.
c5e0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 2c 20 69    }.  for(i=0, i
c5f0: 43 6f 6c 3d 6e 4b 65 79 2b 62 53 65 71 2d 31 3b  Col=nKey+bSeq-1;
c600: 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29   i<nColumn; i++)
c610: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
c620: 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52 45  ENABLE_SORTER_RE
c630: 46 45 52 45 4e 43 45 53 0a 20 20 20 20 69 66 28  FERENCES.    if(
c640: 20 61 4f 75 74 45 78 5b 69 5d 2e 62 53 6f 72 74   aOutEx[i].bSort
c650: 65 72 52 65 66 20 29 20 63 6f 6e 74 69 6e 75 65  erRef ) continue
c660: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
c670: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
c680: 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20  OrderByCol==0 ) 
c690: 69 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 23 69 66 64  iCol++;.  }.#ifd
c6a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c6b0: 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45 4e 43  _SORTER_REFERENC
c6c0: 45 53 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  ES.  if( pSort->
c6d0: 6e 44 65 66 65 72 20 29 7b 0a 20 20 20 20 69 6e  nDefer ){.    in
c6e0: 74 20 69 4b 65 79 20 3d 20 69 43 6f 6c 2b 31 3b  t iKey = iCol+1;
c6f0: 0a 20 20 20 20 69 6e 74 20 72 65 67 4b 65 79 20  .    int regKey 
c700: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
c710: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 52  Range(pParse, nR
c720: 65 66 4b 65 79 29 3b 0a 0a 20 20 20 20 66 6f 72  efKey);..    for
c730: 28 69 3d 30 3b 20 69 3c 70 53 6f 72 74 2d 3e 6e  (i=0; i<pSort->n
c740: 44 65 66 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  Defer; i++){.   
c750: 20 20 20 69 6e 74 20 69 43 73 72 20 3d 20 70 53     int iCsr = pS
c760: 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69 5d 2e 69  ort->aDefer[i].i
c770: 43 73 72 3b 0a 20 20 20 20 20 20 54 61 62 6c 65  Csr;.      Table
c780: 20 2a 70 54 61 62 20 3d 20 70 53 6f 72 74 2d 3e   *pTab = pSort->
c790: 61 44 65 66 65 72 5b 69 5d 2e 70 54 61 62 3b 0a  aDefer[i].pTab;.
c7a0: 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d        int nKey =
c7b0: 20 70 53 6f 72 74 2d 3e 61 44 65 66 65 72 5b 69   pSort->aDefer[i
c7c0: 5d 2e 6e 4b 65 79 3b 0a 0a 20 20 20 20 20 20 73  ].nKey;..      s
c7d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
c7e0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
c7f0: 69 43 73 72 29 3b 0a 20 20 20 20 20 20 69 66 28  iCsr);.      if(
c800: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
c810: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
c820: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
c830: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53 6f 72 74  OP_Column, iSort
c840: 54 61 62 2c 20 69 4b 65 79 2b 2b 2c 20 72 65 67  Tab, iKey++, reg
c850: 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Key);.        sq
c860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
c870: 76 2c 20 4f 50 5f 53 65 65 6b 52 6f 77 69 64 2c  v, OP_SeekRowid,
c880: 20 69 43 73 72 2c 20 0a 20 20 20 20 20 20 20 20   iCsr, .        
c890: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
c8a0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 31 2c  urrentAddr(v)+1,
c8b0: 20 72 65 67 4b 65 79 29 3b 0a 20 20 20 20 20 20   regKey);.      
c8c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
c8d0: 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e  nt k;.        in
c8e0: 74 20 69 4a 6d 70 3b 0a 20 20 20 20 20 20 20 20  t iJmp;.        
c8f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c900: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
c910: 54 61 62 29 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 6e  Tab)->nKeyCol==n
c920: 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 66  Key );.        f
c930: 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 4b 65 79 3b 20  or(k=0; k<nKey; 
c940: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
c950: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c960: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
c970: 69 53 6f 72 74 54 61 62 2c 20 69 4b 65 79 2b 2b  iSortTab, iKey++
c980: 2c 20 72 65 67 4b 65 79 2b 6b 29 3b 0a 20 20 20  , regKey+k);.   
c990: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
c9a0: 4a 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Jmp = sqlite3Vdb
c9b0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
c9c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c9d0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
c9e0: 20 4f 50 5f 53 65 65 6b 47 45 2c 20 69 43 73 72   OP_SeekGE, iCsr
c9f0: 2c 20 69 4a 6d 70 2b 32 2c 20 72 65 67 4b 65 79  , iJmp+2, regKey
ca00: 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  , nKey);.       
ca10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ca20: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 49 64 78 4c  p4Int(v, OP_IdxL
ca30: 45 2c 20 69 43 73 72 2c 20 69 4a 6d 70 2b 33 2c  E, iCsr, iJmp+3,
ca40: 20 72 65 67 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a   regKey, nKey);.
ca50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ca60: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
ca70: 4e 75 6c 6c 52 6f 77 2c 20 69 43 73 72 29 3b 0a  NullRow, iCsr);.
ca80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ca90: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
caa0: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
cab0: 2c 20 72 65 67 4b 65 79 2c 20 6e 52 65 66 4b 65  , regKey, nRefKe
cac0: 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  y);.  }.#endif. 
cad0: 20 66 6f 72 28 69 3d 6e 43 6f 6c 75 6d 6e 2d 31   for(i=nColumn-1
cae0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 23 69  ; i>=0; i--){.#i
caf0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
cb00: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
cb10: 4e 43 45 53 0a 20 20 20 20 69 66 28 20 61 4f 75  NCES.    if( aOu
cb20: 74 45 78 5b 69 5d 2e 62 53 6f 72 74 65 72 52 65  tEx[i].bSorterRe
cb30: 66 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  f ){.      sqlit
cb40: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
cb50: 65 2c 20 61 4f 75 74 45 78 5b 69 5d 2e 70 45 78  e, aOutEx[i].pEx
cb60: 70 72 2c 20 72 65 67 52 6f 77 2b 69 29 3b 0a 20  pr, regRow+i);. 
cb70: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
cb80: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
cb90: 69 52 65 61 64 3b 0a 20 20 20 20 20 20 69 66 28  iRead;.      if(
cba0: 20 61 4f 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69   aOutEx[i].u.x.i
cbb0: 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20  OrderByCol ){.  
cbc0: 20 20 20 20 20 20 69 52 65 61 64 20 3d 20 61 4f        iRead = aO
cbd0: 75 74 45 78 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64  utEx[i].u.x.iOrd
cbe0: 65 72 42 79 43 6f 6c 2d 31 3b 0a 20 20 20 20 20  erByCol-1;.     
cbf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
cc00: 69 52 65 61 64 20 3d 20 69 43 6f 6c 2d 2d 3b 0a  iRead = iCol--;.
cc10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
cc20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
cc30: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 53  v, OP_Column, iS
cc40: 6f 72 74 54 61 62 2c 20 69 52 65 61 64 2c 20 72  ortTab, iRead, r
cc50: 65 67 52 6f 77 2b 69 29 3b 0a 20 20 20 20 20 20  egRow+i);.      
cc60: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
cc70: 22 25 73 22 2c 20 61 4f 75 74 45 78 5b 69 5d 2e  "%s", aOutEx[i].
cc80: 7a 4e 61 6d 65 3f 61 4f 75 74 45 78 5b 69 5d 2e  zName?aOutEx[i].
cc90: 7a 4e 61 6d 65 20 3a 20 61 4f 75 74 45 78 5b 69  zName : aOutEx[i
cca0: 5d 2e 7a 53 70 61 6e 29 29 3b 0a 20 20 20 20 7d  ].zSpan));.    }
ccb0: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65  .  }.  switch( e
ccc0: 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65  Dest ){.    case
ccd0: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
cce0: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
ccf0: 62 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b: {.      sqlit
cd00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
cd10: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
cd20: 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  rm, regRowid);. 
cd30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cd40: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
cd50: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
cd60: 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  ow, regRowid);. 
cd70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
cd80: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
cd90: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
cda0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
cdb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cdc0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
cdd0: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
cde0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
cdf0: 6f 6c 75 6d 6e 3d 3d 73 71 6c 69 74 65 33 53 74  olumn==sqlite3St
ce00: 72 6c 65 6e 33 30 28 70 44 65 73 74 2d 3e 7a 41  rlen30(pDest->zA
ce10: 66 66 53 64 73 74 29 20 29 3b 0a 20 20 20 20 20  ffSdst) );.     
ce20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ce30: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
ce40: 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f  ord, regRow, nCo
ce50: 6c 75 6d 6e 2c 20 72 65 67 52 6f 77 69 64 2c 0a  lumn, regRowid,.
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce70: 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 7a          pDest->z
ce80: 41 66 66 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e  AffSdst, nColumn
ce90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
cea0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
ceb0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
cec0: 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29  regRow, nColumn)
ced0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
cee0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
cef0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
cf00: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 2c 20 72  arm, regRowid, r
cf10: 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  egRow, nColumn);
cf20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
cf30: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54    }.    case SRT
cf40: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  _Mem: {.      /*
cf50: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
cf60: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
cf70: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
cf80: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
cf90: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
cfa0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
cfb0: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
cfc0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
cfd0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
cfe0: 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74  tine ); .      t
cff0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
d000: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
d010: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
d020: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
d030: 6e 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ne );.      if( 
d040: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
d050: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
d060: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d070: 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
d080: 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43  pDest->iSdst, nC
d090: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20  olumn);.        
d0a0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
d0b0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
d0c0: 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53  Parse, pDest->iS
d0d0: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
d0e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d0f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d100: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
d110: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
d120: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
d130: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d140: 20 7d 0a 20 20 69 66 28 20 72 65 67 52 6f 77 69   }.  if( regRowi
d150: 64 20 29 7b 0a 20 20 20 20 69 66 28 20 65 44 65  d ){.    if( eDe
d160: 73 74 3d 3d 53 52 54 5f 53 65 74 20 29 7b 0a 20  st==SRT_Set ){. 
d170: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
d180: 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61  aseTempRange(pPa
d190: 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f  rse, regRow, nCo
d1a0: 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lumn);.    }else
d1b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
d1c0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
d1d0: 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20  arse, regRow);. 
d1e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
d1f0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
d200: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64 29  Parse, regRowid)
d210: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 62  ;.  }.  /* The b
d220: 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f  ottom of the loo
d230: 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  p.  */.  sqlite3
d240: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
d250: 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65  (v, addrContinue
d260: 29 3b 0a 20 20 69 66 28 20 70 53 6f 72 74 2d 3e  );.  if( pSort->
d270: 73 6f 72 74 46 6c 61 67 73 20 26 20 53 4f 52 54  sortFlags & SORT
d280: 46 4c 41 47 5f 55 73 65 53 6f 72 74 65 72 20 29  FLAG_UseSorter )
d290: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
d2a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
d2b0: 72 74 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20  rterNext, iTab, 
d2c0: 61 64 64 72 29 3b 20 56 64 62 65 43 6f 76 65 72  addr); VdbeCover
d2d0: 61 67 65 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b  age(v);.  }else{
d2e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d2f0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
d300: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 20  t, iTab, addr); 
d310: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
d320: 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 6f 72 74  .  }.  if( pSort
d330: 2d 3e 72 65 67 52 65 74 75 72 6e 20 29 20 73 71  ->regReturn ) sq
d340: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
d350: 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 53  v, OP_Return, pS
d360: 6f 72 74 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  ort->regReturn);
d370: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
d380: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
d390: 64 72 42 72 65 61 6b 29 3b 0a 7d 0a 0a 2f 2a 0a  drBreak);.}../*.
d3a0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
d3b0: 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20  ter to a string 
d3c0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27  containing the '
d3d0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
d3e0: 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  ' of the.** expr
d3f0: 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68  ession pExpr. Th
d400: 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20  e string may be 
d410: 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74 69  treated as stati
d420: 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  c by the caller.
d430: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20  .**.** Also try 
d440: 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65 20  to estimate the 
d450: 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75  size of the retu
d460: 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72  rned value and r
d470: 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65  eturn that.** re
d480: 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64  sult in *pEstWid
d490: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  th..**.** The de
d4a0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69  claration type i
d4b0: 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61  s the exact data
d4c0: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
d4d0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
d4e0: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43  he.** original C
d4f0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
d500: 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70  ement if the exp
d510: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
d520: 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c  umn. The.** decl
d530: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
d540: 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69   a ROWID field i
d550: 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74  s INTEGER. Exact
d560: 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65  ly when an expre
d570: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73  ssion.** is cons
d580: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
d590: 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69  can be complex i
d5a0: 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  n the presence o
d5b0: 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68  f subqueries. Th
d5c0: 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20  e.** result-set 
d5d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c  expression in al
d5e0: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
d5f0: 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ng SELECT statem
d600: 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73  ents is .** cons
d610: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
d620: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
d630: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  ..**.**   SELECT
d640: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
d650: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
d660: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
d670: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
d680: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
d690: 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  l);.**   SELECT 
d6a0: 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  abc FROM (SELECT
d6b0: 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d   col AS abc FROM
d6c0: 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68   tbl);.** .** Th
d6d0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
d6e0: 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65  pe for any expre
d6f0: 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ssion other than
d700: 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c   a column is NUL
d710: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  L..**.** This ro
d720: 75 74 69 6e 65 20 68 61 73 20 65 69 74 68 65 72  utine has either
d730: 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65   3 or 6 paramete
d740: 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  rs depending on 
d750: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
d760: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  * the SQLITE_ENA
d770: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
d780: 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ATA compile-time
d790: 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e   option is used.
d7a0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
d7b0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
d7c0: 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e  METADATA.# defin
d7d0: 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42  e columnType(A,B
d7e0: 2c 43 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79  ,C,D,E) columnTy
d7f0: 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45  peImpl(A,B,C,D,E
d800: 29 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21 64  ).#else /* if !d
d810: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
d820: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
d830: 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e  DATA) */.# defin
d840: 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42  e columnType(A,B
d850: 2c 43 2c 44 2c 45 29 20 63 6f 6c 75 6d 6e 54 79  ,C,D,E) columnTy
d860: 70 65 49 6d 70 6c 28 41 2c 42 29 0a 23 65 6e 64  peImpl(A,B).#end
d870: 69 66 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  if.static const 
d880: 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65  char *columnType
d890: 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  Impl(.  NameCont
d8a0: 65 78 74 20 2a 70 4e 43 2c 20 0a 23 69 66 6e 64  ext *pNC, .#ifnd
d8b0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d8c0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
d8d0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 0a 23  .  Expr *pExpr.#
d8e0: 65 6c 73 65 0a 20 20 45 78 70 72 20 2a 70 45 78  else.  Expr *pEx
d8f0: 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pr,.  const char
d900: 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63   **pzOrigDb,.  c
d910: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
d920: 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63  igTab,.  const c
d930: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 0a  har **pzOrigCol.
d940: 23 65 6e 64 69 66 0a 29 7b 0a 20 20 63 68 61 72  #endif.){.  char
d950: 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20   const *zType = 
d960: 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 23 69 66 64  0;.  int j;.#ifd
d970: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d980: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
d990: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
d9a0: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 63 68  OrigDb = 0;.  ch
d9b0: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54  ar const *zOrigT
d9c0: 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  ab = 0;.  char c
d9d0: 6f 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d  onst *zOrigCol =
d9e0: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73   0;.#endif..  as
d9f0: 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29  sert( pExpr!=0 )
da00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d  ;.  assert( pNC-
da10: 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b 0a  >pSrcList!=0 );.
da20: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
da30: 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op!=TK_AGG_COLU
da40: 4d 4e 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 72  MN );  /* This r
da50: 6f 75 74 69 6e 65 20 72 75 6e 65 73 20 62 65 66  outine runes bef
da60: 6f 72 65 20 61 67 67 72 65 67 61 74 65 73 0a 20  ore aggregates. 
da70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da90: 20 20 20 20 20 20 2a 2a 20 61 72 65 20 70 72 6f        ** are pro
daa0: 63 65 73 73 65 64 20 2a 2f 0a 20 20 73 77 69 74  cessed */.  swit
dab0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
dac0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
dad0: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
dae0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
daf0: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61  s a column. Loca
db00: 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65  te the table the
db10: 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67   column is being
db20: 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63  .      ** extrac
db30: 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65  ted from in Name
db40: 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74  Context.pSrcList
db50: 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79  . This table may
db60: 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a   be real.      *
db70: 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  * database table
db80: 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
db90: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
dba0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
dbb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
dbc0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  ble structure co
dbd0: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
dbe0: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
dbf0: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20  Select *pS = 0; 
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
dc10: 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e  elect the column
dc20: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
dc30: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  om */.      int 
dc40: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
dc50: 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78  olumn;  /* Index
dc60: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54   of column in pT
dc70: 61 62 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  ab */.      whil
dc80: 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20  e( pNC && !pTab 
dc90: 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69  ){.        SrcLi
dca0: 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
dcb0: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
dcc0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c        for(j=0;j<
dcd0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26  pTabList->nSrc &
dce0: 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  & pTabList->a[j]
dcf0: 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d  .iCursor!=pExpr-
dd00: 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20  >iTable;j++);.  
dd10: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62        if( j<pTab
dd20: 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20  List->nSrc ){.  
dd30: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
dd40: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
dd50: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ab;.          pS
dd60: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
dd70: 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ].pSelect;.     
dd80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dd90: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
dda0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
ddb0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
ddc0: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
ddd0: 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20        /* At one 
dde0: 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68 20  time, code such 
ddf0: 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78  as "SELECT new.x
de00: 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67  " within a trigg
de10: 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20  er would.       
de20: 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20 63   ** cause this c
de30: 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e  ondition to run.
de40: 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77 65    Since then, we
de50: 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75 72   have restructur
de60: 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20 2a  ed how.        *
de70: 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20 69  * trigger code i
de80: 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64 20  s generated and 
de90: 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  so this conditio
dea0: 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a  n is no longer .
deb0: 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69          ** possi
dec0: 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 74  ble. However, it
ded0: 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74 72   can still be tr
dee0: 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74  ue for statement
def0: 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20 2a  s like.        *
df00: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  * the following:
df10: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
df20: 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
df30: 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54  TABLE t1(col INT
df40: 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20 2a  EGER);.        *
df50: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
df60: 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20  CT t1.col) FROM 
df70: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20  FROM t1;.       
df80: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   **.        ** w
df90: 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29  hen columnType()
dfa0: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
dfb0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74 31  e expression "t1
dfc0: 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20 20  .col" in the .  
dfd0: 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c        ** sub-sel
dfe0: 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ect. In this cas
dff0: 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75 6d  e, set the colum
e000: 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20  n type to NULL, 
e010: 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  even.        ** 
e020: 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64  though it should
e030: 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54 45   really be "INTE
e040: 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a  GER"..        **
e050: 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73  .        ** This
e060: 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65   is not a proble
e070: 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e  m, as the column
e080: 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c   type of "t1.col
e090: 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20 20  " is never.     
e0a0: 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e     ** used. When
e0b0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73   columnType() is
e0c0: 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65   called on the e
e0d0: 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20 20  xpression .     
e0e0: 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20 74     ** "(SELECT t
e0f0: 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72  1.col)", the cor
e100: 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65 74  rect type is ret
e110: 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20 54  urned (see the T
e120: 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20  K_SELECT.       
e130: 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f 77   ** branch below
e140: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  .  */.        br
e150: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
e160: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
e170: 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62 3d   && pExpr->pTab=
e180: 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69  =pTab );.      i
e190: 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20  f( pS ){.       
e1a0: 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20   /* The "table" 
e1b0: 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75  is actually a su
e1c0: 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69  b-select or a vi
e1d0: 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ew in the FROM c
e1e0: 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a  lause.        **
e1f0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
e200: 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e  tatement. Return
e210: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
e220: 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e   type and origin
e230: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
e240: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d   for the result-
e250: 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  set column of th
e260: 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20  e sub-select..  
e270: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
e280: 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
e290: 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d  iCol<pS->pEList-
e2a0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
e2b0: 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69      /* If iCol i
e2c0: 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
e2d0: 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
e2e0: 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20 74  ssion requests t
e2f0: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
e300: 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75 62  rowid of the sub
e310: 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
e320: 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   This expression
e330: 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20 0a   is legal (see .
e340: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65 73            ** tes
e350: 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e 32  t case misc2.2.2
e360: 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65 76  ) - it always ev
e370: 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e  aluates to NULL.
e380: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
e390: 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74          NameCont
e3a0: 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20 20  ext sNC;.       
e3b0: 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d     Expr *p = pS-
e3c0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
e3d0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
e3e0: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
e3f0: 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20   pS->pSrc;.     
e400: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
e410: 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   pNC;.          
e420: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43  sNC.pParse = pNC
e430: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20  ->pParse;.      
e440: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
e450: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 26  mnType(&sNC, p,&
e460: 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54 61  zOrigDb,&zOrigTa
e470: 62 2c 26 7a 4f 72 69 67 43 6f 6c 29 3b 20 0a 20  b,&zOrigCol); . 
e480: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e490: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
e4a0: 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72   A real table or
e4b0: 20 61 20 43 54 45 20 74 61 62 6c 65 20 2a 2f 0a   a CTE table */.
e4c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e4d0: 21 70 53 20 29 3b 0a 23 69 66 64 65 66 20 53 51  !pS );.#ifdef SQ
e4e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
e4f0: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
e500: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
e510: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
e520: 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Key;.        ass
e530: 65 72 74 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f  ert( iCol==XN_RO
e540: 57 49 44 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  WID || (iCol>=0 
e550: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
e560: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ol) );.        i
e570: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
e580: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22         zType = "
e590: 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20  INTEGER";.      
e5a0: 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22      zOrigCol = "
e5b0: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20  rowid";.        
e5c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
e5d0: 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62   zOrigCol = pTab
e5e0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
e5f0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  me;.          zT
e600: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c  ype = sqlite3Col
e610: 75 6d 6e 54 79 70 65 28 26 70 54 61 62 2d 3e 61  umnType(&pTab->a
e620: 43 6f 6c 5b 69 43 6f 6c 5d 2c 30 29 3b 0a 20 20  Col[iCol],0);.  
e630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e640: 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d  zOrigTab = pTab-
e650: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
e660: 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20  if( pNC->pParse 
e670: 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  && pTab->pSchema
e680: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
e690: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
e6a0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43  chemaToIndex(pNC
e6b0: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  ->pParse->db, pT
e6c0: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
e6d0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20          zOrigDb 
e6e0: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pNC->pParse->d
e6f0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53  b->aDb[iDb].zDbS
e700: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Name;.        }.
e710: 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 61 73  #else.        as
e720: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52  sert( iCol==XN_R
e730: 4f 57 49 44 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  OWID || (iCol>=0
e740: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
e750: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 20 20  Col) );.        
e760: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
e770: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
e780: 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20  "INTEGER";.     
e790: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e7a0: 20 20 20 20 7a 54 79 70 65 20 3d 20 73 71 6c 69      zType = sqli
e7b0: 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 26 70  te3ColumnType(&p
e7c0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2c  Tab->aCol[iCol],
e7d0: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  0);.        }.#e
e7e0: 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
e7f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e800: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e810: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
e820: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
e830: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
e840: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
e850: 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75  sub-select. Retu
e860: 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rn the declarati
e870: 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20  on type and.    
e880: 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f    ** origin info
e890: 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20   for the single 
e8a0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
e8b0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
e8c0: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20  SELECT.      ** 
e8d0: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
e8e0: 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f   */.      NameCo
e8f0: 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20  ntext sNC;.     
e900: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45   Select *pS = pE
e910: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a  xpr->x.pSelect;.
e920: 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20        Expr *p = 
e930: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  pS->pEList->a[0]
e940: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  .pExpr;.      as
e950: 73 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f  sert( ExprHasPro
e960: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
e970: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
e980: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
e990: 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20   = pS->pSrc;.   
e9a0: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
e9b0: 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50  NC;.      sNC.pP
e9c0: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
e9d0: 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20  se;.      zType 
e9e0: 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
e9f0: 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20  C, p, &zOrigDb, 
ea00: 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69  &zOrigTab, &zOri
ea10: 67 43 6f 6c 29 3b 20 0a 20 20 20 20 20 20 62 72  gCol); .      br
ea20: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
ea30: 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  f.  }..#ifdef SQ
ea40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
ea50: 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20 0a 20 20  MN_METADATA  .  
ea60: 69 66 28 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a  if( pzOrigDb ){.
ea70: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72      assert( pzOr
ea80: 69 67 54 61 62 20 26 26 20 70 7a 4f 72 69 67 43  igTab && pzOrigC
ea90: 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  ol );.    *pzOri
eaa0: 67 44 62 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20  gDb = zOrigDb;. 
eab0: 20 20 20 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20     *pzOrigTab = 
eac0: 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20 20 2a 70  zOrigTab;.    *p
ead0: 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67  zOrigCol = zOrig
eae0: 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  Col;.  }.#endif.
eaf0: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
eb00: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
eb10: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
eb20: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
eb30: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
eb40: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
eb50: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
eb60: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
eb70: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
eb80: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
eb90: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
eba0: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
ebb0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
ebc0: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
ebd0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
ebe0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
ebf0: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
ec00: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
ec10: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
ec20: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
ec30: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a  E_OMIT_DECLTYPE.
ec40: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
ec50: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
ec60: 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
ec70: 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72  t sNC;.  sNC.pSr
ec80: 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
ec90: 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
eca0: 20 70 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70   pParse;.  sNC.p
ecb0: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28  Next = 0;.  for(
ecc0: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
ecd0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
ece0: 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74  Expr *p = pEList
ecf0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
ed00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
ed10: 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ype;.#ifdef SQLI
ed20: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
ed30: 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f  _METADATA.    co
ed40: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44  nst char *zOrigD
ed50: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
ed60: 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20   char *zOrigTab 
ed70: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
ed80: 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20  har *zOrigCol = 
ed90: 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63  0;.    zType = c
eda0: 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20  olumnType(&sNC, 
edb0: 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f  p, &zOrigDb, &zO
edc0: 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f  rigTab, &zOrigCo
edd0: 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  l);..    /* The 
ede0: 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69  vdbe must make i
edf0: 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74  ts own copy of t
ee00: 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61  he column-type a
ee10: 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a  nd other .    **
ee20: 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63   column specific
ee30: 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73   strings, in cas
ee40: 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  e the schema is 
ee50: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
ee60: 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  s.    ** virtual
ee70: 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65   machine is dele
ee80: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
ee90: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
eea0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
eeb0: 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f  AME_DATABASE, zO
eec0: 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52  rigDb, SQLITE_TR
eed0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
eee0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
eef0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
ef00: 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61  E_TABLE, zOrigTa
ef10: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
ef20: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
ef30: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
ef40: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f  v, i, COLNAME_CO
ef50: 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20  LUMN, zOrigCol, 
ef60: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
ef70: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79  );.#else.    zTy
ef80: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
ef90: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
efa0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
efb0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
efc0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
efd0: 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70  E_DECLTYPE, zTyp
efe0: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
eff0: 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ENT);.  }.#endif
f000: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
f010: 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
f020: 45 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E) */.}.../*.** 
f030: 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75  Compute the colu
f040: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 53  mn names for a S
f050: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
f060: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  .**.** The only 
f070: 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 53  guarantee that S
f080: 51 4c 69 74 65 20 6d 61 6b 65 73 20 61 62 6f 75  QLite makes abou
f090: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  t column names i
f0a0: 73 20 74 68 61 74 20 69 66 20 74 68 65 0a 2a 2a  s that if the.**
f0b0: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 61 6e 20 41   column has an A
f0c0: 53 20 63 6c 61 75 73 65 20 61 73 73 69 67 6e 69  S clause assigni
f0d0: 6e 67 20 69 74 20 61 20 6e 61 6d 65 2c 20 74 68  ng it a name, th
f0e0: 61 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 6e  at will be the n
f0f0: 61 6d 65 20 75 73 65 64 2e 0a 2a 2a 20 54 68 61  ame used..** Tha
f100: 74 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 64 6f  t is the only do
f110: 63 75 6d 65 6e 74 65 64 20 67 75 61 72 61 6e 74  cumented guarant
f120: 65 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 63 6f  ee.  However, co
f130: 75 6e 74 6c 65 73 73 20 61 70 70 6c 69 63 61 74  untless applicat
f140: 69 6f 6e 73 0a 2a 2a 20 64 65 76 65 6c 6f 70 65  ions.** develope
f150: 64 20 6f 76 65 72 20 74 68 65 20 79 65 61 72 73  d over the years
f160: 20 68 61 76 65 20 6d 61 64 65 20 62 61 73 65 6c   have made basel
f170: 65 73 73 20 61 73 73 75 6d 70 74 69 6f 6e 73 20  ess assumptions 
f180: 61 62 6f 75 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  about column nam
f190: 65 73 0a 2a 2a 20 61 6e 64 20 77 69 6c 6c 20 62  es.** and will b
f1a0: 72 65 61 6b 20 69 66 20 74 68 6f 73 65 20 61 73  reak if those as
f1b0: 73 75 6d 70 74 69 6f 6e 73 20 63 68 61 6e 67 65  sumptions change
f1c0: 73 2e 20 20 48 65 6e 63 65 2c 20 75 73 65 20 65  s.  Hence, use e
f1d0: 78 74 72 65 6d 65 20 63 61 75 74 69 6f 6e 0a 2a  xtreme caution.*
f1e0: 2a 20 77 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67  * when modifying
f1f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
f200: 20 61 76 6f 69 64 20 62 72 65 61 6b 69 6e 67 20   avoid breaking 
f210: 6c 65 67 61 63 79 2e 0a 2a 2a 0a 2a 2a 20 53 65  legacy..**.** Se
f220: 65 20 41 6c 73 6f 3a 20 73 71 6c 69 74 65 33 43  e Also: sqlite3C
f230: 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
f240: 73 74 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  st().**.** The P
f250: 52 41 47 4d 41 20 73 68 6f 72 74 5f 63 6f 6c 75  RAGMA short_colu
f260: 6d 6e 5f 6e 61 6d 65 73 20 61 6e 64 20 50 52 41  mn_names and PRA
f270: 47 4d 41 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f  GMA full_column_
f280: 6e 61 6d 65 73 20 73 65 74 74 69 6e 67 73 20 61  names settings a
f290: 72 65 0a 2a 2a 20 64 65 70 72 65 63 61 74 65 64  re.** deprecated
f2a0: 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 73  .  The default s
f2b0: 65 74 74 69 6e 67 20 69 73 20 73 68 6f 72 74 3d  etting is short=
f2c0: 4f 4e 2c 20 66 75 6c 6c 3d 4f 46 46 2e 20 20 39  ON, full=OFF.  9
f2d0: 39 2e 39 25 20 6f 66 20 61 6c 6c 0a 2a 2a 20 61  9.9% of all.** a
f2e0: 70 70 6c 69 63 61 74 69 6f 6e 73 20 73 68 6f 75  pplications shou
f2f0: 6c 64 20 6f 70 65 72 61 74 65 20 74 68 69 73 20  ld operate this 
f300: 77 61 79 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  way.  Neverthele
f310: 73 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 73  ss, we need to s
f320: 75 70 70 6f 72 74 20 74 68 65 0a 2a 2a 20 6f 74  upport the.** ot
f330: 68 65 72 20 6d 6f 64 65 73 20 66 6f 72 20 6c 65  her modes for le
f340: 67 61 63 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73  gacy:.**.**    s
f350: 68 6f 72 74 3d 4f 46 46 2c 20 66 75 6c 6c 3d 4f  hort=OFF, full=O
f360: 46 46 3a 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20  FF:      Column 
f370: 6e 61 6d 65 20 69 73 20 74 68 65 20 74 65 78 74  name is the text
f380: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
f390: 6f 6e 20 68 61 73 20 69 74 0a 2a 2a 20 20 20 20  on has it.**    
f3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3b0: 20 20 20 20 20 20 20 20 20 20 6f 72 69 67 69 6e            origin
f3c0: 61 6c 6c 79 20 61 70 70 65 61 72 73 20 69 6e 20  ally appears in 
f3d0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
f3e0: 6d 65 6e 74 2e 20 20 49 6e 0a 2a 2a 20 20 20 20  ment.  In.**    
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f400: 20 20 20 20 20 20 20 20 20 20 6f 74 68 65 72 20            other 
f410: 77 6f 72 64 73 2c 20 74 68 65 20 7a 53 70 61 6e  words, the zSpan
f420: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 65   of the result e
f430: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  xpression..**.**
f440: 20 20 20 20 73 68 6f 72 74 3d 4f 4e 2c 20 66 75      short=ON, fu
f450: 6c 6c 3d 4f 46 46 3a 20 20 20 20 20 20 20 28 54  ll=OFF:       (T
f460: 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
f470: 6c 74 20 73 65 74 74 69 6e 67 29 2e 20 20 49 66  lt setting).  If
f480: 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 20   the result.**  
f490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4a0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 66 65              refe
f4b0: 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 61  rs directly to a
f4c0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2c 20 74   table column, t
f4d0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  hen the.**      
f4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4f0: 20 20 20 20 20 20 20 20 72 65 73 75 6c 74 20 63          result c
f500: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 6a 75  olumn name is ju
f510: 73 74 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c  st the table col
f520: 75 6d 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  umn.**          
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f540: 20 20 20 20 6e 61 6d 65 3a 20 43 4f 4c 55 4d 4e      name: COLUMN
f550: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 75 73 65  .  Otherwise use
f560: 20 7a 53 70 61 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20   zSpan..**.**   
f570: 20 66 75 6c 6c 3d 4f 4e 2c 20 73 68 6f 72 74 3d   full=ON, short=
f580: 41 4e 59 3a 20 20 20 20 20 20 20 49 66 20 74 68  ANY:       If th
f590: 65 20 72 65 73 75 6c 74 20 72 65 66 65 72 73 20  e result refers 
f5a0: 64 69 72 65 63 74 6c 79 20 74 6f 20 61 20 74 61  directly to a ta
f5b0: 62 6c 65 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 20  ble column,.**  
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 6e              then
f5e0: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75   the result colu
f5f0: 6d 6e 20 6e 61 6d 65 20 77 69 74 68 20 74 68 65  mn name with the
f600: 20 74 61 62 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20   table name.**  
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f620: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66              pref
f630: 69 78 2c 20 65 78 3a 20 54 41 42 4c 45 2e 43 4f  ix, ex: TABLE.CO
f640: 4c 55 4d 4e 2e 20 20 4f 74 68 65 72 77 69 73 65  LUMN.  Otherwise
f650: 20 75 73 65 20 7a 53 70 61 6e 2e 0a 2a 2f 0a 73   use zSpan..*/.s
f660: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
f670: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a  ateColumnNames(.
f680: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f690: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
f6a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
f6b0: 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
f6c0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 6c   /* Generate col
f6d0: 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 74 68  umn names for th
f6e0: 69 73 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  is SELECT statem
f6f0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ent */.){.  Vdbe
f700: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
f710: 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
f720: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 53  Table *pTab;.  S
f730: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
f740: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
f750: 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  List;.  sqlite3 
f760: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
f770: 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65  ;.  int fullName
f780: 3b 20 20 20 20 2f 2a 20 54 41 42 4c 45 2e 43 4f  ;    /* TABLE.CO
f790: 4c 55 4d 4e 20 69 66 20 6e 6f 20 41 53 20 63 6c  LUMN if no AS cl
f7a0: 61 75 73 65 20 61 6e 64 20 69 73 20 61 20 64 69  ause and is a di
f7b0: 72 65 63 74 20 74 61 62 6c 65 20 72 65 66 20 2a  rect table ref *
f7c0: 2f 0a 20 20 69 6e 74 20 73 72 63 4e 61 6d 65 3b  /.  int srcName;
f7d0: 20 20 20 20 20 2f 2a 20 43 4f 4c 55 4d 4e 20 6f       /* COLUMN o
f7e0: 72 20 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 20 69  r TABLE.COLUMN i
f7f0: 66 20 6e 6f 20 41 53 20 63 6c 61 75 73 65 20 61  f no AS clause a
f800: 6e 64 20 69 73 20 64 69 72 65 63 74 20 2a 2f 0a  nd is direct */.
f810: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f820: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f  OMIT_EXPLAIN.  /
f830: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
f840: 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68  EXPLAIN, skip th
f850: 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28  is step */.  if(
f860: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
f870: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
f880: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
f890: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d  ( pParse->colNam
f8a0: 65 73 53 65 74 20 29 20 72 65 74 75 72 6e 3b 0a  esSet ) return;.
f8b0: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
f8c0: 73 20 61 72 65 20 64 65 74 65 72 6d 69 6e 65 64  s are determined
f8d0: 20 62 79 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   by the left-mos
f8e0: 74 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70  t term of a comp
f8f0: 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a 2f 0a 20  ound select */. 
f900: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
f910: 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63  >pPrior ) pSelec
f920: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  t = pSelect->pPr
f930: 69 6f 72 3b 0a 20 20 53 45 4c 45 43 54 54 52 41  ior;.  SELECTTRA
f940: 43 45 28 31 2c 70 50 61 72 73 65 2c 70 53 65 6c  CE(1,pParse,pSel
f950: 65 63 74 2c 28 22 67 65 6e 65 72 61 74 69 6e 67  ect,("generating
f960: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 5c 6e 22   column names\n"
f970: 29 29 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d  ));.  pTabList =
f980: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
f990: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
f9a0: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73  ct->pEList;.  as
f9b0: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
f9c0: 61 73 73 65 72 74 28 20 70 54 61 62 4c 69 73 74  assert( pTabList
f9d0: 21 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d  !=0 );.  pParse-
f9e0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
f9f0: 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 20 3d 20 28  ;.  fullName = (
fa00: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
fa10: 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
fa20: 21 3d 30 3b 0a 20 20 73 72 63 4e 61 6d 65 20 3d  !=0;.  srcName =
fa30: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
fa40: 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
fa50: 65 73 29 21 3d 30 20 7c 7c 20 66 75 6c 6c 4e 61  es)!=0 || fullNa
fa60: 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  me;.  sqlite3Vdb
fa70: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70  eSetNumCols(v, p
fa80: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
fa90: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
faa0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
fab0: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
fac0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
fad0: 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  r;..    assert( 
fae0: 70 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  p!=0 );.    asse
faf0: 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 47  rt( p->op!=TK_AG
fb00: 47 5f 43 4f 4c 55 4d 4e 20 29 3b 20 20 2f 2a 20  G_COLUMN );  /* 
fb10: 41 67 67 20 70 72 6f 63 65 73 73 69 6e 67 20 68  Agg processing h
fb20: 61 73 20 6e 6f 74 20 72 75 6e 20 79 65 74 20 2a  as not run yet *
fb30: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
fb40: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
fb50: 7c 20 70 2d 3e 70 54 61 62 21 3d 30 20 29 3b 20  | p->pTab!=0 ); 
fb60: 2f 2a 20 43 6f 76 65 72 69 6e 67 20 69 64 78 20  /* Covering idx 
fb70: 6e 6f 74 20 79 65 74 20 63 6f 64 65 64 20 2a 2f  not yet coded */
fb80: 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d  .    if( pEList-
fb90: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20  >a[i].zName ){. 
fba0: 20 20 20 20 20 2f 2a 20 41 6e 20 41 53 20 63 6c       /* An AS cl
fbb0: 61 75 73 65 20 61 6c 77 61 79 73 20 74 61 6b 65  ause always take
fbc0: 73 20 66 69 72 73 74 20 70 72 69 6f 72 69 74 79  s first priority
fbd0: 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
fbe0: 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e  zName = pEList->
fbf0: 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[i].zName;.    
fc00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
fc10: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
fc20: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
fc30: 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  e, SQLITE_TRANSI
fc40: 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ENT);.    }else 
fc50: 69 66 28 20 73 72 63 4e 61 6d 65 20 26 26 20 70  if( srcName && p
fc60: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op==TK_COLUMN 
fc70: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
fc80: 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Col;.      int i
fc90: 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e  Col = p->iColumn
fca0: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
fcb0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 61 73  ->pTab;.      as
fcc0: 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
fcd0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
fce0: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
fcf0: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
fd00: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
fd10: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
fd20: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
fd30: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
fd40: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  <0 ){.        zC
fd50: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
fd60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fd70: 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     zCol = pTab->
fd80: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
fd90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fda0: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 20 29 7b 0a  if( fullName ){.
fdb0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
fdc0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
fdd0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
fde0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e  MPrintf(db, "%s.
fdf0: 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
fe00: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , zCol);.       
fe10: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
fe20: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
fe30: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
fe40: 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  , SQLITE_DYNAMIC
fe50: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
fe60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
fe70: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
fe80: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
fe90: 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  , zCol, SQLITE_T
fea0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
feb0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
fec0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
fed0: 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  z = pEList->a[i]
fee0: 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20  .zSpan;.      z 
fef0: 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33  = z==0 ? sqlite3
ff00: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c  MPrintf(db, "col
ff10: 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20 73  umn%d", i+1) : s
ff20: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
ff30: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c  b, z);.      sql
ff40: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
ff50: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
ff60: 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45  _NAME, z, SQLITE
ff70: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
ff80: 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65 43  .  }.  generateC
ff90: 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72 73  olumnTypes(pPars
ffa0: 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 4c  e, pTabList, pEL
ffb0: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ist);.}../*.** G
ffc0: 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69  iven an expressi
ffd0: 6f 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20 69  on list (which i
ffe0: 73 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73  s really the lis
fff0: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
10000 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68  .** that form th
10010 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
10020 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
10030 6e 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72  nt) compute appr
10040 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d  opriate.** colum
10050 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61  n names for a ta
10060 62 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68  ble that would h
10070 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69  old the expressi
10080 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41  on list..**.** A
10090 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ll column names 
100a0 77 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a  will be unique..
100b0 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63  **.** Only the c
100c0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20  olumn names are 
100d0 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d  computed.  Colum
100e0 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e  n.zType, Column.
100f0 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74  zColl,.** and ot
10100 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f  her fields of Co
10110 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e  lumn are zeroed.
10120 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
10130 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
10140 73 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79  ss.  If a memory
10150 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
10160 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f  r occurs,.** sto
10170 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f  re NULL in *paCo
10180 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f  l and 0 in *pnCo
10190 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  l and return SQL
101a0 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2a 0a 2a 2a  ITE_NOMEM..**.**
101b0 20 54 68 65 20 6f 6e 6c 79 20 67 75 61 72 61 6e   The only guaran
101c0 74 65 65 20 74 68 61 74 20 53 51 4c 69 74 65 20  tee that SQLite 
101d0 6d 61 6b 65 73 20 61 62 6f 75 74 20 63 6f 6c 75  makes about colu
101e0 6d 6e 20 6e 61 6d 65 73 20 69 73 20 74 68 61 74  mn names is that
101f0 20 69 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   if the.** colum
10200 6e 20 68 61 73 20 61 6e 20 41 53 20 63 6c 61 75  n has an AS clau
10210 73 65 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20  se assigning it 
10220 61 20 6e 61 6d 65 2c 20 74 68 61 74 20 77 69 6c  a name, that wil
10230 6c 20 62 65 20 74 68 65 20 6e 61 6d 65 20 75 73  l be the name us
10240 65 64 2e 0a 2a 2a 20 54 68 61 74 20 69 73 20 74  ed..** That is t
10250 68 65 20 6f 6e 6c 79 20 64 6f 63 75 6d 65 6e 74  he only document
10260 65 64 20 67 75 61 72 61 6e 74 65 65 2e 20 20 48  ed guarantee.  H
10270 6f 77 65 76 65 72 2c 20 63 6f 75 6e 74 6c 65 73  owever, countles
10280 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 0a 2a  s applications.*
10290 2a 20 64 65 76 65 6c 6f 70 65 64 20 6f 76 65 72  * developed over
102a0 20 74 68 65 20 79 65 61 72 73 20 68 61 76 65 20   the years have 
102b0 6d 61 64 65 20 62 61 73 65 6c 65 73 73 20 61 73  made baseless as
102c0 73 75 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20  sumptions about 
102d0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 2a 2a 20  column names.** 
102e0 61 6e 64 20 77 69 6c 6c 20 62 72 65 61 6b 20 69  and will break i
102f0 66 20 74 68 6f 73 65 20 61 73 73 75 6d 70 74 69  f those assumpti
10300 6f 6e 73 20 63 68 61 6e 67 65 73 2e 20 20 48 65  ons changes.  He
10310 6e 63 65 2c 20 75 73 65 20 65 78 74 72 65 6d 65  nce, use extreme
10320 20 63 61 75 74 69 6f 6e 0a 2a 2a 20 77 68 65 6e   caution.** when
10330 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 69 73 20   modifying this 
10340 72 6f 75 74 69 6e 65 20 74 6f 20 61 76 6f 69 64  routine to avoid
10350 20 62 72 65 61 6b 69 6e 67 20 6c 65 67 61 63 79   breaking legacy
10360 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 41 6c 73 6f  ..**.** See Also
10370 3a 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  : generateColumn
10380 4e 61 6d 65 73 28 29 0a 2a 2f 0a 69 6e 74 20 73  Names().*/.int s
10390 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f  qlite3ColumnsFro
103a0 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  mExprList(.  Par
103b0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
103c0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
103d0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
103e0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
103f0 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73       /* Expr lis
10400 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  t from which to 
10410 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61  derive column na
10420 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e  mes */.  i16 *pn
10430 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
10440 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
10450 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
10460 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  here */.  Column
10470 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20   **paCol        
10480 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
10490 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  ew column list h
104a0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ere */.){.  sqli
104b0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
104c0 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62  ->db;   /* Datab
104d0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
104e0 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  /.  int i, j;   
104f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10500 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
10510 20 2a 2f 0a 20 20 75 33 32 20 63 6e 74 3b 20 20   */.  u32 cnt;  
10520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10530 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64    /* Index added
10540 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d   to make the nam
10550 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f  e unique */.  Co
10560 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f  lumn *aCol, *pCo
10570 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  l;        /* For
10580 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65   looping over re
10590 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
105a0 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
105b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
105c0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
105d0 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
105e0 20 73 65 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a   set */.  char *
105f0 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
10600 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
10610 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
10620 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
10630 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
10640 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
10650 20 2a 2f 0a 20 20 48 61 73 68 20 68 74 3b 20 20   */.  Hash ht;  
10660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10670 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
10680 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  of column names 
10690 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 48 61 73  */..  sqlite3Has
106a0 68 49 6e 69 74 28 26 68 74 29 3b 0a 20 20 69 66  hInit(&ht);.  if
106b0 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20  ( pEList ){.    
106c0 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  nCol = pEList->n
106d0 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d  Expr;.    aCol =
106e0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
106f0 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
10700 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a  aCol[0])*nCol);.
10710 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 43      testcase( aC
10720 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ol==0 );.    if(
10730 20 6e 43 6f 6c 3e 33 32 37 36 37 20 29 20 6e 43   nCol>32767 ) nC
10740 6f 6c 20 3d 20 33 32 37 36 37 3b 0a 20 20 7d 65  ol = 32767;.  }e
10750 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  lse{.    nCol = 
10760 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b  0;.    aCol = 0;
10770 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
10780 43 6f 6c 3d 3d 28 69 31 36 29 6e 43 6f 6c 20 29  Col==(i16)nCol )
10790 3b 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f  ;.  *pnCol = nCo
107a0 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43  l;.  *paCol = aC
107b0 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ol;..  for(i=0, 
107c0 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f  pCol=aCol; i<nCo
107d0 6c 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  l && !db->malloc
107e0 46 61 69 6c 65 64 3b 20 69 2b 2b 2c 20 70 43 6f  Failed; i++, pCo
107f0 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74  l++){.    /* Get
10800 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
10810 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c  name for the col
10820 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  umn.    */.    i
10830 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  f( (zName = pELi
10840 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21  st->a[i].zName)!
10850 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
10860 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e  f the column con
10870 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61  tains an "AS <na
10880 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65  me>" phrase, use
10890 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e   <name> as the n
108a0 61 6d 65 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ame */.    }else
108b0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
108c0 6f 6c 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  olExpr = sqlite3
108d0 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
108e0 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
108f0 70 72 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  pr);.      while
10900 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d  ( pColExpr->op==
10910 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20  TK_DOT ){.      
10920 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f    pColExpr = pCo
10930 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  lExpr->pRight;. 
10940 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
10950 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20  ColExpr!=0 );.  
10960 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
10970 72 74 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  rt( pColExpr->op
10980 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  !=TK_AGG_COLUMN 
10990 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
109a0 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  lExpr->op==TK_CO
109b0 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  LUMN ){.        
109c0 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75  /* For columns u
109d0 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  se the column na
109e0 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  me name */.     
109f0 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43     int iCol = pC
10a00 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  olExpr->iColumn;
10a10 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
10a20 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d  pTab = pColExpr-
10a30 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61  >pTab;.        a
10a40 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
10a50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
10a60 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
10a70 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
10a80 20 20 20 7a 4e 61 6d 65 20 3d 20 69 43 6f 6c 3e     zName = iCol>
10a90 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  =0 ? pTab->aCol[
10aa0 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72  iCol].zName : "r
10ab0 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c  owid";.      }el
10ac0 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d  se if( pColExpr-
10ad0 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
10ae0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
10af0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
10b00 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  ColExpr, EP_IntV
10b10 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
10b20 20 7a 4e 61 6d 65 20 3d 20 70 43 6f 6c 45 78 70   zName = pColExp
10b30 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
10b40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10b50 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69    /* Use the ori
10b60 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68  ginal text of th
10b70 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  e column express
10b80 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20  ion as its name 
10b90 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  */.        zName
10ba0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
10bb0 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  zSpan;.      }. 
10bc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e 61     }.    if( zNa
10bd0 6d 65 20 29 7b 0a 20 20 20 20 20 20 7a 4e 61 6d  me ){.      zNam
10be0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
10bf0 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  Dup(db, zName);.
10c00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10c10 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
10c20 4d 50 72 69 6e 74 66 28 64 62 2c 22 63 6f 6c 75  MPrintf(db,"colu
10c30 6d 6e 25 64 22 2c 69 2b 31 29 3b 0a 20 20 20 20  mn%d",i+1);.    
10c40 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
10c50 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ure the column n
10c60 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20  ame is unique.  
10c70 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e  If the name is n
10c80 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a  ot unique,.    *
10c90 2a 20 61 70 70 65 6e 64 20 61 6e 20 69 6e 74 65  * append an inte
10ca0 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20  ger to the name 
10cb0 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d  so that it becom
10cc0 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a  es unique..    *
10cd0 2f 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20  /.    cnt = 0;. 
10ce0 20 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 20     while( zName 
10cf0 26 26 20 73 71 6c 69 74 65 33 48 61 73 68 46 69  && sqlite3HashFi
10d00 6e 64 28 26 68 74 2c 20 7a 4e 61 6d 65 29 21 3d  nd(&ht, zName)!=
10d10 30 20 29 7b 0a 20 20 20 20 20 20 6e 4e 61 6d 65  0 ){.      nName
10d20 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
10d30 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  30(zName);.     
10d40 20 69 66 28 20 6e 4e 61 6d 65 3e 30 20 29 7b 0a   if( nName>0 ){.
10d50 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 6e 4e          for(j=nN
10d60 61 6d 65 2d 31 3b 20 6a 3e 30 20 26 26 20 73 71  ame-1; j>0 && sq
10d70 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61  lite3Isdigit(zNa
10d80 6d 65 5b 6a 5d 29 3b 20 6a 2d 2d 29 7b 7d 0a 20  me[j]); j--){}. 
10d90 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
10da0 5b 6a 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65  [j]==':' ) nName
10db0 20 3d 20 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = j;.      }.  
10dc0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
10dd0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
10de0 25 2e 2a 7a 3a 25 75 22 2c 20 6e 4e 61 6d 65 2c  %.*z:%u", nName,
10df0 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a   zName, ++cnt);.
10e00 20 20 20 20 20 20 69 66 28 20 63 6e 74 3e 33 20        if( cnt>3 
10e10 29 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d  ) sqlite3_random
10e20 6e 65 73 73 28 73 69 7a 65 6f 66 28 63 6e 74 29  ness(sizeof(cnt)
10e30 2c 20 26 63 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  , &cnt);.    }. 
10e40 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d     pCol->zName =
10e50 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 71 6c 69   zName;.    sqli
10e60 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74  te3ColumnPropert
10e70 69 65 73 46 72 6f 6d 4e 61 6d 65 28 30 2c 20 70  iesFromName(0, p
10e80 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  Col);.    if( zN
10e90 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33 48 61  ame && sqlite3Ha
10ea0 73 68 49 6e 73 65 72 74 28 26 68 74 2c 20 7a 4e  shInsert(&ht, zN
10eb0 61 6d 65 2c 20 70 43 6f 6c 29 3d 3d 70 43 6f 6c  ame, pCol)==pCol
10ec0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10ed0 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
10ee0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
10ef0 65 33 48 61 73 68 43 6c 65 61 72 28 26 68 74 29  e3HashClear(&ht)
10f00 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
10f10 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
10f20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  for(j=0; j<i; j+
10f30 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
10f40 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
10f50 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [j].zName);.    
10f60 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
10f70 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20  ree(db, aCol);. 
10f80 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20     *paCol = 0;. 
10f90 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20     *pnCol = 0;. 
10fa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10fb0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
10fc0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10fd0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
10fe0 64 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  d type and colla
10ff0 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
11000 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73   to a column lis
11010 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20  t based on.** a 
11020 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11030 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c  ..** .** The col
11040 75 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61  umn list presuma
11050 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65  bly came from se
11060 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46  lectColumnNamesF
11070 72 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a  romExprList()..*
11080 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
11090 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73  t has only names
110a0 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63  , not types or c
110b0 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73  ollations.  This
110c0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  .** routine goes
110d0 20 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64   through and add
110e0 73 20 74 68 65 20 74 79 70 65 73 20 61 6e 64 20  s the types and 
110f0 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  collations..**.*
11100 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
11110 65 71 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c  equires that all
11120 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   identifiers in 
11130 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74  the SELECT.** st
11140 61 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c  atement be resol
11150 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ved..*/.void sql
11160 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c  ite3SelectAddCol
11170 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
11180 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ion(.  Parse *pP
11190 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
111a0 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73  Parsing contexts
111b0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
111c0 62 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  b,          /* A
111d0 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69  dd column type i
111e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
111f0 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65  is table */.  Se
11200 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
11210 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73      /* SELECT us
11220 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
11230 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74  types and collat
11240 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ions */.){.  sql
11250 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
11260 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e  e->db;.  NameCon
11270 74 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75  text sNC;.  Colu
11280 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c  mn *pCol;.  Coll
11290 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e  Seq *pColl;.  in
112a0 74 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a  t i;.  Expr *p;.
112b0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
112c0 74 5f 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73  t_item *a;..  as
112d0 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30  sert( pSelect!=0
112e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
112f0 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
11300 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21   & SF_Resolved)!
11310 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
11320 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c  pTab->nCol==pSel
11330 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
11340 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
11350 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
11360 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11370 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d   ) return;.  mem
11380 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
11390 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
113a0 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c  .pSrcList = pSel
113b0 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d  ect->pSrc;.  a =
113c0 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
113d0 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ->a;.  for(i=0, 
113e0 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
113f0 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
11400 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
11410 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
11420 70 65 3b 0a 20 20 20 20 69 6e 74 20 6e 2c 20 6d  pe;.    int n, m
11430 3b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70  ;.    p = a[i].p
11440 45 78 70 72 3b 0a 20 20 20 20 7a 54 79 70 65 20  Expr;.    zType 
11450 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e  = columnType(&sN
11460 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  C, p, 0, 0, 0);.
11470 20 20 20 20 2f 2a 20 70 43 6f 6c 2d 3e 73 7a 45      /* pCol->szE
11480 73 74 20 3d 20 2e 2e 2e 20 2f 2f 20 43 6f 6c 75  st = ... // Colu
11490 6d 6e 20 73 69 7a 65 20 65 73 74 20 66 6f 72 20  mn size est for 
114a0 53 45 4c 45 43 54 20 74 61 62 6c 65 73 20 6e 65  SELECT tables ne
114b0 76 65 72 20 75 73 65 64 20 2a 2f 0a 20 20 20 20  ver used */.    
114c0 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
114d0 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
114e0 6e 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28  nity(p);.    if(
114f0 20 7a 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20   zType ){.      
11500 6d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  m = sqlite3Strle
11510 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20  n30(zType);.    
11520 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72    n = sqlite3Str
11530 6c 65 6e 33 30 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  len30(pCol->zNam
11540 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e  e);.      pCol->
11550 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
11560 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 64  bReallocOrFree(d
11570 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  b, pCol->zName, 
11580 6e 2b 6d 2b 32 29 3b 0a 20 20 20 20 20 20 69 66  n+m+2);.      if
11590 28 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 29 7b  ( pCol->zName ){
115a0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
115b0 26 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 5b 6e 2b 31  &pCol->zName[n+1
115c0 5d 2c 20 7a 54 79 70 65 2c 20 6d 2b 31 29 3b 0a  ], zType, m+1);.
115d0 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 63 6f          pCol->co
115e0 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
115f0 47 5f 48 41 53 54 59 50 45 3b 0a 20 20 20 20 20  G_HASTYPE;.     
11600 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
11610 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
11620 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  =0 ) pCol->affin
11630 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
11640 5f 42 4c 4f 42 3b 0a 20 20 20 20 70 43 6f 6c 6c  _BLOB;.    pColl
11650 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
11660 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29  llSeq(pParse, p)
11670 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
11680 26 26 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3d 3d  && pCol->zColl==
11690 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  0 ){.      pCol-
116a0 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >zColl = sqlite3
116b0 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 6f  DbStrDup(db, pCo
116c0 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
116d0 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a  }.  }.  pTab->sz
116e0 54 61 62 52 6f 77 20 3d 20 31 3b 20 2f 2a 20 41  TabRow = 1; /* A
116f0 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ny non-zero valu
11700 65 20 77 6f 72 6b 73 20 2a 2f 0a 7d 0a 0a 2f 2a  e works */.}../*
11710 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45  .** Given a SELE
11720 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65  CT statement, ge
11730 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73  nerate a Table s
11740 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
11750 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72  scribes.** the r
11760 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61  esult set of tha
11770 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62  t SELECT..*/.Tab
11780 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c  le *sqlite3Resul
11790 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72  tSetOfSelect(Par
117a0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
117b0 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
117c0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73  Table *pTab;.  s
117d0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
117e0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73  rse->db;.  int s
117f0 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61  avedFlags;..  sa
11800 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66  vedFlags = db->f
11810 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  lags;.  db->flag
11820 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c  s &= ~SQLITE_Ful
11830 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d  lColNames;.  db-
11840 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
11850 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a  _ShortColNames;.
11860 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
11870 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c  rep(pParse, pSel
11880 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ect, 0);.  if( p
11890 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
118a0 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28  turn 0;.  while(
118b0 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
118c0 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65   ) pSelect = pSe
118d0 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
118e0 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65  db->flags = save
118f0 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d  dFlags;.  pTab =
11900 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
11910 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
11920 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20  Table) );.  if( 
11930 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pTab==0 ){.    r
11940 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f  eturn 0;.  }.  /
11950 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52 65 73  * The sqlite3Res
11960 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
11970 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20   is only used n 
11980 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c  contexts where l
11990 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73  ookaside.  ** is
119a0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61   disabled */.  a
119b0 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61  ssert( db->looka
119c0 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20 29 3b  side.bDisable );
119d0 0a 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66  .  pTab->nTabRef
119e0 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e   = 1;.  pTab->zN
119f0 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d  ame = 0;.  pTab-
11a00 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
11a10 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
11a20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
11a30 34 38 35 37 36 29 20 29 3b 0a 20 20 73 71 6c 69  48576) );.  sqli
11a40 74 65 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  te3ColumnsFromEx
11a50 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
11a60 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20  Select->pEList, 
11a70 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
11a80 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c  ab->aCol);.  sql
11a90 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f 6c  ite3SelectAddCol
11aa0 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
11ab0 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
11ac0 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54  , pSelect);.  pT
11ad0 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
11ae0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
11af0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
11b00 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
11b10 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
11b20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
11b30 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a  return pTab;.}..
11b40 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45  /*.** Get a VDBE
11b50 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
11b60 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20  arser context.  
11b70 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
11b80 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
11b90 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
11ba0 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c  curs, return NUL
11bb0 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65  L and leave a me
11bc0 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e  ssage in pParse.
11bd0 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65  .*/.Vdbe *sqlite
11be0 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a  3GetVdbe(Parse *
11bf0 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 70  pParse){.  if( p
11c00 50 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a  Parse->pVdbe ){.
11c10 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 72 73      return pPars
11c20 65 2d 3e 70 56 64 62 65 3b 0a 20 20 7d 0a 20 20  e->pVdbe;.  }.  
11c30 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54 6f 70  if( pParse->pTop
11c40 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 26 26 20 4f  level==0.   && O
11c50 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
11c60 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 53 51  ed(pParse->db,SQ
11c70 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f  LITE_FactorOutCo
11c80 6e 73 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 50  nst).  ){.    pP
11c90 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63  arse->okConstFac
11ca0 74 6f 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  tor = 1;.  }.  r
11cb0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
11cc0 65 43 72 65 61 74 65 28 70 50 61 72 73 65 29 3b  eCreate(pParse);
11cd0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
11ce0 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
11cf0 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
11d00 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
11d10 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
11d20 4c 69 6d 69 74 20 65 78 70 72 65 73 73 69 6f 6e  Limit expression
11d30 73 2e 20 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  s.  pLimit->pLef
11d40 74 20 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52  t and pLimit->pR
11d50 69 67 68 74 20 68 6f 6c 64 20 74 68 65 20 65 78  ight hold the ex
11d60 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
11d70 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
11d80 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
11d90 74 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65  tement after the
11da0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
11db0 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20  T.** keywords.  
11dc0 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65  Or NULL if those
11dd0 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d   keywords are om
11de0 69 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e  itted. iLimit an
11df0 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72  d iOffset .** ar
11e00 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65  e the integer me
11e10 6d 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75  mory register nu
11e20 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65  mbers for counte
11e30 72 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  rs used to compu
11e40 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74  te .** the limit
11e50 20 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66   and offset.  If
11e60 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d   there is no lim
11e70 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74  it and/or offset
11e80 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69  , then .** iLimi
11e90 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72  t and iOffset ar
11ea0 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a  e negative..**.*
11eb0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
11ec0 68 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65  hanges the value
11ed0 73 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20  s of iLimit and 
11ee0 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a  iOffset only if.
11ef0 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66  ** a limit or of
11f00 66 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20  fset is defined 
11f10 62 79 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74  by pLimit->pLeft
11f20 20 61 6e 64 20 70 4c 69 6d 69 74 2d 3e 70 52 69   and pLimit->pRi
11f30 67 68 74 2e 20 20 69 4c 69 6d 69 74 0a 2a 2a 20  ght.  iLimit.** 
11f40 61 6e 64 20 69 4f 66 66 73 65 74 20 73 68 6f 75  and iOffset shou
11f50 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
11f60 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
11f70 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
11f80 73 20 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f  s (zero).** prio
11f90 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
11fa0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
11fb0 20 54 68 65 20 69 4f 66 66 73 65 74 20 72 65 67   The iOffset reg
11fc0 69 73 74 65 72 20 28 69 66 20 69 74 20 65 78 69  ister (if it exi
11fd0 73 74 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69  sts) is initiali
11fe0 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  zed to the value
11ff0 0a 2a 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45  .** of the OFFSE
12000 54 2e 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72  T.  The iLimit r
12010 65 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69  egister is initi
12020 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e  alized to LIMIT.
12030 20 20 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f    Register.** iO
12040 66 66 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69  ffset+1 is initi
12050 61 6c 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b  alized to LIMIT+
12060 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  OFFSET..**.** On
12070 6c 79 20 69 66 20 70 4c 69 6d 69 74 2d 3e 70 4c  ly if pLimit->pL
12080 65 66 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69  eft!=0 do the li
12090 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65  mit registers ge
120a0 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20  t.** redefined. 
120b0 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
120c0 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69  perator uses thi
120d0 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f  s property to fo
120e0 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65  rce.** the reuse
120f0 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d   of the same lim
12100 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65  it and offset re
12110 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d  gisters across m
12120 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43  ultiple.** SELEC
12130 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  T statements..*/
12140 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d  .static void com
12150 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
12160 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
12170 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
12180 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65   iBreak){.  Vdbe
12190 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *v = 0;.  int i
121a0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Limit = 0;.  int
121b0 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20   iOffset;.  int 
121c0 6e 3b 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  n;.  Expr *pLimi
121d0 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 0a  t = p->pLimit;..
121e0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
121f0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
12200 0a 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22  .  ** "LIMIT -1"
12210 20 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c   always shows al
12220 6c 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69  l rows.  There i
12230 73 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74  s some.  ** cont
12240 72 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77 68  roversy about wh
12250 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
12260 65 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62  ehavior should b
12270 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72  e..  ** The curr
12280 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
12290 6f 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c  on interprets "L
122a0 49 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a  IMIT 0" to mean.
122b0 20 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20    ** no rows..  
122c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
122d0 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
122e0 65 29 3b 0a 20 20 69 66 28 20 70 4c 69 6d 69 74  e);.  if( pLimit
122f0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12300 70 4c 69 6d 69 74 2d 3e 6f 70 3d 3d 54 4b 5f 4c  pLimit->op==TK_L
12310 49 4d 49 54 20 29 3b 0a 20 20 20 20 61 73 73 65  IMIT );.    asse
12320 72 74 28 20 70 4c 69 6d 69 74 2d 3e 70 4c 65 66  rt( pLimit->pLef
12330 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 69  t!=0 );.    p->i
12340 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d  Limit = iLimit =
12350 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
12360 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
12370 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
12380 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 21 3d  .    assert( v!=
12390 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 );.    if( sql
123a0 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
123b0 72 28 70 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c  r(pLimit->pLeft,
123c0 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71   &n) ){.      sq
123d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
123e0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e  v, OP_Integer, n
123f0 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
12400 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
12410 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
12420 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d  ));.      if( n=
12430 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
12440 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
12450 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
12460 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26  }else if( n>=0 &
12470 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  & p->nSelectRow>
12480 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75  sqlite3LogEst((u
12490 36 34 29 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  64)n) ){.       
124a0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
124b0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28   sqlite3LogEst((
124c0 75 36 34 29 6e 29 3b 0a 20 20 20 20 20 20 20 20  u64)n);.        
124d0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
124e0 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a 20 20  F_FixedLimit;.  
124f0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
12500 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
12510 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
12520 4c 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 69 4c  Limit->pLeft, iL
12530 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  imit);.      sql
12540 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
12550 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
12560 69 4c 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76  iLimit); VdbeCov
12570 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
12580 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
12590 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29  "LIMIT counter")
125a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
125b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
125c0 5f 49 66 4e 6f 74 2c 20 69 4c 69 6d 69 74 2c 20  _IfNot, iLimit, 
125d0 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  iBreak); VdbeCov
125e0 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 0a  erage(v);.    }.
125f0 20 20 20 20 69 66 28 20 70 4c 69 6d 69 74 2d 3e      if( pLimit->
12600 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
12610 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66  p->iOffset = iOf
12620 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  fset = ++pParse-
12630 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
12640 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f  rse->nMem++;   /
12650 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78  * Allocate an ex
12660 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72  tra register for
12670 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f   limit+offset */
12680 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
12690 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
126a0 4c 69 6d 69 74 2d 3e 70 52 69 67 68 74 2c 20 69  Limit->pRight, i
126b0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
126c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
126d0 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
126e0 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65  , iOffset); Vdbe
126f0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
12700 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
12710 76 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74  v, "OFFSET count
12720 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  er"));.      sql
12730 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
12740 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69 6d 69 74  , OP_OffsetLimit
12750 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65  , iLimit, iOffse
12760 74 2b 31 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  t+1, iOffset);. 
12770 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
12780 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53  ((v, "LIMIT+OFFS
12790 45 54 22 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ET"));.    }.  }
127a0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
127b0 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
127c0 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65  _SELECT./*.** Re
127d0 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
127e0 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  iate collating s
127f0 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
12800 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
12810 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  f.** the result 
12820 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  set for the comp
12830 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74  ound-select stat
12840 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75  ement "p".  Retu
12850 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68  rn NULL if.** th
12860 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20  e column has no 
12870 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
12880 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
12890 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
128a0 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
128b0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
128c0 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
128d0 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
128e0 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65  term of the sele
128f0 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  ct that has a co
12900 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
12910 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ..*/.static Coll
12920 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  Seq *multiSelect
12930 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
12940 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
12950 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43  , int iCol){.  C
12960 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20  ollSeq *pRet;.  
12970 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
12980 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74  .    pRet = mult
12990 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
129a0 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72  Parse, p->pPrior
129b0 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  , iCol);.  }else
129c0 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  {.    pRet = 0;.
129d0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43    }.  assert( iC
129e0 6f 6c 3e 3d 30 20 29 3b 0a 20 20 2f 2a 20 69 43  ol>=0 );.  /* iC
129f0 6f 6c 20 6d 75 73 74 20 62 65 20 6c 65 73 73 20  ol must be less 
12a00 74 68 61 6e 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  than p->pEList->
12a10 6e 45 78 70 72 2e 20 20 4f 74 68 65 72 77 69 73  nExpr.  Otherwis
12a20 65 20 61 6e 20 65 72 72 6f 72 20 77 6f 75 6c 64  e an error would
12a30 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
12a40 74 68 72 6f 77 6e 20 64 75 72 69 6e 67 20 6e 61  thrown during na
12a50 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6e  me resolution an
12a60 64 20 77 65 20 77 6f 75 6c 64 20 6e 6f 74 20 68  d we would not h
12a70 61 76 65 20 67 6f 74 74 65 6e 0a 20 20 2a 2a 20  ave gotten.  ** 
12a80 74 68 69 73 20 66 61 72 20 2a 2f 0a 20 20 69 66  this far */.  if
12a90 28 20 70 52 65 74 3d 3d 30 20 26 26 20 41 4c 57  ( pRet==0 && ALW
12aa0 41 59 53 28 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69  AYS(iCol<p->pELi
12ab0 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
12ac0 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
12ad0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
12ae0 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
12af0 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20  [iCol].pExpr);. 
12b00 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
12b10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
12b20 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
12b30 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
12b40 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
12b50 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
12b60 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f  ECT.** with an O
12b70 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
12b80 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
12b90 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75  locates and retu
12ba0 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a  rns a KeyInfo.**
12bb0 20 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61   structure suita
12bc0 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e  ble for implemen
12bd0 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
12be0 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  Y..**.** Space t
12bf0 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e  o hold the KeyIn
12c00 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
12c10 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
12c20 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e  lloc. The callin
12c30 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  g.** function is
12c40 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
12c50 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74   ensuring that t
12c60 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
12c70 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
12c80 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reed..*/.static 
12c90 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65  KeyInfo *multiSe
12ca0 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
12cb0 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
12cc0 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
12cd0 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72   nExtra){.  Expr
12ce0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
12cf0 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
12d00 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  int nOrderBy = p
12d10 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
12d20 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r;.  sqlite3 *db
12d30 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
12d40 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d   KeyInfo *pRet =
12d50 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
12d60 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42  lloc(db, nOrderB
12d70 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20  y+nExtra, 1);.  
12d80 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
12d90 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
12da0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
12db0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
12dc0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
12dd0 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65   *pItem = &pOrde
12de0 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  rBy->a[i];.     
12df0 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70   Expr *pTerm = p
12e00 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
12e10 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
12e20 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54  l;..      if( pT
12e30 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  erm->flags & EP_
12e40 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
12e50 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
12e60 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
12e70 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20  arse, pTerm);.  
12e80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12e90 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69     pColl = multi
12ea0 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
12eb0 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e  arse, p, pItem->
12ec0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d  u.x.iOrderByCol-
12ed0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
12ee0 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c  pColl==0 ) pColl
12ef0 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
12f00 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
12f10 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  By->a[i].pExpr =
12f20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12f30 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
12f40 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70  String(pParse, p
12f50 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  Term, pColl->zNa
12f60 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
12f70 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
12f80 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
12f90 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20  able(pRet) );.  
12fa0 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b      pRet->aColl[
12fb0 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
12fc0 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64    pRet->aSortOrd
12fd0 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
12fe0 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
12ff0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
13000 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23  eturn pRet;.}..#
13010 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13020 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69  IT_CTE./*.** Thi
13030 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
13040 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f  tes VDBE code to
13050 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e   compute the con
13060 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52  tent of a WITH R
13070 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72  ECURSIVE.** quer
13080 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  y of the form:.*
13090 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76  *.**   <recursiv
130a0 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65  e-table> AS (<se
130b0 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e  tup-query> UNION
130c0 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76   [ALL] <recursiv
130d0 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20  e-query>).**    
130e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130f0 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
13100 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  _/             \
13110 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
13120 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
13130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
13140 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20  >pPrior         
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a               p.*
13160 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  *.**.** There is
13170 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66   exactly one ref
13180 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65  erence to the re
13190 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e  cursive-table in
131a0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
131b0 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65  .** of recursive
131c0 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77  -query, marked w
131d0 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d  ith the SrcList-
131e0 3e 61 5b 5d 2e 66 67 2e 69 73 52 65 63 75 72 73  >a[].fg.isRecurs
131f0 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20  ive flag..**.** 
13200 54 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20  The setup-query 
13210 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e  runs once to gen
13220 65 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61 6c  erate an initial
13230 20 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68 61   set of rows tha
13240 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51  t go.** into a Q
13250 75 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f 77  ueue table.  Row
13260 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64 20  s are extracted 
13270 66 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20 74  from the Queue t
13280 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f  able one by.** o
13290 6e 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65 78  ne.  Each row ex
132a0 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65  tracted from Que
132b0 75 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f 20  ue is output to 
132c0 70 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68 65  pDest.  Then the
132d0 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61   single.** extra
132e0 63 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e  cted row (now in
132f0 20 74 68 65 20 69 43 75 72 72 65 6e 74 20 74 61   the iCurrent ta
13300 62 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68 65  ble) becomes the
13310 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a   content of the.
13320 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61 62  ** recursive-tab
13330 6c 65 20 66 6f 72 20 61 20 72 65 63 75 72 73 69  le for a recursi
13340 76 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20 54  ve-query run.  T
13350 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
13360 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
13370 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61 63  .** is added bac
13380 6b 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65  k into the Queue
13390 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e   table.  Then an
133a0 6f 74 68 65 72 20 72 6f 77 20 69 73 20 65 78 74  other row is ext
133b0 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75  racted from Queu
133c0 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74 65  e.** and the ite
133d0 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ration continues
133e0 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65   until the Queue
133f0 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
13400 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
13410 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70 65  mpound query ope
13420 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74  rator is UNION t
13430 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74 65  hen no duplicate
13440 20 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a 2a   rows are ever.*
13450 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
13460 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e  the Queue table.
13470 20 20 54 68 65 20 69 44 69 73 74 69 6e 63 74 20    The iDistinct 
13480 74 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63 6f  table keeps a co
13490 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a  py of all rows.*
134a0 2a 20 74 68 61 74 20 68 61 76 65 20 65 76 65 72  * that have ever
134b0 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20 69   been inserted i
134c0 6e 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63 61  nto Queue and ca
134d0 75 73 65 73 20 64 75 70 6c 69 63 61 74 65 73 20  uses duplicates 
134e0 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72 64  to be.** discard
134f0 65 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65 72  ed.  If the oper
13500 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c  ator is UNION AL
13510 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61 74  L, then duplicat
13520 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  es are allowed..
13530 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71 75  ** .** If the qu
13540 65 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45 52  ery has an ORDER
13550 20 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69 65   BY, then entrie
13560 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 74  s in the Queue t
13570 61 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69 6e  able are kept in
13580 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72 64  .** ORDER BY ord
13590 65 72 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  er and the first
135a0 20 65 6e 74 72 79 20 69 73 20 65 78 74 72 61 63   entry is extrac
135b0 74 65 64 20 66 6f 72 20 65 61 63 68 20 63 79 63  ted for each cyc
135c0 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20  le.  Without.** 
135d0 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65  an ORDER BY, the
135e0 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20   Queue table is 
135f0 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a  just a FIFO..**.
13600 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63 6c  ** If a LIMIT cl
13610 61 75 73 65 20 69 73 20 70 72 6f 76 69 64 65 64  ause is provided
13620 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61  , then the itera
13630 74 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65 72  tion stops after
13640 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68   LIMIT rows.** h
13650 61 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74 20  ave been output 
13660 74 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49 4d  to pDest.  A LIM
13670 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73  IT of zero means
13680 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f   to output no ro
13690 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61  ws and a.** nega
136a0 74 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73  tive LIMIT means
136b0 20 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20 72   to output all r
136c0 6f 77 73 2e 20 20 49 66 20 74 68 65 72 65 20 69  ows.  If there i
136d0 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54  s also an OFFSET
136e0 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68 20   clause.** with 
136f0 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65  a positive value
13700 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
13710 20 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73 20   OFFSET outputs 
13720 61 72 65 20 64 69 73 63 61 72 64 65 64 20 72 61  are discarded ra
13730 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69  ther.** than bei
13740 6e 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73 74  ng sent to pDest
13750 2e 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f 75  .  The LIMIT cou
13760 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  nt does not begi
13770 6e 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f 46  n until after OF
13780 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76  FSET.** rows hav
13790 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a  e been skipped..
137a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
137b0 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72  enerateWithRecur
137c0 73 69 76 65 51 75 65 72 79 28 0a 20 20 50 61 72  siveQuery(.  Par
137d0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
137e0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
137f0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
13800 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
13810 20 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69 76   /* The recursiv
13820 65 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20 63  e SELECT to be c
13830 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
13840 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
13850 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
13860 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
13870 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
13880 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63   *pSrc = p->pSrc
13890 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
138a0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
138b0 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79   recursive query
138c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d   */.  int nCol =
138d0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
138e0 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  r;  /* Number of
138f0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
13900 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65 20  recursive table 
13910 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
13920 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
13930 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
13940 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64  ed statement und
13950 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
13960 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
13970 74 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  tup = p->pPrior;
13980 20 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70 20     /* The setup 
13990 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61  query */.  int a
139a0 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20 20  ddrTop;         
139b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
139c0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
139d0 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20 61   int addrCont, a
139e0 64 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20 2f  ddrBreak;      /
139f0 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42  * CONTINUE and B
13a00 52 45 41 4b 20 61 64 64 72 65 73 73 65 73 20 2a  REAK addresses *
13a10 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74  /.  int iCurrent
13a20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13a30 20 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e 74    /* The Current
13a40 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
13a50 72 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20 20  regCurrent;     
13a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
13a70 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43 75  ister holding Cu
13a80 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20  rrent table */. 
13a90 20 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20 20   int iQueue;    
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13ab0 2a 20 54 68 65 20 51 75 65 75 65 20 74 61 62 6c  * The Queue tabl
13ac0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73 74  e */.  int iDist
13ad0 69 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20 20  inct = 0;       
13ae0 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72       /* To ensur
13af0 65 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74 73  e unique results
13b00 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69   if UNION */.  i
13b10 6e 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f 46  nt eDest = SRT_F
13b20 69 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ifo;         /* 
13b30 48 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f 20  How to write to 
13b40 51 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63  Queue */.  Selec
13b50 74 44 65 73 74 20 64 65 73 74 51 75 65 75 65 3b  tDest destQueue;
13b60 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
13b70 63 74 44 65 73 74 20 74 61 72 67 65 74 74 69 6e  ctDest targettin
13b80 67 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  g the Queue tabl
13b90 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
13ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bb0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
13bc0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
13bd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13be0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
13bf0 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72  t code */.  Expr
13c00 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
13c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13c20 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
13c30 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d   */.  Expr *pLim
13c40 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
13c50 20 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d      /* Saved LIM
13c60 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f  IT and OFFSET */
13c70 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c  .  int regLimit,
13c80 20 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20 20   regOffset;     
13c90 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75 73   /* Registers us
13ca0 65 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64 20  ed by LIMIT and 
13cb0 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20  OFFSET */..  /* 
13cc0 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69 7a 61  Obtain authoriza
13cd0 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65 63  tion to do a rec
13ce0 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f 0a  ursive query */.
13cf0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
13d00 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
13d10 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45 2c  QLITE_RECURSIVE,
13d20 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75   0, 0, 0) ) retu
13d30 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73  rn;..  /* Proces
13d40 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  s the LIMIT and 
13d50 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2c 20  OFFSET clauses, 
13d60 69 66 20 74 68 65 79 20 65 78 69 73 74 20 2a 2f  if they exist */
13d70 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73  .  addrBreak = s
13d80 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
13d90 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65  bel(v);.  p->nSe
13da0 6c 65 63 74 52 6f 77 20 3d 20 33 32 30 3b 20 20  lectRow = 320;  
13db0 2f 2a 20 34 20 62 69 6c 6c 69 6f 6e 20 72 6f 77  /* 4 billion row
13dc0 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69  s */.  computeLi
13dd0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
13de0 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61  rse, p, addrBrea
13df0 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70  k);.  pLimit = p
13e00 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4c  ->pLimit;.  regL
13e10 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
13e20 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20  ;.  regOffset = 
13e30 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d  p->iOffset;.  p-
13e40 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >pLimit = 0;.  p
13e50 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f  ->iLimit = p->iO
13e60 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72  ffset = 0;.  pOr
13e70 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
13e80 72 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  rBy;..  /* Locat
13e90 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  e the cursor num
13ea0 62 65 72 20 6f 66 20 74 68 65 20 43 75 72 72 65  ber of the Curre
13eb0 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f  nt table */.  fo
13ec0 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c  r(i=0; ALWAYS(i<
13ed0 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b  pSrc->nSrc); i++
13ee0 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  ){.    if( pSrc-
13ef0 3e 61 5b 69 5d 2e 66 67 2e 69 73 52 65 63 75 72  >a[i].fg.isRecur
13f00 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43  sive ){.      iC
13f10 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61  urrent = pSrc->a
13f20 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20  [i].iCursor;.   
13f30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13f40 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
13f50 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d 62 65  te cursors numbe
13f60 72 73 20 66 6f 72 20 51 75 65 75 65 20 61 6e 64  rs for Queue and
13f70 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68 65 20   Distinct.  The 
13f80 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
13f90 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73 74 69  r.  ** the Disti
13fa0 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74 20 62  nct table must b
13fb0 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 67 72  e exactly one gr
13fc0 65 61 74 65 72 20 74 68 61 6e 20 51 75 65 75 65  eater than Queue
13fd0 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a 20 66   in order.  ** f
13fe0 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73 74 46  or the SRT_DistF
13ff0 69 66 6f 20 61 6e 64 20 53 52 54 5f 44 69 73 74  ifo and SRT_Dist
14000 51 75 65 75 65 20 64 65 73 74 69 6e 61 74 69 6f  Queue destinatio
14010 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20  ns to work. */. 
14020 20 69 51 75 65 75 65 20 3d 20 70 50 61 72 73 65   iQueue = pParse
14030 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20  ->nTab++;.  if( 
14040 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
14050 29 7b 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70  ){.    eDest = p
14060 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f 44 69  OrderBy ? SRT_Di
14070 73 74 51 75 65 75 65 20 3a 20 53 52 54 5f 44 69  stQueue : SRT_Di
14080 73 74 46 69 66 6f 3b 0a 20 20 20 20 69 44 69 73  stFifo;.    iDis
14090 74 69 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e  tinct = pParse->
140a0 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  nTab++;.  }else{
140b0 0a 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72  .    eDest = pOr
140c0 64 65 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75  derBy ? SRT_Queu
140d0 65 20 3a 20 53 52 54 5f 46 69 66 6f 3b 0a 20 20  e : SRT_Fifo;.  
140e0 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  }.  sqlite3Selec
140f0 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 51  tDestInit(&destQ
14100 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75  ueue, eDest, iQu
14110 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  eue);..  /* Allo
14120 63 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72  cate cursors for
14130 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c   Current, Queue,
14140 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a   and Distinct. *
14150 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d  /.  regCurrent =
14160 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
14170 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
14180 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
14190 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c  seudo, iCurrent,
141a0 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f   regCurrent, nCo
141b0 6c 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72  l);.  if( pOrder
141c0 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  By ){.    KeyInf
141d0 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75  o *pKeyInfo = mu
141e0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
141f0 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
14200 70 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, 1);.    sqlit
14210 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
14220 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
14230 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72  , iQueue, pOrder
14240 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a  By->nExpr+2, 0,.
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14260 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
14270 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
14280 4f 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75  O);.    destQueu
14290 65 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  e.pOrderBy = pOr
142a0 64 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a  derBy;.  }else{.
142b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
142c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
142d0 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75  Ephemeral, iQueu
142e0 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20  e, nCol);.  }.  
142f0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
14300 22 51 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b  "Queue table"));
14310 0a 20 20 69 66 28 20 69 44 69 73 74 69 6e 63 74  .  if( iDistinct
14320 20 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f   ){.    p->addrO
14330 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c  penEphm[0] = sql
14340 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14350 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
14360 61 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30  al, iDistinct, 0
14370 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  );.    p->selFla
14380 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68  gs |= SF_UsesEph
14390 65 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f  emeral;.  }..  /
143a0 2a 20 44 65 74 61 63 68 20 74 68 65 20 4f 52 44  * Detach the ORD
143b0 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f  ER BY clause fro
143c0 6d 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53  m the compound S
143d0 45 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f  ELECT */.  p->pO
143e0 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f  rderBy = 0;..  /
143f0 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  * Store the resu
14400 6c 74 73 20 6f 66 20 74 68 65 20 73 65 74 75 70  lts of the setup
14410 2d 71 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e  -query in Queue.
14420 20 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e   */.  pSetup->pN
14430 65 78 74 20 3d 20 30 3b 0a 20 20 45 78 70 6c 61  ext = 0;.  Expla
14440 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61  inQueryPlan((pPa
14450 72 73 65 2c 20 31 2c 20 22 53 45 54 55 50 22 29  rse, 1, "SETUP")
14460 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
14470 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
14480 70 53 65 74 75 70 2c 20 26 64 65 73 74 51 75 65  pSetup, &destQue
14490 75 65 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70  ue);.  pSetup->p
144a0 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69 66 28 20  Next = p;.  if( 
144b0 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66  rc ) goto end_of
144c0 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79  _recursive_query
144d0 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ;..  /* Find the
144e0 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65   next row in the
144f0 20 51 75 65 75 65 20 61 6e 64 20 6f 75 74 70 75   Queue and outpu
14500 74 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20  t that row */.  
14510 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
14520 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14530 50 5f 52 65 77 69 6e 64 2c 20 69 51 75 65 75 65  P_Rewind, iQueue
14540 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 20 56 64  , addrBreak); Vd
14550 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
14560 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68    /* Transfer th
14570 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 51 75  e next row in Qu
14580 65 75 65 20 6f 76 65 72 20 74 6f 20 43 75 72 72  eue over to Curr
14590 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ent */.  sqlite3
145a0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
145b0 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65  _NullRow, iCurre
145c0 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74  nt); /* To reset
145d0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f   column cache */
145e0 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
145f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
14600 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
14610 6f 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70  olumn, iQueue, p
14620 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31  OrderBy->nExpr+1
14630 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20  , regCurrent);. 
14640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
14650 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14660 20 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 51 75   OP_RowData, iQu
14670 65 75 65 2c 20 72 65 67 43 75 72 72 65 6e 74 29  eue, regCurrent)
14680 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
14690 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
146a0 44 65 6c 65 74 65 2c 20 69 51 75 65 75 65 29 3b  Delete, iQueue);
146b0 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68  ..  /* Output th
146c0 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20  e single row in 
146d0 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64  Current */.  add
146e0 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  rCont = sqlite3V
146f0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
14700 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c  .  codeOffset(v,
14710 20 72 65 67 4f 66 66 73 65 74 2c 20 61 64 64 72   regOffset, addr
14720 43 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74 49  Cont);.  selectI
14730 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
14740 20 70 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20   p, iCurrent,.  
14750 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c      0, 0, pDest,
14760 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42   addrCont, addrB
14770 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67  reak);.  if( reg
14780 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
14790 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
147a0 2c 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72  , OP_DecrJumpZer
147b0 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64  o, regLimit, add
147c0 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62  rBreak);.    Vdb
147d0 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
147e0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
147f0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
14800 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20  ddrCont);..  /* 
14810 45 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75  Execute the recu
14820 72 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b  rsive SELECT tak
14830 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72  ing the single r
14840 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73  ow in Current as
14850 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  .  ** the value 
14860 66 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76  for the recursiv
14870 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74  e-table. Store t
14880 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68  he results in th
14890 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20  e Queue..  */.  
148a0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
148b0 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  & SF_Aggregate )
148c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
148d0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
148e0 65 63 75 72 73 69 76 65 20 61 67 67 72 65 67 61  ecursive aggrega
148f0 74 65 20 71 75 65 72 69 65 73 20 6e 6f 74 20 73  te queries not s
14900 75 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 7d 65  upported");.  }e
14910 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69  lse{.    p->pPri
14920 6f 72 20 3d 20 30 3b 0a 20 20 20 20 45 78 70 6c  or = 0;.    Expl
14930 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50  ainQueryPlan((pP
14940 61 72 73 65 2c 20 31 2c 20 22 52 45 43 55 52 53  arse, 1, "RECURS
14950 49 56 45 20 53 54 45 50 22 29 29 3b 0a 20 20 20  IVE STEP"));.   
14960 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
14970 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51  Parse, p, &destQ
14980 75 65 75 65 29 3b 0a 20 20 20 20 61 73 73 65 72  ueue);.    asser
14990 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
149a0 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  );.    p->pPrior
149b0 20 3d 20 70 53 65 74 75 70 3b 0a 20 20 7d 0a 0a   = pSetup;.  }..
149c0 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e 69 6e    /* Keep runnin
149d0 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74 69 6c  g the loop until
149e0 20 74 68 65 20 51 75 65 75 65 20 69 73 20 65 6d   the Queue is em
149f0 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  pty */.  sqlite3
14a00 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64 64 72  VdbeGoto(v, addr
14a10 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Top);.  sqlite3V
14a20 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
14a30 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a  v, addrBreak);..
14a40 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65  end_of_recursive
14a50 5f 71 75 65 72 79 3a 0a 20 20 73 71 6c 69 74 65  _query:.  sqlite
14a60 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
14a70 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
14a80 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 2d 3e 70  OrderBy);.  p->p
14a90 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
14aa0 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  By;.  p->pLimit 
14ab0 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 72 65 74 75  = pLimit;.  retu
14ac0 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
14ad0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20  SQLITE_OMIT_CTE 
14ae0 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  */../* Forward r
14af0 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61  eferences */.sta
14b00 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
14b10 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
14b20 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
14b30 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
14b40 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
14b50 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
14b60 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
14b70 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
14b80 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
14b90 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
14ba0 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
14bb0 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
14bc0 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 2f 2a  esults */.);../*
14bd0 0a 2a 2a 20 48 61 6e 64 6c 65 20 74 68 65 20 73  .** Handle the s
14be0 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 61  pecial case of a
14bf0 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
14c00 20 74 68 61 74 20 6f 72 69 67 69 6e 61 74 65 73   that originates
14c10 20 66 72 6f 6d 20 61 0a 2a 2a 20 56 41 4c 55 45   from a.** VALUE
14c20 53 20 63 6c 61 75 73 65 2e 20 20 42 79 20 68 61  S clause.  By ha
14c30 6e 64 6c 69 6e 67 20 74 68 69 73 20 61 73 20 61  ndling this as a
14c40 20 73 70 65 63 69 61 6c 20 63 61 73 65 2c 20 77   special case, w
14c50 65 20 61 76 6f 69 64 20 64 65 65 70 0a 2a 2a 20  e avoid deep.** 
14c60 72 65 63 75 72 73 69 6f 6e 2c 20 61 6e 64 20 74  recursion, and t
14c70 68 75 73 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20  hus do not need 
14c80 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 65 20 53  to enforce the S
14c90 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
14ca0 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2a 2a 20 6f  OUND_SELECT.** o
14cb0 6e 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75 73  n a VALUES claus
14cc0 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 63 61 75 73 65  e..**.** Because
14cd0 20 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65   the Select obje
14ce0 63 74 20 6f 72 69 67 69 6e 61 74 65 73 20 66 72  ct originates fr
14cf0 6f 6d 20 61 20 56 41 4c 55 45 53 20 63 6c 61 75  om a VALUES clau
14d00 73 65 3a 0a 2a 2a 20 20 20 28 31 29 20 54 68 65  se:.**   (1) The
14d10 72 65 20 69 73 20 6e 6f 20 4c 49 4d 49 54 20 6f  re is no LIMIT o
14d20 72 20 4f 46 46 53 45 54 20 6f 72 20 65 6c 73 65  r OFFSET or else
14d30 20 74 68 65 72 65 20 69 73 20 61 20 4c 49 4d 49   there is a LIMI
14d40 54 20 6f 66 20 65 78 61 63 74 6c 79 20 31 0a 2a  T of exactly 1.*
14d50 2a 20 20 20 28 32 29 20 41 6c 6c 20 74 65 72 6d  *   (2) All term
14d60 73 20 61 72 65 20 55 4e 49 4f 4e 20 41 4c 4c 0a  s are UNION ALL.
14d70 2a 2a 20 20 20 28 33 29 20 54 68 65 72 65 20 69  **   (3) There i
14d80 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
14d90 61 75 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  ause.**.** The "
14da0 4c 49 4d 49 54 20 6f 66 20 65 78 61 63 74 6c 79  LIMIT of exactly
14db0 20 31 22 20 63 61 73 65 20 6f 66 20 63 6f 6e 64   1" case of cond
14dc0 69 74 69 6f 6e 20 28 31 29 20 63 6f 6d 65 73 20  ition (1) comes 
14dd0 61 62 6f 75 74 20 77 68 65 6e 20 61 20 56 41 4c  about when a VAL
14de0 55 45 53 0a 2a 2a 20 63 6c 61 75 73 65 20 6f 63  UES.** clause oc
14df0 63 75 72 73 20 77 69 74 68 69 6e 20 73 63 61 6c  curs within scal
14e00 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 28 65  ar expression (e
14e10 78 3a 20 22 53 45 4c 45 43 54 20 28 56 41 4c 55  x: "SELECT (VALU
14e20 45 53 28 31 29 2c 28 32 29 2c 28 33 29 29 22 29  ES(1),(2),(3))")
14e30 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  ..** The sqlite3
14e40 43 6f 64 65 53 75 62 73 65 6c 65 63 74 20 77 69  CodeSubselect wi
14e50 6c 6c 20 68 61 76 65 20 61 64 64 65 64 20 74 68  ll have added th
14e60 65 20 4c 49 4d 49 54 20 31 20 63 6c 61 75 73 65  e LIMIT 1 clause
14e70 20 69 6e 20 74 68 74 20 63 61 73 65 2e 0a 2a 2a   in tht case..**
14e80 20 53 69 6e 63 65 20 74 68 65 20 6c 69 6d 69 74   Since the limit
14e90 20 69 73 20 65 78 61 63 74 6c 79 20 31 2c 20 77   is exactly 1, w
14ea0 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 65  e only need to e
14eb0 76 61 6c 75 74 65 73 20 74 68 65 20 6c 65 66 74  valutes the left
14ec0 2d 6d 6f 73 74 20 56 41 4c 55 45 53 2e 0a 2a 2f  -most VALUES..*/
14ed0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
14ee0 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 0a 20  iSelectValues(. 
14ef0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14f00 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
14f10 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
14f20 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
14f30 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
14f40 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
14f50 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
14f60 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
14f70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
14f80 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
14f90 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
14fa0 20 20 69 6e 74 20 6e 52 6f 77 20 3d 20 31 3b 0a    int nRow = 1;.
14fb0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
14fc0 69 6e 74 20 62 53 68 6f 77 41 6c 6c 20 3d 20 70  int bShowAll = p
14fd0 2d 3e 70 4c 69 6d 69 74 3d 3d 30 3b 0a 20 20 61  ->pLimit==0;.  a
14fe0 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61  ssert( p->selFla
14ff0 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c  gs & SF_MultiVal
15000 75 65 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  ue );.  do{.    
15010 61 73 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c  assert( p->selFl
15020 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20  ags & SF_Values 
15030 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
15040 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20  ->op==TK_ALL || 
15050 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43  (p->op==TK_SELEC
15060 54 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  T && p->pPrior==
15070 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
15080 28 20 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 7c 7c  ( p->pNext==0 ||
15090 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
150a0 72 3d 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c  r==p->pNext->pEL
150b0 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
150c0 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d    if( p->pPrior=
150d0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
150e0 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69 6f  assert( p->pPrio
150f0 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 29 3b 0a 20  r->pNext==p );. 
15100 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72     p = p->pPrior
15110 3b 0a 20 20 20 20 6e 52 6f 77 20 2b 3d 20 62 53  ;.    nRow += bS
15120 68 6f 77 41 6c 6c 3b 0a 20 20 7d 77 68 69 6c 65  howAll;.  }while
15130 28 31 29 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75  (1);.  ExplainQu
15140 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
15150 20 30 2c 20 22 53 43 41 4e 20 25 64 20 43 4f 4e   0, "SCAN %d CON
15160 53 54 41 4e 54 20 52 4f 57 25 73 22 2c 20 6e 52  STANT ROW%s", nR
15170 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
15180 20 20 20 20 20 20 20 20 6e 52 6f 77 3d 3d 31 20          nRow==1 
15190 3f 20 22 22 20 3a 20 22 53 22 29 29 3b 0a 20 20  ? "" : "S"));.  
151a0 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
151b0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
151c0 70 50 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 30  pParse, p, -1, 0
151d0 2c 20 30 2c 20 70 44 65 73 74 2c 20 31 2c 20 31  , 0, pDest, 1, 1
151e0 29 3b 0a 20 20 20 20 69 66 28 20 21 62 53 68 6f  );.    if( !bSho
151f0 77 41 6c 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20  wAll ) break;.  
15200 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
15210 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 70 20 3d 20  = nRow;.    p = 
15220 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
15230 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15240 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15250 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
15260 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ocess a compound
15270 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d   query form from
15280 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  .** two or more 
15290 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65 73  separate queries
152a0 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e   using UNION, UN
152b0 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c  ION ALL, EXCEPT,
152c0 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54   or.** INTERSECT
152d0 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74  .**.** "p" point
152e0 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
152f0 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20 71  ost of the two q
15300 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75 65  ueries.  the que
15310 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66  ry on the.** lef
15320 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20  t is p->pPrior. 
15330 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79 20   The left query 
15340 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61 20  could also be a 
15350 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a  compound query.*
15360 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20  * in which case 
15370 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
15380 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63 75  l be called recu
15390 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20  rsively. .**.** 
153a0 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  The results of t
153b0 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20 61  he total query a
153c0 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  re to be written
153d0 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61 74   into a destinat
153e0 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65  ion.** of type e
153f0 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d 65  Dest with parame
15400 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a  ter iParm..**.**
15410 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e   Example 1:  Con
15420 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77 61  sider a three-wa
15430 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73  y compound SQL s
15440 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
15450 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
15460 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43  M t1 UNION SELEC
15470 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f  T b FROM t2 UNIO
15480 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20  N SELECT c FROM 
15490 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74  t3.**.** This st
154a0 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
154b0 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  d up as follows:
154c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
154d0 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20  T c FROM t3.**  
154e0 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d      |.**      `-
154f0 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62 20  ---->  SELECT b 
15500 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20  FROM t2.**      
15510 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20            |.**  
15520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60 2d                `-
15530 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61  ----->  SELECT a
15540 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54   FROM t1.**.** T
15550 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68 65  he arrows in the
15560 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 72   diagram above r
15570 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65 6c  epresent the Sel
15580 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74  ect.pPrior point
15590 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69  er..** So if thi
155a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
155b0 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61 6c  led with p equal
155c0 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72 79   to the t3 query
155d0 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72  , then.** pPrior
155e0 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32 20   will be the t2 
155f0 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69  query.  p->op wi
15600 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69  ll be TK_UNION i
15610 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
15620 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 62  ** Notice that b
15630 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
15640 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73 20  y SQLite parses 
15650 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  compound SELECTs
15660 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  , the.** individ
15670 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77 61  ual selects alwa
15680 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65  ys group from le
15690 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a  ft to right..*/.
156a0 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
156b0 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20  Select(.  Parse 
156c0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
156d0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
156e0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
156f0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
15700 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
15710 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65  of SELECTs to be
15720 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
15730 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
15740 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
15750 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
15760 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ts */.){.  int r
15770 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
15780 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64 65   /* Success code
15790 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74 69   from a subrouti
157a0 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ne */.  Select *
157b0 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
157c0 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
157d0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
157e0 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
157f0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
15800 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
15810 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
15820 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
15830 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20 41   dest;      /* A
15840 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61 20  lternative data 
15850 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
15860 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74 65   Select *pDelete
15870 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20   = 0;  /* Chain 
15880 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74  of simple select
15890 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
158a0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
158b0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
158c0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
158d0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
158e0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
158f0 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
15900 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
15910 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
15920 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
15930 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
15940 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
15950 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
15960 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
15970 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
15980 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
15990 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
159a0 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
159b0 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73  is much */.  ass
159c0 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
159d0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
159e0 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  )==0 || p->op==T
159f0 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  K_ALL || p->op==
15a00 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62  TK_UNION );.  db
15a10 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
15a20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
15a30 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70  ior;.  dest = *p
15a40 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69  Dest;.  if( pPri
15a50 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 7c 7c 20  or->pOrderBy || 
15a60 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
15a70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
15a80 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73  orMsg(pParse,"%s
15a90 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
15aa0 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
15ab0 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
15ac0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
15ad0 21 3d 30 20 3f 20 22 4f 52 44 45 52 20 42 59 22  !=0 ? "ORDER BY"
15ae0 20 3a 20 22 4c 49 4d 49 54 22 2c 20 73 65 6c 65   : "LIMIT", sele
15af0 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
15b00 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
15b10 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
15b20 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ect_end;.  }..  
15b30 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
15b40 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
15b50 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f  sert( v!=0 );  /
15b60 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61  * The VDBE alrea
15b70 64 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61  dy created by ca
15b80 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a  lling function *
15b90 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74  /..  /* Create t
15ba0 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
15bb0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
15bc0 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f  f necessary.  */
15bd0 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73  .  if( dest.eDes
15be0 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
15bf0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
15c00 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
15c10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15c20 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
15c30 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50  meral, dest.iSDP
15c40 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  arm, p->pEList->
15c50 6e 45 78 70 72 29 3b 0a 20 20 20 20 64 65 73 74  nExpr);.    dest
15c60 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62  .eDest = SRT_Tab
15c70 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  le;.  }..  /* Sp
15c80 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 20 66  ecial handling f
15c90 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65  or a compound-se
15ca0 6c 65 63 74 20 74 68 61 74 20 6f 72 69 67 69 6e  lect that origin
15cb0 61 74 65 73 20 61 73 20 61 20 56 41 4c 55 45 53  ates as a VALUES
15cc0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
15cd0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
15ce0 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 20  & SF_MultiValue 
15cf0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  ){.    rc = mult
15d00 69 53 65 6c 65 63 74 56 61 6c 75 65 73 28 70 50  iSelectValues(pP
15d10 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
15d20 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
15d30 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
15d40 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
15d50 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74  all SELECTs in t
15d60 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76  he statement hav
15d70 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
15d80 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20  r of elements.  
15d90 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75  ** in their resu
15da0 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20  lt sets..  */.  
15db0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
15dc0 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c  t && pPrior->pEL
15dd0 69 73 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ist );.  assert(
15de0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
15df0 72 3d 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r==pPrior->pELis
15e00 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 0a 23 69 66  t->nExpr );..#if
15e10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15e20 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65  _CTE.  if( p->se
15e30 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
15e40 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e  rsive ){.    gen
15e50 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69  erateWithRecursi
15e60 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c 20  veQuery(pParse, 
15e70 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c  p, &dest);.  }el
15e80 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  se.#endif..  /* 
15e90 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73  Compound SELECTs
15ea0 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52   that have an OR
15eb0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
15ec0 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61  e handled separa
15ed0 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
15ee0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a   p->pOrderBy ){.
15ef0 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69      return multi
15f00 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50  SelectOrderBy(pP
15f10 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b  arse, p, pDest);
15f20 0a 20 20 7d 65 6c 73 65 7b 0a 0a 23 69 66 6e 64  .  }else{..#ifnd
15f30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
15f40 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70  XPLAIN.    if( p
15f50 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30  Prior->pPrior==0
15f60 20 29 7b 0a 20 20 20 20 20 20 45 78 70 6c 61 69   ){.      Explai
15f70 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
15f80 73 65 2c 20 31 2c 20 22 43 4f 4d 50 4f 55 4e 44  se, 1, "COMPOUND
15f90 20 51 55 45 52 59 22 29 29 3b 0a 20 20 20 20 20   QUERY"));.     
15fa0 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61   ExplainQueryPla
15fb0 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22 4c  n((pParse, 1, "L
15fc0 45 46 54 2d 4d 4f 53 54 20 53 55 42 51 55 45 52  EFT-MOST SUBQUER
15fd0 59 22 29 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Y"));.    }.#end
15fe0 69 66 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72  if..    /* Gener
15ff0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
16000 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20   left and right 
16010 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
16020 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 77  s..    */.    sw
16030 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
16040 20 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c       case TK_ALL
16050 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  : {.        int 
16060 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  addr = 0;.      
16070 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20    int nLimit;.  
16080 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
16090 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b  Prior->pLimit );
160a0 0a 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2d  .        pPrior-
160b0 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  >iLimit = p->iLi
160c0 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 70 50 72  mit;.        pPr
160d0 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70  ior->iOffset = p
160e0 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
160f0 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69     pPrior->pLimi
16100 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
16110 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16120 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
16130 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74 29  , pPrior, &dest)
16140 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69  ;.        p->pLi
16150 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mit = 0;.       
16160 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
16170 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
16180 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
16190 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 2d      }.        p-
161a0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
161b0 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
161c0 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b   pPrior->iLimit;
161d0 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  .        p->iOff
161e0 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f  set = pPrior->iO
161f0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 69  ffset;.        i
16200 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
16210 20 20 20 20 20 20 20 20 20 20 61 64 64 72 20 3d            addr =
16220 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16230 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
16240 70 2d 3e 69 4c 69 6d 69 74 29 3b 20 56 64 62 65  p->iLimit); Vdbe
16250 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
16260 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
16270 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65  nt((v, "Jump ahe
16280 61 64 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63  ad if LIMIT reac
16290 68 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20  hed"));.        
162a0 20 20 69 66 28 20 70 2d 3e 69 4f 66 66 73 65 74    if( p->iOffset
162b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
162c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
162d0 33 28 76 2c 20 4f 50 5f 4f 66 66 73 65 74 4c 69  3(v, OP_OffsetLi
162e0 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mit,.           
162f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16300 20 20 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 70 2d     p->iLimit, p-
16310 3e 69 4f 66 66 73 65 74 2b 31 2c 20 70 2d 3e 69  >iOffset+1, p->i
16320 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
16330 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
16340 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e 51 75         ExplainQu
16350 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c  eryPlan((pParse,
16360 20 31 2c 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 29   1, "UNION ALL")
16370 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
16380 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
16390 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
163a0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
163b0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
163c0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c   );.        pDel
163d0 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
163e0 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69  .        p->pPri
163f0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20  or = pPrior;.   
16400 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
16410 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
16420 73 74 41 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74  stAdd(p->nSelect
16430 52 6f 77 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65  Row, pPrior->nSe
16440 6c 65 63 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  lectRow);.      
16450 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
16460 69 6d 69 74 0a 20 20 20 20 20 20 20 20 20 26 26  imit.         &&
16470 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
16480 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c  teger(pPrior->pL
16490 69 6d 69 74 2d 3e 70 4c 65 66 74 2c 20 26 6e 4c  imit->pLeft, &nL
164a0 69 6d 69 74 29 0a 20 20 20 20 20 20 20 20 20 26  imit).         &
164b0 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d  & nLimit>0 && p-
164c0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 73 71  >nSelectRow > sq
164d0 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36 34  lite3LogEst((u64
164e0 29 6e 4c 69 6d 69 74 29 20 0a 20 20 20 20 20 20  )nLimit) .      
164f0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
16500 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73  ->nSelectRow = s
16510 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 28 75 36  qlite3LogEst((u6
16520 34 29 6e 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  4)nLimit);.     
16530 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
16540 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20   addr ){.       
16550 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
16560 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
16570 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16580 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
16590 7d 0a 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f  }.      case TK_
165a0 45 58 43 45 50 54 3a 0a 20 20 20 20 20 20 63 61  EXCEPT:.      ca
165b0 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
165c0 20 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e         int union
165d0 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f  Tab;    /* Curso
165e0 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
165f0 74 65 6d 70 20 74 61 62 6c 65 20 68 6f 6c 64 69  temp table holdi
16600 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
16610 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20       u8 op = 0; 
16620 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
16630 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
16640 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
16650 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 20 20  self */.        
16660 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20  int priorOp;    
16670 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65   /* The SRT_ ope
16680 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20  ration to apply 
16690 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73  to prior selects
166a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
166b0 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20   *pLimit;    /* 
166c0 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66 20  Saved values of 
166d0 70 2d 3e 6e 4c 69 6d 69 74 20 20 2a 2f 0a 20 20  p->nLimit  */.  
166e0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
166f0 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44 65          SelectDe
16700 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 20 20  st uniondest;.  
16710 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
16720 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43  e( p->op==TK_EXC
16730 45 50 54 20 29 3b 0a 20 20 20 20 20 20 20 20 74  EPT );.        t
16740 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d  estcase( p->op==
16750 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
16760 20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52      priorOp = SR
16770 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 20  T_Union;.       
16780 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
16790 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
167a0 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20        /* We can 
167b0 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72  reuse a temporar
167c0 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  y table generate
167d0 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f  d by a SELECT to
167e0 20 6f 75 72 0a 20 20 20 20 20 20 20 20 20 20 2a   our.          *
167f0 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20  * right..       
16800 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
16810 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69  assert( p->pLimi
16820 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  t==0 );      /* 
16830 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
16840 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
16850 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e   */.          un
16860 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53  ionTab = dest.iS
16870 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20 20 7d  DParm;.        }
16880 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
16890 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64 20  /* We will need 
168a0 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77  to create our ow
168b0 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  n temporary tabl
168c0 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20  e to hold the.  
168d0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72          ** inter
168e0 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e  mediate results.
168f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
16900 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
16910 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
16920 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  +;.          ass
16930 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
16940 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
16950 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
16960 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16970 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75  OpenEphemeral, u
16980 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
16990 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
169a0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
169b0 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
169c0 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e       p->addrOpen
169d0 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a  Ephm[0] = addr;.
169e0 20 20 20 20 20 20 20 20 20 20 66 69 6e 64 52 69            findRi
169f0 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46  ghtmost(p)->selF
16a00 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
16a10 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
16a20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
16a30 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20  EList );.       
16a40 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a   }.  .        /*
16a50 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
16a60 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
16a70 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20  ur left.        
16a80 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
16a90 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64  t( !pPrior->pOrd
16aa0 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20 20 20  erBy );.        
16ab0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
16ac0 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64 65 73 74  tInit(&uniondest
16ad0 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e  , priorOp, union
16ae0 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 72 63  Tab);.        rc
16af0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
16b00 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
16b10 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
16b20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
16b30 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
16b40 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
16b50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
16b60 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
16b70 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
16b80 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20   statement.     
16b90 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
16ba0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45  ( p->op==TK_EXCE
16bb0 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  PT ){.          
16bc0 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
16bd0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
16be0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
16bf0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
16c00 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  N );.          o
16c10 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
16c20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16c30 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
16c40 20 20 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d          pLimit =
16c50 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
16c60 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
16c70 30 3b 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e  0;.        union
16c80 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b  dest.eDest = op;
16c90 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61 69 6e  .        Explain
16ca0 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
16cb0 65 2c 20 31 2c 20 22 25 73 20 55 53 49 4e 47 20  e, 1, "%s USING 
16cc0 54 45 4d 50 20 42 2d 54 52 45 45 22 2c 0a 20 20  TEMP B-TREE",.  
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ce0 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70          selectOp
16cf0 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 29 3b 0a 20  Name(p->op)));. 
16d00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16d10 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
16d20 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29  , p, &uniondest)
16d30 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
16d40 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
16d50 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K );.        /* 
16d60 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67  Query flattening
16d70 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
16d80 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c 6c  t() might refill
16d90 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20   p->pOrderBy..  
16da0 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
16db0 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
16dc0 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
16dd0 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
16de0 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
16df0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
16e00 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
16e10 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
16e20 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
16e30 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
16e40 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
16e50 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 70  Prior;.        p
16e60 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
16e70 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f          if( p->o
16e80 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20  p==TK_UNION ){. 
16e90 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c           p->nSel
16ea0 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  ectRow = sqlite3
16eb0 4c 6f 67 45 73 74 41 64 64 28 70 2d 3e 6e 53 65  LogEstAdd(p->nSe
16ec0 6c 65 63 74 52 6f 77 2c 20 70 50 72 69 6f 72 2d  lectRow, pPrior-
16ed0 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20 20  >nSelectRow);.  
16ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16ef0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
16f00 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
16f10 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4c 69  ;.        p->pLi
16f20 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
16f30 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20        p->iLimit 
16f40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
16f50 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 0a  iOffset = 0;.  .
16f60 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65          /* Conve
16f70 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
16f80 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
16f90 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
16fa0 20 66 6f 72 6d 0a 20 20 20 20 20 20 20 20 2a 2a   form.        **
16fb0 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63   it is that we c
16fc0 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20  urrently need.. 
16fd0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
16fe0 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54    assert( unionT
16ff0 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d  ab==dest.iSDParm
17000 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d   || dest.eDest!=
17010 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20  priorOp );.     
17020 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
17030 74 21 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20  t!=priorOp ){.  
17040 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6e          int iCon
17050 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74 61 72  t, iBreak, iStar
17060 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  t;.          ass
17070 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
17080 3b 0a 20 20 20 20 20 20 20 20 20 20 69 42 72 65  ;.          iBre
17090 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
170a0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
170b0 20 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20          iCont = 
170c0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
170d0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
170e0 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
170f0 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
17100 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
17110 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17120 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
17130 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
17140 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
17150 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
17160 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
17170 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
17180 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
17190 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
171a0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 75 6e  op(pParse, p, un
171b0 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20 20 20  ionTab,.        
171c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171d0 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69    0, 0, &dest, i
171e0 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
171f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17200 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
17210 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20  (v, iCont);.    
17220 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17230 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
17240 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
17250 74 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72  tart); VdbeCover
17260 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
17270 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
17280 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
17290 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eak);.          
172a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
172b0 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  2(v, OP_Close, u
172c0 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
172d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
172e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
172f0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
17300 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ert( p->op==TK_I
17310 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20  NTERSECT ); {.  
17320 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20        int tab1, 
17330 74 61 62 32 3b 0a 20 20 20 20 20 20 20 20 69 6e  tab2;.        in
17340 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
17350 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   iStart;.       
17360 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 0a 20   Expr *pLimit;. 
17370 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b         int addr;
17380 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 44  .        SelectD
17390 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
173a0 74 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  t;.        int r
173b0 31 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a  1;.  .        /*
173c0 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
173d0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
173e0 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
173f0 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
17400 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
17410 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
17420 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
17430 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
17440 20 20 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f        ** by allo
17450 63 61 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65  cating the table
17460 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a  s we will need..
17470 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
17480 20 20 20 74 61 62 31 20 3d 20 70 50 61 72 73 65     tab1 = pParse
17490 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
174a0 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
174b0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
174c0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
174d0 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  erBy==0 );.  .  
174e0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
174f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17500 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
17510 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
17520 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
17530 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
17540 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
17550 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
17560 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
17570 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f       findRightmo
17580 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20  st(p)->selFlags 
17590 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
175a0 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ral;.        ass
175b0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
175c0 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  ;.  .        /* 
175d0 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73  Code the SELECTs
175e0 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74   to our left int
175f0 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
17600 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20  e "tab1"..      
17610 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
17620 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
17630 69 74 28 26 69 6e 74 65 72 73 65 63 74 64 65 73  it(&intersectdes
17640 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61  t, SRT_Union, ta
17650 62 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  b1);.        rc 
17660 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
17670 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
17680 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
17690 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
176a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
176b0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
176c0 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
176d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  .        /* Code
176e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
176f0 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61  ECT into tempora
17700 72 79 20 74 61 62 6c 65 20 22 74 61 62 32 22 0a  ry table "tab2".
17710 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
17720 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
17730 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17740 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
17750 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20   tab2, 0);.     
17760 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
17770 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
17780 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70   -1 );.        p
17790 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
177a0 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
177b0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
177c0 0a 20 20 20 20 20 20 20 20 70 4c 69 6d 69 74 20  .        pLimit 
177d0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
177e0 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
177f0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 65   0;.        inte
17800 72 73 65 63 74 64 65 73 74 2e 69 53 44 50 61 72  rsectdest.iSDPar
17810 6d 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20  m = tab2;.      
17820 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
17830 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
17840 25 73 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d  %s USING TEMP B-
17850 54 52 45 45 22 2c 0a 20 20 20 20 20 20 20 20 20  TREE",.         
17860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17870 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
17880 3e 6f 70 29 29 29 3b 0a 20 20 20 20 20 20 20 20  >op)));.        
17890 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
178a0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69  ct(pParse, p, &i
178b0 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20  ntersectdest);. 
178c0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
178d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
178e0 3b 0a 20 20 20 20 20 20 20 20 70 44 65 6c 65 74  ;.        pDelet
178f0 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  e = p->pPrior;. 
17900 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72         p->pPrior
17910 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
17920 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63     if( p->nSelec
17930 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65  tRow>pPrior->nSe
17940 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20  lectRow ){.     
17950 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
17960 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
17970 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 20  lectRow;.       
17980 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
17990 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
179a0 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
179b0 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
179c0 20 70 4c 69 6d 69 74 3b 0a 20 20 0a 20 20 20 20   pLimit;.  .    
179d0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
179e0 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74 68 65  code to take the
179f0 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20 6f 66   intersection of
17a00 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f 72 61   the two tempora
17a10 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  ry.        ** ta
17a20 62 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bles..        */
17a30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17a40 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
17a50 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73        iBreak = s
17a60 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
17a70 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
17a80 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  iCont = sqlite3V
17a90 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
17aa0 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65  .        compute
17ab0 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70  LimitRegisters(p
17ac0 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b  Parse, p, iBreak
17ad0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17ae0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17af0 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
17b00 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
17b10 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
17b20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
17b30 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
17b40 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  );.        iStar
17b50 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
17b60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44  ddOp2(v, OP_RowD
17b70 61 74 61 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a  ata, tab1, r1);.
17b80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17b90 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
17ba0 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62  OP_NotFound, tab
17bb0 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29  2, iCont, r1, 0)
17bc0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
17bd0 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
17be0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17bf0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
17c00 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 65   r1);.        se
17c10 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
17c20 61 72 73 65 2c 20 70 2c 20 74 61 62 31 2c 0a 20  arse, p, tab1,. 
17c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c40 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
17c50 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
17c60 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
17c70 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
17c80 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
17c90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
17ca0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
17cb0 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72  ext, tab1, iStar
17cc0 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  t); VdbeCoverage
17cd0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
17ce0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
17cf0 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
17d00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17d10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
17d20 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29  _Close, tab2, 0)
17d30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17d40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17d50 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30  P_Close, tab1, 0
17d60 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
17d70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17d80 20 20 0a 20 20 23 69 66 6e 64 65 66 20 53 51 4c    .  #ifndef SQL
17d90 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
17da0 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  .    if( p->pNex
17db0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  t==0 ){.      Ex
17dc0 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50 6f  plainQueryPlanPo
17dd0 70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  p(pParse);.    }
17de0 0a 20 20 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  .  #endif.  }.  
17df0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 63 6f  .  /* Compute co
17e00 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
17e10 73 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  s used by .  ** 
17e20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
17e30 20 6e 65 65 64 65 64 20 74 6f 20 69 6d 70 6c 65   needed to imple
17e40 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70 6f 75 6e  ment the compoun
17e50 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2a 20 41  d select..  ** A
17e60 74 74 61 63 68 20 74 68 65 20 4b 65 79 49 6e 66  ttach the KeyInf
17e70 6f 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 61  o structure to a
17e80 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ll temporary tab
17e90 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  les..  **.  ** T
17ea0 68 69 73 20 73 65 63 74 69 6f 6e 20 69 73 20 72  his section is r
17eb0 75 6e 20 62 79 20 74 68 65 20 72 69 67 68 74 2d  un by the right-
17ec0 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61 74  most SELECT stat
17ed0 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a  ement only..  **
17ee0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
17ef0 74 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61  ts to the left a
17f00 6c 77 61 79 73 20 73 6b 69 70 20 74 68 69 73 20  lways skip this 
17f10 70 61 72 74 2e 20 20 54 68 65 20 72 69 67 68 74  part.  The right
17f20 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45 4c 45 43  -most.  ** SELEC
17f30 54 20 6d 69 67 68 74 20 61 6c 73 6f 20 73 6b 69  T might also ski
17f40 70 20 74 68 69 73 20 70 61 72 74 20 69 66 20 69  p this part if i
17f50 74 20 68 61 73 20 6e 6f 20 4f 52 44 45 52 20 42  t has no ORDER B
17f60 59 20 63 6c 61 75 73 65 20 61 6e 64 0a 20 20 2a  Y clause and.  *
17f70 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62 6c 65 73  * no temp tables
17f80 20 61 72 65 20 72 65 71 75 69 72 65 64 2e 0a 20   are required.. 
17f90 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   */.  if( p->sel
17fa0 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 73 45  Flags & SF_UsesE
17fb0 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20 20 20 20  phemeral ){.    
17fc0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17fe0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
17ff0 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
18000 65 79 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eyInfo;         
18010 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
18020 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
18030 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
18040 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70     Select *pLoop
18050 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18060 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
18070 74 68 72 6f 75 67 68 20 53 45 4c 45 43 54 20 73  through SELECT s
18080 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  tatements */.   
18090 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70 43 6f 6c   CollSeq **apCol
180a0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
180b0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
180c0 72 6f 75 67 68 20 70 4b 65 79 49 6e 66 6f 2d 3e  rough pKeyInfo->
180d0 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69  aColl[] */.    i
180e0 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt nCol;        
180f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18100 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
18110 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20  s in result set 
18120 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
18130 70 2d 3e 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20  p->pNext==0 );. 
18140 20 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c     nCol = p->pEL
18150 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
18160 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
18170 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
18180 62 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20  b, nCol, 1);.   
18190 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29   if( !pKeyInfo )
181a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
181b0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
181c0 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
181d0 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
181e0 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20   }.    for(i=0, 
181f0 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66 6f 2d  apColl=pKeyInfo-
18200 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c 3b 20  >aColl; i<nCol; 
18210 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29 7b 0a  i++, apColl++){.
18220 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20        *apColl = 
18230 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
18240 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
18250 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 2a  ;.      if( 0==*
18260 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  apColl ){.      
18270 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e    *apColl = db->
18280 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
18290 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f   }.    }..    fo
182a0 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
182b0 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
182c0 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f  Prior){.      fo
182d0 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
182e0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  {.        int ad
182f0 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  dr = pLoop->addr
18300 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20  OpenEphm[i];.   
18310 20 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20       if( addr<0 
18320 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
18330 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  If [0] is unused
18340 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73   then [1] is als
18350 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20 77 65  o unused.  So we
18360 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20 20 2a   can.          *
18370 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c 79 20  * always safely 
18380 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20 61 73  abort as soon as
18390 20 74 68 65 20 66 69 72 73 74 20 75 6e 75 73 65   the first unuse
183a0 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20  d slot is found 
183b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
183c0 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72  ert( pLoop->addr
183d0 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b  OpenEphm[1]<0 );
183e0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
183f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18400 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
18410 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c  hangeP2(v, addr,
18420 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
18430 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
18440 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28 63 68  eP4(v, addr, (ch
18450 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
18460 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
18470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18480 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
18490 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
184a0 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65    pLoop->addrOpe
184b0 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20  nEphm[i] = -1;. 
184c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
184d0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
184e0 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b 0a  nref(pKeyInfo);.
184f0 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c 65 63    }..multi_selec
18500 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74 2d 3e  t_end:.  pDest->
18510 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69 53 64  iSdst = dest.iSd
18520 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64  st;.  pDest->nSd
18530 73 74 20 3d 20 64 65 73 74 2e 6e 53 64 73 74 3b  st = dest.nSdst;
18540 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
18550 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 65  Delete(db, pDele
18560 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  te);.  return rc
18570 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
18580 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
18590 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a  ND_SELECT */../*
185a0 0a 2a 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67  .** Error messag
185b0 65 20 66 6f 72 20 77 68 65 6e 20 74 77 6f 20 6f  e for when two o
185c0 72 20 6d 6f 72 65 20 74 65 72 6d 73 20 6f 66 20  r more terms of 
185d0 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
185e0 74 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74  t have different
185f0 0a 2a 2a 20 73 69 7a 65 20 72 65 73 75 6c 74 20  .** size result 
18600 73 65 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  sets..*/.void sq
18610 6c 69 74 65 33 53 65 6c 65 63 74 57 72 6f 6e 67  lite3SelectWrong
18620 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 50 61  NumTermsError(Pa
18630 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
18640 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ect *p){.  if( p
18650 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
18660 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 73 71  Values ){.    sq
18670 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18680 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45  arse, "all VALUE
18690 53 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20  S must have the 
186a0 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  same number of t
186b0 65 72 6d 73 22 29 3b 0a 20 20 7d 65 6c 73 65 7b  erms");.  }else{
186c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
186d0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
186e0 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
186f0 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
18700 73 22 0a 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  s".      " do no
18710 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
18720 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
18730 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
18740 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
18750 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
18760 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62  de an output sub
18770 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f  routine for a co
18780 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
18790 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53  tation of a.** S
187a0 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a  ELECT statment..
187b0 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74  **.** The data t
187c0 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20 63  o be output is c
187d0 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d  ontained in pIn-
187e0 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65 20 61  >iSdst.  There a
187f0 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74  re.** pIn->nSdst
18800 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f   columns to be o
18810 75 74 70 75 74 2e 20 20 70 44 65 73 74 20 69 73  utput.  pDest is
18820 20 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 75   where the outpu
18830 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
18840 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65  ent..**.** regRe
18850 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  turn is the numb
18860 65 72 20 6f 66 20 74 68 65 20 72 65 67 69 73 74  er of the regist
18870 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  er holding the s
18880 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  ubroutine.** ret
18890 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a  urn address..**.
188a0 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  ** If regPrev>0 
188b0 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 66  then it is the f
188c0 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
188d0 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a   a vector that.*
188e0 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72  * records the pr
188f0 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20  evious output.  
18900 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20  mem[regPrev] is 
18910 61 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66  a flag that is f
18920 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65  alse.** if there
18930 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65   has been no pre
18940 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49  vious output.  I
18950 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
18960 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65   code is.** gene
18970 72 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73  rated to suppres
18980 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70  s duplicates.  p
18990 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20  KeyInfo is used 
189a0 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a  for comparing.**
189b0 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   keys..**.** If 
189c0 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20  the LIMIT found 
189d0 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20  in p->iLimit is 
189e0 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d  reached, jump im
189f0 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20  mediately to.** 
18a00 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69  iBreak..*/.stati
18a10 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75  c int generateOu
18a20 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a  tputSubroutine(.
18a30 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
18a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
18a50 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
18a60 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
18a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18a80 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
18a90 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  t */.  SelectDes
18aa0 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f  t *pIn,        /
18ab0 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70  * Coroutine supp
18ac0 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  lying data */.  
18ad0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
18ae0 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  t,      /* Where
18af0 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74   to send the dat
18b00 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  a */.  int regRe
18b10 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  turn,          /
18b20 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64  * The return add
18b30 72 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f  ress register */
18b40 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20  .  int regPrev, 
18b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
18b60 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65  evious result re
18b70 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71  gister.  No uniq
18b80 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20  ueness if 0 */. 
18b90 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
18ba0 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  fo,      /* For 
18bb0 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70  comparing with p
18bc0 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f  revious entry */
18bd0 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
18be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
18bf0 6d 70 20 68 65 72 65 20 69 66 20 77 65 20 68 69  mp here if we hi
18c00 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29  t the LIMIT */.)
18c10 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
18c20 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
18c30 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  nt iContinue;.  
18c40 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64  int addr;..  add
18c50 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
18c60 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
18c70 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
18c80 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
18c90 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  l(v);..  /* Supp
18ca0 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 20  ress duplicates 
18cb0 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  for UNION, EXCEP
18cc0 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
18cd0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67   .  */.  if( reg
18ce0 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20  Prev ){.    int 
18cf0 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20  addr1, addr2;.  
18d00 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
18d10 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
18d20 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76  P_IfNot, regPrev
18d30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
18d40 76 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  v);.    addr2 = 
18d50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18d60 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
18d70 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
18d80 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
18d90 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
18da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18db0 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
18dc0 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
18dd0 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
18de0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
18df0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
18e00 75 6d 70 2c 20 61 64 64 72 32 2b 32 2c 20 69 43  ump, addr2+2, iC
18e10 6f 6e 74 69 6e 75 65 2c 20 61 64 64 72 32 2b 32  ontinue, addr2+2
18e20 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
18e30 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
18e40 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
18e50 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddr1);.    sqlit
18e60 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
18e70 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53  OP_Copy, pIn->iS
18e80 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c 20  dst, regPrev+1, 
18e90 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20  pIn->nSdst-1);. 
18ea0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18eb0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
18ec0 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29 3b  er, 1, regPrev);
18ed0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
18ee0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
18ef0 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
18f00 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 74  .  /* Suppress t
18f10 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20  he first OFFSET 
18f20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72 65  entries if there
18f30 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63 6c   is an OFFSET cl
18f40 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65  ause.  */.  code
18f50 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66  Offset(v, p->iOf
18f60 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29  fset, iContinue)
18f70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 65  ;..  assert( pDe
18f80 73 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 45  st->eDest!=SRT_E
18f90 78 69 73 74 73 20 29 3b 0a 20 20 61 73 73 65 72  xists );.  asser
18fa0 74 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 21  t( pDest->eDest!
18fb0 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
18fc0 73 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65  switch( pDest->e
18fd0 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53  Dest ){.    /* S
18fe0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
18ff0 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61 20  as data using a 
19000 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20  unique key..    
19010 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
19020 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
19030 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
19040 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
19050 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  rse);.      int 
19060 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
19070 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
19080 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
19090 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
190a0 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69  keRecord, pIn->i
190b0 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
190c0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
190d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
190e0 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70  , OP_NewRowid, p
190f0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
19100 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
19110 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
19120 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  P_Insert, pDest-
19130 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20 72 32  >iSDParm, r1, r2
19140 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19150 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
19160 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
19170 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
19180 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
19190 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  se, r2);.      s
191a0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
191b0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
191c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
191d0 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
191e0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
191f0 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
19200 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
19210 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
19220 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
19230 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
19240 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
19250 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
19260 20 74 65 73 74 63 61 73 65 28 20 70 49 6e 2d 3e   testcase( pIn->
19270 6e 53 64 73 74 3e 31 20 29 3b 0a 20 20 20 20 20  nSdst>1 );.     
19280 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
19290 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
192a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
192b0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
192c0 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
192d0 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
192e0 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 72 31  t, .          r1
192f0 2c 20 70 44 65 73 74 2d 3e 7a 41 66 66 53 64 73  , pDest->zAffSds
19300 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
19310 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
19320 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
19330 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
19340 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
19350 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dst);.      sqli
19360 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
19370 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
19380 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
19390 2c 20 72 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , r1,.          
193a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193b0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
193c0 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
193d0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
193e0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
193f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19400 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
19410 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c 61   this is a scala
19420 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69 73  r select that is
19430 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72   part of an expr
19440 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20  ession, then.   
19450 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65   ** store the re
19460 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70  sults in the app
19470 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20  ropriate memory 
19480 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f  cell and break o
19490 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ut.    ** of the
194a0 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20   scan loop..    
194b0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
194c0 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Mem: {.      ass
194d0 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d  ert( pIn->nSdst=
194e0 3d 31 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =1 || pParse->nE
194f0 72 72 3e 30 20 29 3b 20 20 74 65 73 74 63 61 73  rr>0 );  testcas
19500 65 28 20 70 49 6e 2d 3e 6e 53 64 73 74 21 3d 31  e( pIn->nSdst!=1
19510 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
19520 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
19530 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
19540 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
19550 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
19560 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
19570 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
19580 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
19590 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
195a0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
195b0 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
195c0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
195d0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ..    /* The res
195e0 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
195f0 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
19600 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
19610 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44  * starting at pD
19620 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  est->iSdst.  The
19630 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
19640 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a   yields..    */.
19650 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
19660 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  outine: {.      
19670 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74  if( pDest->iSdst
19680 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
19690 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71  Dest->iSdst = sq
196a0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
196b0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e  e(pParse, pIn->n
196c0 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Sdst);.        p
196d0 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49  Dest->nSdst = pI
196e0 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20  n->nSdst;.      
196f0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
19700 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
19710 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
19720 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 49  pDest->iSdst, pI
19730 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
19740 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19750 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
19760 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
19770 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19780 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
19790 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65  one of the above
197a0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
197b0 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75  t destination mu
197c0 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54  st be.    ** SRT
197d0 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72  _Output.  This r
197e0 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
197f0 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20  called with any 
19800 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73  other.    ** des
19810 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74  tination other t
19820 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e  han the ones han
19830 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52  dled above or SR
19840 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a  T_Output..    **
19850 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f  .    ** For SRT_
19860 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20  Output, results 
19870 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
19880 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
19890 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20  sters.  .    ** 
198a0 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75  Then the OP_Resu
198b0 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20  ltRow opcode is 
198c0 75 73 65 64 20 74 6f 20 63 61 75 73 65 20 73 71  used to cause sq
198d0 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a  lite3_step() to.
198e0 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68      ** return th
198f0 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65  e next row of re
19900 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sult..    */.   
19910 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
19920 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
19930 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
19940 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ut );.      sqli
19950 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19960 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
19970 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
19980 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
19990 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
199a0 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
199b0 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
199c0 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
199d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
199e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
199f0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
19a00 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
19a10 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a  MIT is reached..
19a20 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
19a30 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
19a40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
19a50 20 4f 50 5f 44 65 63 72 4a 75 6d 70 5a 65 72 6f   OP_DecrJumpZero
19a60 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72  , p->iLimit, iBr
19a70 65 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61  eak); VdbeCovera
19a80 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ge(v);.  }..  /*
19a90 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75   Generate the su
19aa0 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a  broutine return.
19ab0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
19ac0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
19ad0 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20  , iContinue);.  
19ae0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19af0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
19b00 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72  regReturn);..  r
19b10 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
19b20 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65  *.** Alternative
19b30 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
19b40 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
19b50 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74  for cases when t
19b60 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52  here.** is an OR
19b70 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a  DER BY clause..*
19b80 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61  *.** We assume a
19b90 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
19ba0 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a  llowing form:.**
19bb0 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74  .**      <select
19bc0 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20  A>  <operator>  
19bd0 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52  <selectB>  ORDER
19be0 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74   BY <orderbylist
19bf0 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  >.**.** <operato
19c00 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49  r> is one of UNI
19c10 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45  ON ALL, UNION, E
19c20 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
19c30 45 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a  ECT.  The idea.*
19c40 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74  * is to code bot
19c50 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20  h <selectA> and 
19c60 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74  <selectB> with t
19c70 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
19c80 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74  se as.** co-rout
19c90 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20  ines.  Then run 
19ca0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20  the co-routines 
19cb0 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20  in parallel and 
19cc0 6d 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74  merge the result
19cd0 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75  s.** into the ou
19ce0 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69  tput.  In additi
19cf0 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f  on to the two co
19d00 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64  routines (called
19d10 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20   selectA and.** 
19d20 73 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61  selectB) there a
19d30 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73  re 7 subroutines
19d40 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a  :.**.**    outA:
19d50 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
19d60 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
19d70 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tA coroutine int
19d80 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
19d90 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
19da0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
19db0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42  y..**.**    outB
19dc0 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75  :    Move the ou
19dd0 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65  tput of the sele
19de0 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e  ctB coroutine in
19df0 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  to the output.**
19e00 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
19e10 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
19e20 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72  ry.  (Only gener
19e30 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61  ated for UNION a
19e40 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
19e50 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58    UNION ALL.  EX
19e60 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53  CEPT and INSERTS
19e70 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74  ECT never output
19e80 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20   a row that.**  
19e90 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61             appea
19ea0 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a  rs only in B.).*
19eb0 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20  *.**    AltB:   
19ec0 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   Called when the
19ed0 72 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20  re is data from 
19ee0 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20  both coroutines 
19ef0 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20  and A<B..**.**  
19f00 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65    AeqB:    Calle
19f10 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
19f20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
19f30 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d  oroutines and A=
19f40 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74  =B..**.**    Agt
19f50 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
19f60 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
19f70 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
19f80 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a  ines and A>B..**
19f90 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20  .**    EofA:    
19fa0 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
19fb0 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
19fc0 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a  om selectA..**.*
19fd0 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61  *    EofB:    Ca
19fe0 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
19ff0 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
1a000 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20   selectB..**.** 
1a010 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
1a020 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72  on of the latter
1a030 20 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65   five subroutine
1a040 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63  s depend on whic
1a050 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  h .** <operator>
1a060 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a   is used:.**.**.
1a070 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
1a080 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20  NION ALL        
1a090 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20   UNION          
1a0a0 20 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20    EXCEPT        
1a0b0 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20    INTERSECT.**  
1a0c0 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
1a0d0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
1a0e0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
1a0f0 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d  --------  ------
1a100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
1a110 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e   AltB:   outA, n
1a120 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
1a130 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
1a140 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
1a150 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65  nextA.**.**   Ae
1a160 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  qB:   outA, next
1a170 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20  A         nextA 
1a180 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
1a190 41 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20  A         outA, 
1a1a0 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67  nextA.**.**   Ag
1a1b0 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74  tB:   outB, next
1a1c0 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78  B      outB, nex
1a1d0 74 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  tB          next
1a1e0 42 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  B            nex
1a1f0 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a  tB.**.**   EofA:
1a200 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
1a210 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
1a220 20 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20           halt   
1a230 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a            halt.*
1a240 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f  *.**   EofB:   o
1a250 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
1a260 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
1a270 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
1a280 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a        halt.**.**
1a290 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65   In the AltB, Ae
1a2a0 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62  qB, and AgtB sub
1a2b0 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46  routines, an EOF
1a2c0 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20   on A following 
1a2d0 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20  nextA.** causes 
1a2e0 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d  an immediate jum
1a2f0 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e  p to EofA and an
1a300 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77   EOF on B follow
1a310 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73  ing nextB causes
1a320 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  .** an immediate
1a330 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20   jump to EofB.  
1a340 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20  Within EofA and 
1a350 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e  EofB, and EOF on
1a360 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c   entry or.** fol
1a370 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75  lowing nextX cau
1a380 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68  ses a jump to th
1a390 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c  e end of the sel
1a3a0 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a  ect processing..
1a3b0 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20  **.** Duplicate 
1a3c0 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55  removal in the U
1a3d0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
1a3e0 64 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65  d INTERSECT case
1a3f0 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20  s is handled.** 
1a400 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75  within the outpu
1a410 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
1a420 68 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73  he regPrev regis
1a430 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68  ter set holds th
1a440 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  e previously.** 
1a450 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41  output value.  A
1a460 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d   comparison is m
1a470 61 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73  ade against this
1a480 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f   value and the o
1a490 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70  utput.** is skip
1a4a0 70 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20  ped if the next 
1a4b0 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65  results would be
1a4c0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1a4d0 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a   previous..**.**
1a4e0 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
1a4f0 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69  ion plan is to i
1a500 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f  mplement the two
1a510 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
1a520 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74  seven.** subrout
1a530 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e  ines first, then
1a540 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c   put the control
1a550 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f   logic at the bo
1a560 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73  ttom.  Like this
1a570 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1a580 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20   goto Init.**   
1a590 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65    coA: coroutine
1a5a0 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20   for left query 
1a5b0 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20  (A).**     coB: 
1a5c0 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69  coroutine for ri
1a5d0 67 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a  ght query (B).**
1a5e0 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74      outA: output
1a5f0 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a   one row of A.**
1a600 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74      outB: output
1a610 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55   one row of B (U
1a620 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41  NION and UNION A
1a630 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45  LL only).**    E
1a640 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45  ofA: ....**    E
1a650 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ofB: ....**    A
1a660 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  ltB: ....**    A
1a670 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41  eqB: ....**    A
1a680 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49  gtB: ....**    I
1a690 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20  nit: initialize 
1a6a0 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  coroutine regist
1a6b0 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ers.**          
1a6c0 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20  yield coA.**    
1a6d0 20 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20        if eof(A) 
1a6e0 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20  goto EofA.**    
1a6f0 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a        yield coB.
1a700 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65  **          if e
1a710 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a  of(B) goto EofB.
1a720 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70  **    Cmpr: Comp
1a730 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20  are A, B.**     
1a740 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20       Jump AltB, 
1a750 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20  AeqB, AgtB.**   
1a760 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a    End: ....**.**
1a770 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41   We call AltB, A
1a780 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c  eqB, AgtB, EofA,
1a790 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f   and EofB "subro
1a7a0 75 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79  utines" but they
1a7b0 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75   are not.** actu
1a7c0 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e  ally called usin
1a7d0 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79  g Gosub and they
1a7e0 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20   do not Return. 
1a7f0 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c   EofA and EofB l
1a800 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c  oop.** until all
1a810 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
1a820 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20  ed then jump to 
1a830 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20  the "end" labe. 
1a840 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20   AltB, AeqB,.** 
1a850 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f  and AgtB jump to
1a860 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f   either L2 or to
1a870 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20   one of EofA or 
1a880 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  EofB..*/.#ifndef
1a890 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
1a8a0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61  POUND_SELECT.sta
1a8b0 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
1a8c0 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
1a8d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1a8e0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1a8f0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
1a900 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
1a910 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
1a920 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
1a930 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
1a940 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
1a950 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
1a960 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
1a970 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
1a980 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
1a990 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1a9a0 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63  nters */.  Selec
1a9b0 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
1a9c0 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
1a9d0 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
1a9e0 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
1a9f0 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
1aa00 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
1aa10 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
1aa20 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
1aa30 65 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f  est destA;     /
1aa40 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f  * Destination fo
1aa50 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f  r coroutine A */
1aa60 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
1aa70 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stB;     /* Dest
1aa80 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
1aa90 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74  utine B */.  int
1aaa0 20 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20   regAddrA;      
1aab0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
1aac0 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
1aad0 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
1aae0 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b  .  int regAddrB;
1aaf0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1ab00 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
1ab10 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
1ab20 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1ab30 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f  rSelectA;      /
1ab40 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1ab50 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74   select-A corout
1ab60 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
1ab70 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f  rSelectB;      /
1ab80 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
1ab90 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74   select-B corout
1aba0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ine */.  int reg
1abb0 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f  OutA;          /
1abc0 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
1abd0 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75  er for the outpu
1abe0 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
1abf0 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b  /.  int regOutB;
1ac00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1ac10 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
1ac20 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  r the output-B s
1ac30 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
1ac40 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20  nt addrOutA;    
1ac50 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
1ac60 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20  of the output-A 
1ac70 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1ac80 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30  int addrOutB = 0
1ac90 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
1aca0 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42   of the output-B
1acb0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
1acc0 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20   int addrEofA;  
1acd0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
1ace0 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
1acf0 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  A-exhausted subr
1ad00 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1ad10 61 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20  addrEofA_noB;   
1ad20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20 61    /* Alternate a
1ad30 64 64 72 45 6f 66 41 20 69 66 20 42 20 69 73 20  ddrEofA if B is 
1ad40 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  uninitialized */
1ad50 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b  .  int addrEofB;
1ad60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
1ad70 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
1ad80 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-B-exhausted su
1ad90 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
1ada0 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20  t addrAltB;     
1adb0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
1adc0 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75  f the A<B subrou
1add0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
1ade0 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20  drAeqB;         
1adf0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
1ae00 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e  e A==B subroutin
1ae10 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
1ae20 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  gtB;         /* 
1ae30 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
1ae40 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  >B subroutine */
1ae50 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41  .  int regLimitA
1ae60 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
1ae70 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
1ae80 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
1ae90 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20   regLimitB;     
1aea0 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
1aeb0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
1aec0 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  A */.  int regPr
1aed0 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev;          /* 
1aee0 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  A range of regis
1aef0 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65  ters to hold pre
1af00 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a  vious output */.
1af10 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74    int savedLimit
1af20 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
1af30 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69   value of p->iLi
1af40 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  mit */.  int sav
1af50 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  edOffset;      /
1af60 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
1af70 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20   p->iOffset */. 
1af80 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20   int labelCmpr; 
1af90 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
1afa0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
1afb0 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72   the merge algor
1afc0 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  ithm */.  int la
1afd0 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20  belEnd;         
1afe0 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
1aff0 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   end of the over
1b000 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20  all SELECT stmt 
1b010 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20  */.  int addr1; 
1b020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
1b030 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
1b040 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65  that get retarge
1b050 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tted */.  int op
1b060 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b070 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c  /* One of TK_ALL
1b080 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  , TK_UNION, TK_E
1b090 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53  XCEPT, TK_INTERS
1b0a0 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ECT */.  KeyInfo
1b0b0 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f   *pKeyDup = 0; /
1b0c0 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
1b0d0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  ormation for dup
1b0e0 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a  licate removal *
1b0f0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
1b100 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d  yMerge;   /* Com
1b110 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
1b120 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20  ion for merging 
1b130 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rows */.  sqlite
1b140 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
1b150 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
1b160 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
1b170 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
1b180 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
1b190 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
1b1a0 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
1b1b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b1c0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
1b1d0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
1b1e0 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65  .  int *aPermute
1b1f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70  ;        /* Mapp
1b200 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42  ing from ORDER B
1b210 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c  Y terms to resul
1b220 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  t set columns */
1b230 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ..  assert( p->p
1b240 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20  OrderBy!=0 );.  
1b250 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d  assert( pKeyDup=
1b260 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65  =0 ); /* "Manage
1b270 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68  d" code needs th
1b280 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38  is.  Ticket #338
1b290 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  2. */.  db = pPa
1b2a0 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70  rse->db;.  v = p
1b2b0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
1b2c0 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
1b2d0 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79        /* Already
1b2e0 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f   thrown the erro
1b2f0 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20  r if VDBE alloc 
1b300 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65  failed */.  labe
1b310 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  lEnd = sqlite3Vd
1b320 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
1b330 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71    labelCmpr = sq
1b340 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1b350 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61  el(v);...  /* Pa
1b360 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45 52  tch up the ORDER
1b370 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a   BY clause.  */.
1b380 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a    op = p->op;  .
1b390 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
1b3a0 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rior;.  assert( 
1b3b0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
1b3c0 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42  ==0 );.  pOrderB
1b3d0 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
1b3e0 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  .  assert( pOrde
1b3f0 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42  rBy );.  nOrderB
1b400 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y = pOrderBy->nE
1b410 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f  xpr;..  /* For o
1b420 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74  perators other t
1b430 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65  han UNION ALL we
1b440 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75   have to make su
1b450 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  re that.  ** the
1b460 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1b470 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74 65   covers every te
1b480 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rm of the result
1b490 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20   set.  Add.  ** 
1b4a0 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44  terms to the ORD
1b4b0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 20  ER BY clause as 
1b4c0 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
1b4d0 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c    if( op!=TK_ALL
1b4e0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
1b4f0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1b500 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45  d==0 && i<=p->pE
1b510 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1b520 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1b530 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1b540 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  Item;.      for(
1b550 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  j=0, pItem=pOrde
1b560 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72  rBy->a; j<nOrder
1b570 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b  By; j++, pItem++
1b580 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1b590 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t( pItem->u.x.iO
1b5a0 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20  rderByCol>0 );. 
1b5b0 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
1b5c0 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
1b5d0 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20  l==i ) break;.  
1b5e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1b5f0 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20  j==nOrderBy ){. 
1b600 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65         Expr *pNe
1b610 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  w = sqlite3Expr(
1b620 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  db, TK_INTEGER, 
1b630 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
1b640 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
1b650 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1b660 50 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  PT;.        pNew
1b670 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e  ->flags |= EP_In
1b680 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20  tValue;.        
1b690 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d  pNew->u.iValue =
1b6a0 20 69 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70   i;.        p->p
1b6b0 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
1b6c0 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
1b6d0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
1b6e0 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65  e, pOrderBy, pNe
1b6f0 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  w);.        if( 
1b700 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64 65  pOrderBy ) pOrde
1b710 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b  rBy->a[nOrderBy+
1b720 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  +].u.x.iOrderByC
1b730 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20  ol = (u16)i;.   
1b740 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1b750 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
1b760 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d   comparison perm
1b770 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69  utation and keyi
1b780 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65 64  nfo that is used
1b790 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70   with.  ** the p
1b7a0 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20  ermutation used 
1b7b0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
1b7c0 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f  the next.  ** ro
1b7d0 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d  w of results com
1b7e0 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20  es from selectA 
1b7f0 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73  or selectB.  Als
1b800 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20  o add explicit. 
1b810 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74   ** collations t
1b820 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
1b830 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74  lause terms so t
1b840 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75 62  hat when the sub
1b850 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20  queries.  ** to 
1b860 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74 68  the right and th
1b870 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75  e left are evalu
1b880 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20 74  ated, they use t
1b890 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20  he correct.  ** 
1b8a0 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  collation..  */.
1b8b0 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c    aPermute = sql
1b8c0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
1b8d0 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74  N(db, sizeof(int
1b8e0 29 2a 28 6e 4f 72 64 65 72 42 79 20 2b 20 31 29  )*(nOrderBy + 1)
1b8f0 29 3b 0a 20 20 69 66 28 20 61 50 65 72 6d 75 74  );.  if( aPermut
1b900 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  e ){.    struct 
1b910 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1b920 49 74 65 6d 3b 0a 20 20 20 20 61 50 65 72 6d 75  Item;.    aPermu
1b930 74 65 5b 30 5d 20 3d 20 6e 4f 72 64 65 72 42 79  te[0] = nOrderBy
1b940 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 2c 20 70  ;.    for(i=1, p
1b950 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Item=pOrderBy->a
1b960 3b 20 69 3c 3d 6e 4f 72 64 65 72 42 79 3b 20 69  ; i<=nOrderBy; i
1b970 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1b980 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1b990 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
1b9a0 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  ol>0 );.      as
1b9b0 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78  sert( pItem->u.x
1b9c0 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d 70 2d  .iOrderByCol<=p-
1b9d0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
1b9e0 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75 74 65  ;.      aPermute
1b9f0 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75 2e 78  [i] = pItem->u.x
1ba00 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31  .iOrderByCol - 1
1ba10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79  ;.    }.    pKey
1ba20 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53 65 6c  Merge = multiSel
1ba30 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
1ba40 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b  o(pParse, p, 1);
1ba50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b  .  }else{.    pK
1ba60 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d  eyMerge = 0;.  }
1ba70 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20  ..  /* Reattach 
1ba80 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1ba90 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72 79  use to the query
1baa0 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64  ..  */.  p->pOrd
1bab0 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
1bac0 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  .  pPrior->pOrde
1bad0 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
1bae0 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65 2d  rListDup(pParse-
1baf0 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30  >db, pOrderBy, 0
1bb00 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
1bb10 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d  e a range of tem
1bb20 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73  porary registers
1bb30 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f   and the KeyInfo
1bb40 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72   needed.  ** for
1bb50 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
1bb60 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74  removes duplicat
1bb70 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68  e result rows wh
1bb80 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72  en the.  ** oper
1bb90 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45  ator is UNION, E
1bba0 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53  XCEPT, or INTERS
1bbb0 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49  ECT (but not UNI
1bbc0 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20  ON ALL)..  */.  
1bbd0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29  if( op==TK_ALL )
1bbe0 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  {.    regPrev = 
1bbf0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1bc00 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70  int nExpr = p->p
1bc10 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
1bc20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72    assert( nOrder
1bc30 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d  By>=nExpr || db-
1bc40 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1bc50 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70  .    regPrev = p
1bc60 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
1bc70 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
1bc80 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20  += nExpr+1;.    
1bc90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bca0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1bcb0 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   0, regPrev);.  
1bcc0 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69    pKeyDup = sqli
1bcd0 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
1bce0 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20  db, nExpr, 1);. 
1bcf0 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20 29     if( pKeyDup )
1bd00 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1bd10 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
1bd20 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75  Writeable(pKeyDu
1bd30 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  p) );.      for(
1bd40 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b  i=0; i<nExpr; i+
1bd50 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  +){.        pKey
1bd60 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Dup->aColl[i] = 
1bd70 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
1bd80 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29  eq(pParse, p, i)
1bd90 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75  ;.        pKeyDu
1bda0 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  p->aSortOrder[i]
1bdb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1bdc0 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53    }.  }. .  /* S
1bdd0 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66 74  eparate the left
1bde0 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20 71   and the right q
1bdf0 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e  uery from one an
1be00 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e  other.  */.  p->
1be10 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 50  pPrior = 0;.  pP
1be20 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  rior->pNext = 0;
1be30 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
1be40 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
1be50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  arse, p, p->pOrd
1be60 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a  erBy, "ORDER");.
1be70 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50    if( pPrior->pP
1be80 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rior==0 ){.    s
1be90 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
1bea0 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
1beb0 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72  , pPrior, pPrior
1bec0 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
1bed0 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ER");.  }..  /* 
1bee0 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69  Compute the limi
1bef0 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  t registers */. 
1bf00 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
1bf10 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
1bf20 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69  , labelEnd);.  i
1bf30 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20  f( p->iLimit && 
1bf40 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20  op==TK_ALL ){.  
1bf50 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b    regLimitA = ++
1bf60 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1bf70 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b    regLimitB = ++
1bf80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
1bf90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bfa0 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
1bfb0 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e  p->iOffset ? p->
1bfc0 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69  iOffset+1 : p->i
1bfd0 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20  Limit,.         
1bfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bff0 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69           regLimi
1c000 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
1c010 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1c020 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41  _Copy, regLimitA
1c030 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20  , regLimitB);.  
1c040 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69  }else{.    regLi
1c050 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42  mitA = regLimitB
1c060 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
1c070 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1c080 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
1c090 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a  p->pLimit = 0;..
1c0a0 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70    regAddrA = ++p
1c0b0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
1c0c0 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72  egAddrB = ++pPar
1c0d0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f  se->nMem;.  regO
1c0e0 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  utA = ++pParse->
1c0f0 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20  nMem;.  regOutB 
1c100 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1c110 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1c120 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 41  tDestInit(&destA
1c130 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c  , SRT_Coroutine,
1c140 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
1c150 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
1c160 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f  nit(&destB, SRT_
1c170 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
1c180 64 72 42 29 3b 0a 0a 20 20 45 78 70 6c 61 69 6e  drB);..  Explain
1c190 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73  QueryPlan((pPars
1c1a0 65 2c 20 31 2c 20 22 4d 45 52 47 45 20 28 25 73  e, 1, "MERGE (%s
1c1b0 29 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65  )", selectOpName
1c1c0 28 70 2d 3e 6f 70 29 29 29 3b 0a 0a 20 20 2f 2a  (p->op)));..  /*
1c1d0 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f   Generate a coro
1c1e0 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74  utine to evaluat
1c1f0 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
1c200 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20  tement to the.  
1c210 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63  ** left of the c
1c220 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72  ompound operator
1c230 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63   - the "A" selec
1c240 74 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65  t..  */.  addrSe
1c250 6c 65 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56  lectA = sqlite3V
1c260 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
1c270 29 20 2b 20 31 3b 0a 20 20 61 64 64 72 31 20 3d  ) + 1;.  addr1 =
1c280 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1c290 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p3(v, OP_InitCor
1c2a0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
1c2b0 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 41  , 0, addrSelectA
1c2c0 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  );.  VdbeComment
1c2d0 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45 43  ((v, "left SELEC
1c2e0 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  T"));.  pPrior->
1c2f0 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
1c300 74 41 3b 0a 20 20 45 78 70 6c 61 69 6e 51 75 65  tA;.  ExplainQue
1c310 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65 2c 20  ryPlan((pParse, 
1c320 31 2c 20 22 4c 45 46 54 22 29 29 3b 0a 20 20 73  1, "LEFT"));.  s
1c330 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
1c340 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
1c350 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  stA);.  sqlite3V
1c360 64 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28  dbeEndCoroutine(
1c370 76 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  v, regAddrA);.  
1c380 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1c390 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a  ere(v, addr1);..
1c3a0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1c3b0 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
1c3c0 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
1c3d0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20   statement on . 
1c3e0 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20   ** the right - 
1c3f0 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20  the "B" select. 
1c400 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
1c410 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
1c420 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
1c430 31 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  1;.  addr1 = sql
1c440 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
1c450 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
1c460 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c  ne, regAddrB, 0,
1c470 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20   addrSelectB);. 
1c480 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
1c490 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29   "right SELECT")
1c4a0 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20  );.  savedLimit 
1c4b0 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73  = p->iLimit;.  s
1c4c0 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e  avedOffset = p->
1c4d0 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c  iOffset;.  p->iL
1c4e0 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42  imit = regLimitB
1c4f0 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
1c500 20 30 3b 20 20 0a 20 20 45 78 70 6c 61 69 6e 51   0;  .  ExplainQ
1c510 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72 73 65  ueryPlan((pParse
1c520 2c 20 31 2c 20 22 52 49 47 48 54 22 29 29 3b 0a  , 1, "RIGHT"));.
1c530 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
1c540 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74  pParse, p, &dest
1c550 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  B);.  p->iLimit 
1c560 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20  = savedLimit;.  
1c570 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76  p->iOffset = sav
1c580 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69  edOffset;.  sqli
1c590 74 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74  te3VdbeEndCorout
1c5a0 69 6e 65 28 76 2c 20 72 65 67 41 64 64 72 42 29  ine(v, regAddrB)
1c5b0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1c5c0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
1c5d0 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
1c5e0 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
1c5f0 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e A.  ** select 
1c600 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
1c610 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
1c620 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
1c630 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f   */.  VdbeNoopCo
1c640 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
1c650 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22  t routine for A"
1c660 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d  ));.  addrOutA =
1c670 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53   generateOutputS
1c680 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65  ubroutine(pParse
1c690 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c6a0 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44     p, &destA, pD
1c6b0 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20  est, regOutA,.  
1c6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1c6d0 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c  egPrev, pKeyDup,
1c6e0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20   labelEnd);.  . 
1c6f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
1c700 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
1c710 75 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65  utputs the curre
1c720 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a  nt row of the B.
1c730 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74    ** select as t
1c740 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72  he next output r
1c750 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  ow of the compou
1c760 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a  nd select..  */.
1c770 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
1c780 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
1c790 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70   ){.    VdbeNoop
1c7a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
1c7b0 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
1c7c0 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75  B"));.    addrOu
1c7d0 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tB = generateOut
1c7e0 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
1c7f0 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
1c800 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42         p, &destB
1c810 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42  , pDest, regOutB
1c820 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c830 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
1c840 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  Dup, labelEnd);.
1c850 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79    }.  sqlite3Key
1c860 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75  InfoUnref(pKeyDu
1c870 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  p);..  /* Genera
1c880 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
1c890 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
1c8a0 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
1c8b0 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65  ect A.  ** are e
1c8c0 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
1c8d0 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
1c8e0 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   B remains..  */
1c8f0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58  .  if( op==TK_EX
1c900 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  CEPT || op==TK_I
1c910 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
1c920 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61  addrEofA_noB = a
1c930 64 64 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45  ddrEofA = labelE
1c940 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20  nd;.  }else{  . 
1c950 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
1c960 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75  nt((v, "eof-A su
1c970 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20  broutine"));.   
1c980 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69   addrEofA = sqli
1c990 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c9a0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
1c9b0 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
1c9c0 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20     addrEofA_noB 
1c9d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1c9e0 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op2(v, OP_Yield,
1c9f0 20 72 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c   regAddrB, label
1ca00 45 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  End);.          
1ca10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca20 20 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43             VdbeC
1ca30 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
1ca40 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1ca50 76 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  v, addrEofA);.  
1ca60 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
1ca70 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
1ca80 64 64 28 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  dd(p->nSelectRow
1ca90 2c 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  , pPrior->nSelec
1caa0 74 52 6f 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  tRow);.  }..  /*
1cab0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
1cac0 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
1cad0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
1cae0 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20 2a  rom select B.  *
1caf0 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
1cb00 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
1cb10 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69 6e   select A remain
1cb20 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  s..  */.  if( op
1cb30 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
1cb40 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  {.    addrEofB =
1cb50 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20 69   addrEofA;.    i
1cb60 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  f( p->nSelectRow
1cb70 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   > pPrior->nSele
1cb80 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
1cb90 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
1cba0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65  nSelectRow;.  }e
1cbb0 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e  lse{  .    VdbeN
1cbc0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1cbd0 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  eof-B subroutine
1cbe0 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66  "));.    addrEof
1cbf0 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
1cc00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1cc10 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
1cc20 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  OutA);.    sqlit
1cc30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1cc40 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
1cc50 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 20 56  rA, labelEnd); V
1cc60 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
1cc70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1cc80 6f 74 6f 28 76 2c 20 61 64 64 72 45 6f 66 42 29  oto(v, addrEofB)
1cc90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
1cca0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
1ccb0 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
1ccc0 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A<B.  */.  VdbeN
1ccd0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
1cce0 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-lt-B subroutin
1ccf0 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42  e"));.  addrAltB
1cd00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1cd10 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
1cd20 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
1cd30 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  utA);.  sqlite3V
1cd40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1cd50 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c  Yield, regAddrA,
1cd60 20 61 64 64 72 45 6f 66 41 29 3b 20 56 64 62 65   addrEofA); Vdbe
1cd70 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
1cd80 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1cd90 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
1cda0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1cdb0 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
1cdc0 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a  case of A==B.  *
1cdd0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
1cde0 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65  LL ){.    addrAe
1cdf0 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20  qB = addrAltB;. 
1ce00 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
1ce10 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
1ce20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
1ce30 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72  drAltB;.    addr
1ce40 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  AltB++;.  }else{
1ce50 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
1ce60 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42  ment((v, "A-eq-B
1ce70 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
1ce80 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20      addrAeqB =. 
1ce90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1cea0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
1ceb0 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
1cec0 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65 72  EofA); VdbeCover
1ced0 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
1cee0 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6c  te3VdbeGoto(v, l
1cef0 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a  abelCmpr);.  }..
1cf00 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1cf10 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
1cf20 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a   case of A>B.  *
1cf30 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
1cf40 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20  ent((v, "A-gt-B 
1cf50 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
1cf60 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69   addrAgtB = sqli
1cf70 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1cf80 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d  dr(v);.  if( op=
1cf90 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54  =TK_ALL || op==T
1cfa0 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73  K_UNION ){.    s
1cfb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1cfc0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
1cfd0 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
1cfe0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
1cff0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1d000 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c  Yield, regAddrB,
1d010 20 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65   addrEofB); Vdbe
1d020 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
1d030 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
1d040 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
1d050 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75   /* This code ru
1d060 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69  ns once to initi
1d070 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67  alize everything
1d080 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1d090 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
1d0a0 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  addr1);.  sqlite
1d0b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1d0c0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
1d0d0 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29  A, addrEofA_noB)
1d0e0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
1d0f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1d100 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
1d110 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ld, regAddrB, ad
1d120 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43 6f 76  drEofB); VdbeCov
1d130 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
1d140 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61  Implement the ma
1d150 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20  in merge loop.  
1d160 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1d170 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
1d180 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71  labelCmpr);.  sq
1d190 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1d1a0 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f  v, OP_Permutatio
1d1b0 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  n, 0, 0, 0, (cha
1d1c0 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f  r*)aPermute, P4_
1d1d0 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c  INTARRAY);.  sql
1d1e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1d1f0 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65  , OP_Compare, de
1d200 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42  stA.iSdst, destB
1d210 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79  .iSdst, nOrderBy
1d220 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d230 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
1d240 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f  *)pKeyMerge, P4_
1d250 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69  KEYINFO);.  sqli
1d260 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
1d270 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54  v, OPFLAG_PERMUT
1d280 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  E);.  sqlite3Vdb
1d290 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
1d2a0 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64  mp, addrAltB, ad
1d2b0 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42  drAeqB, addrAgtB
1d2c0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
1d2d0 76 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74  v);..  /* Jump t
1d2e0 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74  o the this point
1d2f0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72   in order to ter
1d300 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79  minate the query
1d310 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1d320 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
1d330 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a  (v, labelEnd);..
1d340 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20    /* Reassembly 
1d350 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
1d360 72 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ry so that it wi
1d370 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f 72 72  ll be freed corr
1d380 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68  ectly.  ** by th
1d390 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1d3a0 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  on */.  if( p->p
1d3b0 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  Prior ){.    sql
1d3c0 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
1d3d0 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b  (db, p->pPrior);
1d3e0 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72  .  }.  p->pPrior
1d3f0 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70 50 72   = pPrior;.  pPr
1d400 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  ior->pNext = p;.
1d410 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e  .  /*** TBD:  In
1d420 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20  sert subroutine 
1d430 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63  calls to close c
1d440 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70  ursors on incomp
1d450 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71  lete.  **** subq
1d460 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 45  ueries ****/.  E
1d470 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 50  xplainQueryPlanP
1d480 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65  op(pParse);.  re
1d490 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72  turn pParse->nEr
1d4a0 72 21 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  r!=0;.}.#endif..
1d4b0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1d4c0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1d4d0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
1d4e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
1d4f0 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  ../* An instance
1d500 20 6f 66 20 74 68 65 20 53 75 62 73 74 43 6f 6e   of the SubstCon
1d510 74 65 78 74 20 6f 62 6a 65 63 74 20 64 65 73 63  text object desc
1d520 72 69 62 65 73 20 61 6e 20 73 75 62 73 74 69 74  ribes an substit
1d530 75 74 69 6f 6e 20 65 64 69 74 0a 2a 2a 20 74 6f  ution edit.** to
1d540 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   be performed on
1d550 20 61 20 70 61 72 73 65 20 74 72 65 65 2e 0a 2a   a parse tree..*
1d560 2a 0a 2a 2a 20 41 6c 6c 20 72 65 66 65 72 65 6e  *.** All referen
1d570 63 65 73 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69  ces to columns i
1d580 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20 61  n table iTable a
1d590 72 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  re to be replace
1d5a0 64 20 62 79 20 63 6f 72 72 65 73 70 6f 6e 64 69  d by correspondi
1d5b0 6e 67 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  ng.** expression
1d5c0 73 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2f 0a  s in pEList..*/.
1d5d0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
1d5e0 75 62 73 74 43 6f 6e 74 65 78 74 20 7b 0a 20 20  ubstContext {.  
1d5f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
1d600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1d610 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
1d620 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
1d630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d640 2f 2a 20 52 65 70 6c 61 63 65 20 72 65 66 65 72  /* Replace refer
1d650 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74 61  ences to this ta
1d660 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65  ble */.  int iNe
1d670 77 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  wTable;         
1d680 20 20 20 2f 2a 20 4e 65 77 20 74 61 62 6c 65 20     /* New table 
1d690 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
1d6a0 69 73 4c 65 66 74 4a 6f 69 6e 3b 20 20 20 20 20  isLeftJoin;     
1d6b0 20 20 20 20 20 20 2f 2a 20 41 64 64 20 54 4b 5f        /* Add TK_
1d6c0 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 6f 70 63 6f  IF_NULL_ROW opco
1d6d0 64 65 73 20 6f 6e 20 65 61 63 68 20 72 65 70 6c  des on each repl
1d6e0 61 63 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  acement */.  Exp
1d6f0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20  rList *pEList;  
1d700 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63         /* Replac
1d710 65 6d 65 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  ement expression
1d720 73 20 2a 2f 0a 7d 20 53 75 62 73 74 43 6f 6e 74  s */.} SubstCont
1d730 65 78 74 3b 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  ext;../* Forward
1d740 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f   Declarations */
1d750 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
1d760 73 74 45 78 70 72 4c 69 73 74 28 53 75 62 73 74  stExprList(Subst
1d770 43 6f 6e 74 65 78 74 2a 2c 20 45 78 70 72 4c 69  Context*, ExprLi
1d780 73 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  st*);.static voi
1d790 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 53 75  d substSelect(Su
1d7a0 62 73 74 43 6f 6e 74 65 78 74 2a 2c 20 53 65 6c  bstContext*, Sel
1d7b0 65 63 74 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a  ect*, int);../*.
1d7c0 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
1d7d0 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
1d7e0 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
1d7f0 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
1d800 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
1d810 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
1d820 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
1d830 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d   of the iColumn-
1d840 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  th.** entry in p
1d850 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
1d860 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
1d870 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
1d880 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
1d890 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ).**.** This rou
1d8a0 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20  tine is part of 
1d8b0 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70  the flattening p
1d8c0 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62  rocedure.  A sub
1d8d0 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72  query.** whose r
1d8e0 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66  esult set is def
1d8f0 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61  ined by pEList a
1d900 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20  ppears as entry 
1d910 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  in the.** FROM c
1d920 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
1d930 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  T such that the 
1d940 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69  VDBE cursor assi
1d950 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20  gned to that.** 
1d960 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FORM clause entr
1d970 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68  y is iTable.  Th
1d980 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  is routine makes
1d990 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a   the necessary .
1d9a0 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45  ** changes to pE
1d9b0 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72  xpr so that it r
1d9c0 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
1d9d0 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  o the source tab
1d9e0 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62  le.** of the sub
1d9f0 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65  query rather the
1da00 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
1da10 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  he subquery..*/.
1da20 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62  static Expr *sub
1da30 73 74 45 78 70 72 28 0a 20 20 53 75 62 73 74 43  stExpr(.  SubstC
1da40 6f 6e 74 65 78 74 20 2a 70 53 75 62 73 74 2c 20  ontext *pSubst, 
1da50 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1da60 6f 66 20 74 68 65 20 73 75 62 73 74 69 74 75 74  of the substitut
1da70 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ion */.  Expr *p
1da80 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
1da90 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68  /* Expr in which
1daa0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63   substitution oc
1dab0 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  curs */.){.  if(
1dac0 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
1dad0 72 6e 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72  rn 0;.  if( Expr
1dae0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1daf0 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a  r, EP_FromJoin).
1db00 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69 52 69     && pExpr->iRi
1db10 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 70 53  ghtJoinTable==pS
1db20 75 62 73 74 2d 3e 69 54 61 62 6c 65 0a 20 20 29  ubst->iTable.  )
1db30 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 52 69  {.    pExpr->iRi
1db40 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70  ghtJoinTable = p
1db50 53 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65  Subst->iNewTable
1db60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70  ;.  }.  if( pExp
1db70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op==TK_COLUMN
1db80 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   && pExpr->iTabl
1db90 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54 61 62 6c  e==pSubst->iTabl
1dba0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
1dbb0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
1dbc0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
1dbd0 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
1dbe0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
1dbf0 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45  r *pNew;.      E
1dc00 78 70 72 20 2a 70 43 6f 70 79 20 3d 20 70 53 75  xpr *pCopy = pSu
1dc10 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 70  bst->pEList->a[p
1dc20 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70  Expr->iColumn].p
1dc30 45 78 70 72 3b 0a 20 20 20 20 20 20 45 78 70 72  Expr;.      Expr
1dc40 20 69 66 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20   ifNullRow;.    
1dc50 20 20 61 73 73 65 72 74 28 20 70 53 75 62 73 74    assert( pSubst
1dc60 2d 3e 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ->pEList!=0 && p
1dc70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 53  Expr->iColumn<pS
1dc80 75 62 73 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  ubst->pEList->nE
1dc90 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  xpr );.      ass
1dca0 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
1dcb0 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
1dcc0 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
1dcd0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
1dce0 72 49 73 56 65 63 74 6f 72 28 70 43 6f 70 79 29  rIsVector(pCopy)
1dcf0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1dd00 74 65 33 56 65 63 74 6f 72 45 72 72 6f 72 4d 73  te3VectorErrorMs
1dd10 67 28 70 53 75 62 73 74 2d 3e 70 50 61 72 73 65  g(pSubst->pParse
1dd20 2c 20 70 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , pCopy);.      
1dd30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1dd40 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 53 75  qlite3 *db = pSu
1dd50 62 73 74 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  bst->pParse->db;
1dd60 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75  .        if( pSu
1dd70 62 73 74 2d 3e 69 73 4c 65 66 74 4a 6f 69 6e 20  bst->isLeftJoin 
1dd80 26 26 20 70 43 6f 70 79 2d 3e 6f 70 21 3d 54 4b  && pCopy->op!=TK
1dd90 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20  _COLUMN ){.     
1dda0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 69 66 4e       memset(&ifN
1ddb0 75 6c 6c 52 6f 77 2c 20 30 2c 20 73 69 7a 65 6f  ullRow, 0, sizeo
1ddc0 66 28 69 66 4e 75 6c 6c 52 6f 77 29 29 3b 0a 20  f(ifNullRow));. 
1ddd0 20 20 20 20 20 20 20 20 20 69 66 4e 75 6c 6c 52           ifNullR
1dde0 6f 77 2e 6f 70 20 3d 20 54 4b 5f 49 46 5f 4e 55  ow.op = TK_IF_NU
1ddf0 4c 4c 5f 52 4f 57 3b 0a 20 20 20 20 20 20 20 20  LL_ROW;.        
1de00 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 70 4c 65 66    ifNullRow.pLef
1de10 74 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20  t = pCopy;.     
1de20 20 20 20 20 20 69 66 4e 75 6c 6c 52 6f 77 2e 69       ifNullRow.i
1de30 54 61 62 6c 65 20 3d 20 70 53 75 62 73 74 2d 3e  Table = pSubst->
1de40 69 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 20  iNewTable;.     
1de50 20 20 20 20 20 70 43 6f 70 79 20 3d 20 26 69 66       pCopy = &if
1de60 4e 75 6c 6c 52 6f 77 3b 0a 20 20 20 20 20 20 20  NullRow;.       
1de70 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20   }.        pNew 
1de80 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
1de90 28 64 62 2c 20 70 43 6f 70 79 2c 20 30 29 3b 0a  (db, pCopy, 0);.
1dea0 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
1deb0 20 26 26 20 70 53 75 62 73 74 2d 3e 69 73 4c 65   && pSubst->isLe
1dec0 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20  ftJoin ){.      
1ded0 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
1dee0 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 43 61 6e  rty(pNew, EP_Can
1def0 42 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  BeNull);.       
1df00 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
1df10 4e 65 77 20 26 26 20 45 78 70 72 48 61 73 50 72  New && ExprHasPr
1df20 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
1df30 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
1df40 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 52 69         pNew->iRi
1df50 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70  ghtJoinTable = p
1df60 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
1df70 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20  Table;.         
1df80 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
1df90 28 70 4e 65 77 2c 20 45 50 5f 46 72 6f 6d 4a 6f  (pNew, EP_FromJo
1dfa0 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  in);.        }. 
1dfb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1dfc0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
1dfd0 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  pr);.        pEx
1dfe0 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  pr = pNew;.     
1dff0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
1e000 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  {.    if( pExpr-
1e010 3e 6f 70 3d 3d 54 4b 5f 49 46 5f 4e 55 4c 4c 5f  >op==TK_IF_NULL_
1e020 52 4f 57 20 26 26 20 70 45 78 70 72 2d 3e 69 54  ROW && pExpr->iT
1e030 61 62 6c 65 3d 3d 70 53 75 62 73 74 2d 3e 69 54  able==pSubst->iT
1e040 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 45  able ){.      pE
1e050 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 53  xpr->iTable = pS
1e060 75 62 73 74 2d 3e 69 4e 65 77 54 61 62 6c 65 3b  ubst->iNewTable;
1e070 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 78 70 72  .    }.    pExpr
1e080 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45  ->pLeft = substE
1e090 78 70 72 28 70 53 75 62 73 74 2c 20 70 45 78 70  xpr(pSubst, pExp
1e0a0 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 70  r->pLeft);.    p
1e0b0 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73  Expr->pRight = s
1e0c0 75 62 73 74 45 78 70 72 28 70 53 75 62 73 74 2c  ubstExpr(pSubst,
1e0d0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
1e0e0 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73  .    if( ExprHas
1e0f0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1e100 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
1e110 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c 65  .      substSele
1e120 63 74 28 70 53 75 62 73 74 2c 20 70 45 78 70 72  ct(pSubst, pExpr
1e130 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 31 29 3b  ->x.pSelect, 1);
1e140 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e150 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
1e160 70 53 75 62 73 74 2c 20 70 45 78 70 72 2d 3e 78  pSubst, pExpr->x
1e170 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  .pList);.    }. 
1e180 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
1e190 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  r;.}.static void
1e1a0 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a   substExprList(.
1e1b0 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20 2a    SubstContext *
1e1c0 70 53 75 62 73 74 2c 20 2f 2a 20 44 65 73 63 72  pSubst, /* Descr
1e1d0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  iption of the su
1e1e0 62 73 74 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20  bstitution */.  
1e1f0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
1e200 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f        /* List to
1e210 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69   scan and in whi
1e220 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74  ch to make subst
1e230 69 74 75 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 69  itutes */.){.  i
1e240 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1e250 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1e260 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1e270 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1e280 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e      pList->a[i].
1e290 70 45 78 70 72 20 3d 20 73 75 62 73 74 45 78 70  pExpr = substExp
1e2a0 72 28 70 53 75 62 73 74 2c 20 70 4c 69 73 74 2d  r(pSubst, pList-
1e2b0 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
1e2c0 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1e2d0 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20 53  substSelect(.  S
1e2e0 75 62 73 74 43 6f 6e 74 65 78 74 20 2a 70 53 75  ubstContext *pSu
1e2f0 62 73 74 2c 20 2f 2a 20 44 65 73 63 72 69 70 74  bst, /* Descript
1e300 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 62 73 74  ion of the subst
1e310 69 74 75 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  itution */.  Sel
1e320 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1e330 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
1e340 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20  tement in which 
1e350 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
1e360 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 64  tions */.  int d
1e370 6f 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  oPrior          
1e380 20 2f 2a 20 44 6f 20 73 75 62 73 74 69 74 75 74   /* Do substitut
1e390 65 73 20 6f 6e 20 70 2d 3e 70 50 72 69 6f 72 20  es on p->pPrior 
1e3a0 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  too */.){.  SrcL
1e3b0 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72  ist *pSrc;.  str
1e3c0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1e3d0 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
1e3e0 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
1e3f0 75 72 6e 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73  urn;.  do{.    s
1e400 75 62 73 74 45 78 70 72 4c 69 73 74 28 70 53 75  ubstExprList(pSu
1e410 62 73 74 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b  bst, p->pEList);
1e420 0a 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69  .    substExprLi
1e430 73 74 28 70 53 75 62 73 74 2c 20 70 2d 3e 70 47  st(pSubst, p->pG
1e440 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 75 62  roupBy);.    sub
1e450 73 74 45 78 70 72 4c 69 73 74 28 70 53 75 62 73  stExprList(pSubs
1e460 74 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  t, p->pOrderBy);
1e470 0a 20 20 20 20 70 2d 3e 70 48 61 76 69 6e 67 20  .    p->pHaving 
1e480 3d 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62  = substExpr(pSub
1e490 73 74 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  st, p->pHaving);
1e4a0 0a 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  .    p->pWhere =
1e4b0 20 73 75 62 73 74 45 78 70 72 28 70 53 75 62 73   substExpr(pSubs
1e4c0 74 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  t, p->pWhere);. 
1e4d0 20 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72     pSrc = p->pSr
1e4e0 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  c;.    assert( p
1e4f0 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  Src!=0 );.    fo
1e500 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20  r(i=pSrc->nSrc, 
1e510 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69  pItem=pSrc->a; i
1e520 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
1e530 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
1e540 6c 65 63 74 28 70 53 75 62 73 74 2c 20 70 49 74  lect(pSubst, pIt
1e550 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 31 29 3b  em->pSelect, 1);
1e560 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1e570 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
1e580 7b 0a 20 20 20 20 20 20 20 20 73 75 62 73 74 45  {.        substE
1e590 78 70 72 4c 69 73 74 28 70 53 75 62 73 74 2c 20  xprList(pSubst, 
1e5a0 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41  pItem->u1.pFuncA
1e5b0 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rg);.      }.   
1e5c0 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 64 6f 50   }.  }while( doP
1e5d0 72 69 6f 72 20 26 26 20 28 70 20 3d 20 70 2d 3e  rior && (p = p->
1e5e0 70 50 72 69 6f 72 29 21 3d 30 20 29 3b 0a 7d 0a  pPrior)!=0 );.}.
1e5f0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
1e600 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
1e610 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
1e620 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1e630 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21  _VIEW) */..#if !
1e640 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1e650 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
1e660 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1e670 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a  _OMIT_VIEW)./*.*
1e680 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1e690 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
1e6a0 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 73  en subqueries as
1e6b0 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f   a performance o
1e6c0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20  ptimization..** 
1e6d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1e6e0 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b  urns 1 if it mak
1e6f0 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30  es changes and 0
1e700 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e   if no flattenin
1e710 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  g occurs..**.** 
1e720 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  To understand th
1e730 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61  e concept of fla
1e740 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65  ttening, conside
1e750 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  r the following.
1e760 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  ** query:.**.** 
1e770 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
1e780 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53  M (SELECT x+y AS
1e790 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
1e7a0 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e   z<100) WHERE a>
1e7b0 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  5.**.** The defa
1e7c0 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65  ult way of imple
1e7d0 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65  menting this que
1e7e0 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65  ry is to execute
1e7f0 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79   the.** subquery
1e800 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65   first and store
1e810 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
1e820 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
1e830 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74  e, then.** run t
1e840 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f  he outer query o
1e850 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
1e860 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65   table.  This re
1e870 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61  quires two.** pa
1e880 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61  sses over the da
1e890 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65  ta.  Furthermore
1e8a0 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65  , because the te
1e8b0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a  mporary table.**
1e8c0 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c   has no indices,
1e8d0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1e8e0 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e on the outer q
1e8f0 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  uery cannot be.*
1e900 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a  * optimized..**.
1e910 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e920 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72  attempts to rewr
1e930 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68  ite queries such
1e940 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e   as the above in
1e950 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66  to.** a single f
1e960 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65  lat select, like
1e970 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1e980 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61   SELECT x+y AS a
1e990 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
1e9a0 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a  <100 AND a>5.**.
1e9b0 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
1e9c0 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73  rated for this s
1e9d0 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 67 69  implification gi
1e9e0 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73  ves the same res
1e9f0 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20  ult.** but only 
1ea00 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20  has to scan the 
1ea10 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20  data once.  And 
1ea20 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20  because indices 
1ea30 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20  might .** exist 
1ea40 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c  on the table t1,
1ea50 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e   a complete scan
1ea60 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67   of the data mig
1ea70 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64  ht be.** avoided
1ea80 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69  ..**.** Flatteni
1ea90 6e 67 20 69 73 20 73 75 62 6a 65 63 74 20 74 6f  ng is subject to
1eaa0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
1eab0 6f 6e 73 74 72 61 69 6e 74 73 3a 0a 2a 2a 0a 2a  onstraints:.**.*
1eac0 2a 20 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c  *  (**)  We no l
1ead0 6f 6e 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f  onger attempt to
1eae0 20 66 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61   flatten aggrega
1eaf0 74 65 20 73 75 62 71 75 65 72 69 65 73 2e 20 57  te subqueries. W
1eb00 61 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  as:.**        Th
1eb10 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
1eb20 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63  he outer query c
1eb30 61 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 61 67  annot both be ag
1eb40 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1eb50 20 28 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e   (**)  We no lon
1eb60 67 65 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66  ger attempt to f
1eb70 6c 61 74 74 65 6e 20 61 67 67 72 65 67 61 74 65  latten aggregate
1eb80 20 73 75 62 71 75 65 72 69 65 73 2e 20 57 61 73   subqueries. Was
1eb90 3a 0a 2a 2a 20 20 20 20 20 20 20 20 28 32 29 20  :.**        (2) 
1eba0 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1ebb0 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
1ebc0 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28  then.**        (
1ebd0 32 61 29 20 74 68 65 20 6f 75 74 65 72 20 71 75  2a) the outer qu
1ebe0 65 72 79 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ery must not be 
1ebf0 61 20 6a 6f 69 6e 20 61 6e 64 0a 2a 2a 20 20 20  a join and.**   
1ec00 20 20 20 20 20 28 32 62 29 20 74 68 65 20 6f 75       (2b) the ou
1ec10 74 65 72 20 71 75 65 72 79 20 6d 75 73 74 20 6e  ter query must n
1ec20 6f 74 20 75 73 65 20 73 75 62 71 75 65 72 69 65  ot use subquerie
1ec30 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
1ec40 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
1ec50 6f 6e 65 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  one FROM-clause 
1ec60 73 75 62 71 75 65 72 79 20 74 68 61 74 20 69 73  subquery that is
1ec70 20 61 20 63 61 6e 64 69 64 61 74 65 0a 2a 2a 20   a candidate.** 
1ec80 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
1ec90 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 28 54 68  flattening.  (Th
1eca0 69 73 20 69 73 20 64 75 65 20 74 6f 20 74 69 63  is is due to tic
1ecb0 6b 65 74 20 5b 32 66 37 31 37 30 64 37 33 62 66  ket [2f7170d73bf
1ecc0 39 61 62 66 38 30 5d 0a 2a 2a 20 20 20 20 20 20  9abf80].**      
1ecd0 20 20 20 20 20 20 20 66 72 6f 6d 20 32 30 31 35         from 2015
1ece0 2d 30 32 2d 30 39 2e 29 0a 2a 2a 0a 2a 2a 20 20  -02-09.).**.**  
1ecf0 20 28 33 29 20 20 49 66 20 74 68 65 20 73 75 62   (3)  If the sub
1ed00 71 75 65 72 79 20 69 73 20 74 68 65 20 72 69 67  query is the rig
1ed10 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20  ht operand of a 
1ed20 4c 45 46 54 20 4a 4f 49 4e 20 74 68 65 6e 0a 2a  LEFT JOIN then.*
1ed30 2a 20 20 20 20 20 20 20 20 28 33 61 29 20 74 68  *        (3a) th
1ed40 65 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  e subquery may n
1ed50 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 61 6e 64  ot be a join and
1ed60 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 62 29 20  .**        (3b) 
1ed70 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1ed80 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1ed90 6d 61 79 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  may not contain 
1eda0 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 20 20 20  a virtual.**    
1edb0 20 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 61           table a
1edc0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 33 63  nd.**        (3c
1edd0 29 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  ) the outer quer
1ede0 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20  y may not be an 
1edf0 61 67 67 72 65 67 61 74 65 2e 0a 2a 2a 0a 2a 2a  aggregate..**.**
1ee00 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
1ee10 75 65 72 79 20 63 61 6e 20 6e 6f 74 20 62 65 20  uery can not be 
1ee20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20  DISTINCT..**.** 
1ee30 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70 6f   (**)  At one po
1ee40 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  int restrictions
1ee50 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65 66   (4) and (5) def
1ee60 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f 66  ined a subset of
1ee70 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20 20   DISTINCT.**    
1ee80 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73 20      sub-queries 
1ee90 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75 64  that were exclud
1eea0 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 74  ed from this opt
1eeb0 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74 72  imization. Restr
1eec0 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20  iction .**      
1eed0 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65 20    (4) has since 
1eee0 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74 6f  been expanded to
1eef0 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49 53   exclude all DIS
1ef00 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65 73  TINCT subqueries
1ef10 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 57  ..**.**  (**)  W
1ef20 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 61 74 74 65  e no longer atte
1ef30 6d 70 74 20 74 6f 20 66 6c 61 74 74 65 6e 20 61  mpt to flatten a
1ef40 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
1ef50 69 65 73 2e 20 20 57 61 73 3a 0a 2a 2a 20 20 20  ies.  Was:.**   
1ef60 20 20 20 20 20 49 66 20 74 68 65 20 73 75 62 71       If the subq
1ef70 75 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74  uery is aggregat
1ef80 65 2c 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  e, the outer que
1ef90 72 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 44 49  ry may not be DI
1efa0 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
1efb0 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
1efc0 79 20 6d 75 73 74 20 68 61 76 65 20 61 20 46 52  y must have a FR
1efd0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f  OM clause.  TODO
1efe0 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72 69 65  :  For subquerie
1eff0 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20  s without.**    
1f000 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73      A FROM claus
1f010 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69  e, consider addi
1f020 6e 67 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  ng a FROM clause
1f030 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
1f040 6c 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c  l.**        tabl
1f050 65 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68  e sqlite_once th
1f060 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  at consists of a
1f070 20 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74   single row cont
1f080 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  aining a.**     
1f090 20 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a     single NULL..
1f0a0 2a 2a 0a 2a 2a 20 20 20 28 38 29 20 20 49 66 20  **.**   (8)  If 
1f0b0 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1f0c0 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
1f0d0 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1f0e0 20 6e 6f 74 20 62 65 20 61 20 6a 6f 69 6e 2e 0a   not be a join..
1f0f0 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20 49 66 20  **.**   (9)  If 
1f100 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1f110 73 20 4c 49 4d 49 54 20 74 68 65 6e 20 74 68 65  s LIMIT then the
1f120 20 6f 75 74 65 72 20 71 75 65 72 79 20 6d 61 79   outer query may
1f130 20 6e 6f 74 20 62 65 20 61 67 67 72 65 67 61 74   not be aggregat
1f140 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  e..**.**  (**)  
1f150 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 30 29  Restriction (10)
1f160 20 77 61 73 20 72 65 6d 6f 76 65 64 20 66 72 6f   was removed fro
1f170 6d 20 74 68 65 20 63 6f 64 65 20 6f 6e 20 32 30  m the code on 20
1f180 30 35 2d 30 32 2d 30 35 20 62 75 74 20 77 65 0a  05-02-05 but we.
1f190 2a 2a 20 20 20 20 20 20 20 20 61 63 63 69 64 65  **        accide
1f1a0 6e 74 6c 79 20 63 61 72 72 69 65 64 20 74 68 65  ntly carried the
1f1b0 20 63 6f 6d 6d 65 6e 74 20 66 6f 72 77 61 72 64   comment forward
1f1c0 20 75 6e 74 69 6c 20 32 30 31 34 2d 30 39 2d 31   until 2014-09-1
1f1d0 35 2e 20 20 4f 72 69 67 69 6e 61 6c 0a 2a 2a 20  5.  Original.** 
1f1e0 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e         constrain
1f1f0 74 3a 20 22 49 66 20 74 68 65 20 73 75 62 71 75  t: "If the subqu
1f200 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65  ery is aggregate
1f210 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65 72 20   then the outer 
1f220 71 75 65 72 79 20 0a 2a 2a 20 20 20 20 20 20 20  query .**       
1f230 20 6d 61 79 20 6e 6f 74 20 75 73 65 20 4c 49 4d   may not use LIM
1f240 49 54 2e 22 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29  IT.".**.**  (11)
1f250 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
1f260 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
1f270 72 79 20 6d 61 79 20 6e 6f 74 20 62 6f 74 68 20  ry may not both 
1f280 68 61 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c  have ORDER BY cl
1f290 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a  auses..**.**  (*
1f2a0 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e  *)  Not implemen
1f2b0 74 65 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69  ted.  Subsumed i
1f2c0 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20  nto restriction 
1f2d0 28 33 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f  (3).  Was previo
1f2e0 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61  usly.**        a
1f2f0 20 73 65 70 61 72 61 74 65 20 72 65 73 74 72 69   separate restri
1f300 63 74 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66  ction deriving f
1f310 72 6f 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e  rom ticket #350.
1f320 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68  .**.**  (13)  Th
1f330 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f  e subquery and o
1f340 75 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e  uter query may n
1f350 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49 4d 49  ot both use LIMI
1f360 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20  T..**.**  (14)  
1f370 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  The subquery may
1f380 20 6e 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e   not use OFFSET.
1f390 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20 20 49 66  .**.**  (15)  If
1f3a0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1f3b0 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 63 6f   is part of a co
1f3c0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
1f3d0 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  hen the.**      
1f3e0 20 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e    subquery may n
1f3f0 6f 74 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a  ot use LIMIT..**
1f400 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63          (See tic
1f410 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69  ket #2339 and ti
1f420 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34  cket [02a8e81d44
1f430 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20  ])..**.**  (16) 
1f440 20 49 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   If the outer qu
1f450 65 72 79 20 69 73 20 61 67 67 72 65 67 61 74 65  ery is aggregate
1f460 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 71 75  , then the subqu
1f470 65 72 79 20 6d 61 79 20 6e 6f 74 0a 2a 2a 20 20  ery may not.**  
1f480 20 20 20 20 20 20 75 73 65 20 4f 52 44 45 52 20        use ORDER 
1f490 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23 32 39  BY.  (Ticket #29
1f4a0 34 32 29 20 20 54 68 69 73 20 75 73 65 64 20 74  42)  This used t
1f4b0 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20  o not matter.** 
1f4c0 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77 65 20         until we 
1f4d0 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65 20 67  introduced the g
1f4e0 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20 66 75  roup_concat() fu
1f4f0 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20  nction.  .**.** 
1f500 20 28 31 37 29 20 20 49 66 20 74 68 65 20 73 75   (17)  If the su
1f510 62 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  bquery is a comp
1f520 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
1f530 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 61  n.**        (17a
1f540 29 20 61 6c 6c 20 63 6f 6d 70 6f 75 6e 64 20 6f  ) all compound o
1f550 70 65 72 61 74 6f 72 73 20 6d 75 73 74 20 62 65  perators must be
1f560 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 61 6e   a UNION ALL, an
1f570 64 0a 2a 2a 20 20 20 20 20 20 20 20 28 31 37 62  d.**        (17b
1f580 29 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68 69  ) no terms withi
1f590 6e 20 74 68 65 20 73 75 62 71 75 65 72 79 20 63  n the subquery c
1f5a0 6f 6d 70 6f 75 6e 64 20 6d 61 79 20 62 65 20 61  ompound may be a
1f5b0 67 67 72 65 67 61 74 65 0a 2a 2a 20 20 20 20 20  ggregate.**     
1f5c0 20 20 20 20 20 20 20 20 20 6f 72 20 44 49 53 54           or DIST
1f5d0 49 4e 43 54 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  INCT, and.**    
1f5e0 20 20 20 20 28 31 37 63 29 20 65 76 65 72 79 20      (17c) every 
1f5f0 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20  term within the 
1f600 73 75 62 71 75 65 72 79 20 63 6f 6d 70 6f 75 6e  subquery compoun
1f610 64 20 6d 75 73 74 20 68 61 76 65 20 61 20 46 52  d must have a FR
1f620 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20  OM clause.**    
1f630 20 20 20 20 28 31 37 64 29 20 74 68 65 20 6f 75      (17d) the ou
1f640 74 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f  ter query may no
1f650 74 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  t be.**         
1f660 20 20 20 20 20 28 31 37 64 31 29 20 61 67 67 72       (17d1) aggr
1f670 65 67 61 74 65 2c 20 6f 72 0a 2a 2a 20 20 20 20  egate, or.**    
1f680 20 20 20 20 20 20 20 20 20 20 28 31 37 64 32 29            (17d2)
1f690 20 44 49 53 54 49 4e 43 54 2c 20 6f 72 0a 2a 2a   DISTINCT, or.**
1f6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 31                (1
1f6b0 37 64 33 29 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a  7d3) a join..**.
1f6c0 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61  **        The pa
1f6d0 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65  rent and sub-que
1f6e0 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57  ry may contain W
1f6f0 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75  HERE clauses. Su
1f700 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20  bject to.**     
1f710 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28     rules (11), (
1f720 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68  13) and (14), th
1f730 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74  ey may also cont
1f740 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a  ain ORDER BY,.**
1f750 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e          LIMIT an
1f760 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
1f770 2e 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  .  The subquery 
1f780 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63  cannot use any c
1f790 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
1f7a0 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72    operator other
1f7b0 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20   than UNION ALL 
1f7c0 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20  because all the 
1f7d0 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a  other compound.*
1f7e0 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f  *        operato
1f7f0 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69  rs have an impli
1f800 65 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63  ed DISTINCT whic
1f810 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20  h is disallowed 
1f820 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73  by.**        res
1f830 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a  triction (4)..**
1f840 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c  .**        Also,
1f850 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20   each component 
1f860 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  of the sub-query
1f870 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65   must return the
1f880 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   same number.** 
1f890 20 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74         of result
1f8a0 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69   columns. This i
1f8b0 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71  s actually a req
1f8c0 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79  uirement for any
1f8d0 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
1f8e0 20 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65      SELECT state
1f8f0 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68  ment, but all th
1f900 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73  e code here does
1f910 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68   is make sure th
1f920 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20  at no.**        
1f930 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73  such (illegal) s
1f940 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74  ub-query is flat
1f950 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  tened. The calle
1f960 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68  r will detect th
1f970 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74  e.**        synt
1f980 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74  ax error and ret
1f990 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d  urn a detailed m
1f9a0 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  essage..**.**  (
1f9b0 31 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  18)  If the sub-
1f9c0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
1f9d0 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
1f9e0 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
1f9f0 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45  e.**        ORDE
1fa00 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 74  R BY clause of t
1fa10 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62  he parent must b
1fa20 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e  e simple referen
1fa30 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20  ces to .**      
1fa40 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65    columns of the
1fa50 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a   sub-query..**.*
1fa60 2a 20 20 28 31 39 29 20 20 49 66 20 74 68 65 20  *  (19)  If the 
1fa70 73 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49  subquery uses LI
1fa80 4d 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74  MIT then the out
1fa90 65 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74  er query may not
1faa0 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20  .**        have 
1fab0 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  a WHERE clause..
1fac0 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20  **.**  (20)  If 
1fad0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1fae0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1faf0 63 74 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  ct, then it must
1fb00 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
1fb10 20 20 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63     an ORDER BY c
1fb20 6c 61 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23  lause.  Ticket #
1fb30 33 37 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20  3773.  We could 
1fb40 72 65 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74  relax this const
1fb50 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20  raint.**        
1fb60 73 6f 6d 65 77 68 61 74 20 62 79 20 73 61 79 69  somewhat by sayi
1fb70 6e 67 20 74 68 61 74 20 74 68 65 20 74 65 72 6d  ng that the term
1fb80 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
1fb90 59 20 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a  Y clause must.**
1fba0 20 20 20 20 20 20 20 20 61 70 70 65 61 72 20 61          appear a
1fbb0 73 20 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73  s unmodified res
1fbc0 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  ult columns in t
1fbd0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20  he outer query. 
1fbe0 20 42 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20   But we.**      
1fbf0 20 20 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74    have other opt
1fc00 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69  imizations in mi
1fc10 6e 64 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  nd to deal with 
1fc20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  that case..**.**
1fc30 20 20 28 32 31 29 20 20 49 66 20 74 68 65 20 73    (21)  If the s
1fc40 75 62 71 75 65 72 79 20 75 73 65 73 20 4c 49 4d  ubquery uses LIM
1fc50 49 54 20 74 68 65 6e 20 74 68 65 20 6f 75 74 65  IT then the oute
1fc60 72 20 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  r query may not 
1fc70 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  be.**        DIS
1fc80 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74 69 63  TINCT.  (See tic
1fc90 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66 63 5d  ket [752e1646fc]
1fca0 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20  )..**.**  (22)  
1fcb0 54 68 65 20 73 75 62 71 75 65 72 79 20 6d 61 79  The subquery may
1fcc0 20 6e 6f 74 20 62 65 20 61 20 72 65 63 75 72 73   not be a recurs
1fcd0 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20  ive CTE..**.**  
1fce0 28 2a 2a 29 20 20 53 75 62 73 75 6d 65 64 20 69  (**)  Subsumed i
1fcf0 6e 74 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20  nto restriction 
1fd00 28 31 37 64 33 29 2e 20 20 57 61 73 3a 20 49 66  (17d3).  Was: If
1fd10 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1fd20 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 61 20   is.**        a 
1fd30 72 65 63 75 72 73 69 76 65 20 43 54 45 2c 20 74  recursive CTE, t
1fd40 68 65 6e 20 74 68 65 20 73 75 62 2d 71 75 65 72  hen the sub-quer
1fd50 79 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63  y may not be a c
1fd60 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a  ompound query..*
1fd70 2a 20 20 20 20 20 20 20 20 54 68 69 73 20 72 65  *        This re
1fd80 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62 65 63  striction is bec
1fd90 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e  ause transformin
1fda0 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  g the.**        
1fdb0 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70  parent to a comp
1fdc0 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e 66 75  ound query confu
1fdd0 73 65 73 20 74 68 65 20 63 6f 64 65 20 74 68 61  ses the code tha
1fde0 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20  t handles.**    
1fdf0 20 20 20 20 72 65 63 75 72 73 69 76 65 20 71 75      recursive qu
1fe00 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69 53 65  eries in multiSe
1fe10 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 28  lect()..**.**  (
1fe20 2a 2a 29 20 20 57 65 20 6e 6f 20 6c 6f 6e 67 65  **)  We no longe
1fe30 72 20 61 74 74 65 6d 70 74 20 74 6f 20 66 6c 61  r attempt to fla
1fe40 74 74 65 6e 20 61 67 67 72 65 67 61 74 65 20 73  tten aggregate s
1fe50 75 62 71 75 65 72 69 65 73 2e 20 20 57 61 73 3a  ubqueries.  Was:
1fe60 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20 73  .**        The s
1fe70 75 62 71 75 65 72 79 20 6d 61 79 20 6e 6f 74 20  ubquery may not 
1fe80 62 65 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  be an aggregate 
1fe90 74 68 61 74 20 75 73 65 73 20 74 68 65 20 62 75  that uses the bu
1fea0 69 6c 74 2d 69 6e 20 6d 69 6e 28 29 20 6f 72 20  ilt-in min() or 
1feb0 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 20 6d 61  .**        or ma
1fec0 78 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  x() functions.  
1fed0 28 57 69 74 68 6f 75 74 20 74 68 69 73 20 72 65  (Without this re
1fee0 73 74 72 69 63 74 69 6f 6e 2c 20 61 20 71 75 65  striction, a que
1fef0 72 79 20 6c 69 6b 65 3a 0a 2a 2a 20 20 20 20 20  ry like:.**     
1ff00 20 20 20 22 53 45 4c 45 43 54 20 78 20 46 52 4f     "SELECT x FRO
1ff10 4d 20 28 53 45 4c 45 43 54 20 6d 61 78 28 79 29  M (SELECT max(y)
1ff20 2c 20 78 20 46 52 4f 4d 20 74 31 29 22 20 77 6f  , x FROM t1)" wo
1ff30 75 6c 64 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  uld not necessar
1ff40 69 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65  ily.**        re
1ff50 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 58  turn the value X
1ff60 20 66 6f 72 20 77 68 69 63 68 20 59 20 77 61 73   for which Y was
1ff70 20 6d 61 78 69 6d 61 6c 2e 29 0a 2a 2a 0a 2a 2a   maximal.).**.**
1ff80 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74  .** In this rout
1ff90 69 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72  ine, the "p" par
1ffa0 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
1ffb0 74 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72  ter to the outer
1ffc0 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
1ffd0 75 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53  ubquery is p->pS
1ffe0 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69  rc->a[iFrom].  i
1fff0 73 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20  sAgg is true if 
20000 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a  the outer query.
20010 2a 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74  ** uses aggregat
20020 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61  es..**.** If fla
20030 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61  ttening is not a
20040 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72  ttempted, this r
20050 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
20060 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e  p and returns 0.
20070 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e  .** If flattenin
20080 67 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74  g is attempted t
20090 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
200a0 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  rns 1..**.** All
200b0 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
200c0 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74  on analysis must
200d0 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74   occur on both t
200e0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61  he outer query a
200f0 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65  nd.** the subque
20100 72 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ry before this r
20110 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a  outine runs..*/.
20120 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74  static int flatt
20130 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61  enSubquery(.  Pa
20140 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
20150 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
20160 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
20170 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
20180 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72  /* The parent or
20190 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74   outer SELECT st
201a0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
201b0 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20   iFrom,         
201c0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d    /* Index in p-
201d0 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68  >pSrc->a[] of th
201e0 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79  e inner subquery
201f0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 20   */.  int isAgg 
20200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20210 75 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45  ue if outer SELE
20220 43 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74  CT uses aggregat
20230 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29  e functions */.)
20240 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
20250 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78  zSavedAuthContex
20260 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
20270 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65  hContext;.  Sele
20280 63 74 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20  ct *pParent;    
20290 2f 2a 20 43 75 72 72 65 6e 74 20 55 4e 49 4f 4e  /* Current UNION
202a0 20 41 4c 4c 20 74 65 72 6d 20 6f 66 20 74 68 65   ALL term of the
202b0 20 6f 74 68 65 72 20 71 75 65 72 79 20 2a 2f 0a   other query */.
202c0 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20    Select *pSub; 
202d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e        /* The inn
202e0 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75 62  er query or "sub
202f0 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65  query" */.  Sele
20300 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20  ct *pSub1;      
20310 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
20320 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65  e rightmost sele
20330 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20  ct in sub-query 
20340 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
20350 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
20360 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
20370 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a  he outer query *
20380 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75  /.  SrcList *pSu
20390 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46  bSrc;   /* The F
203a0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
203b0 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  e subquery */.  
203c0 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20  int iParent;    
203d0 20 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73      /* VDBE curs
203e0 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  or number of the
203f0 20 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74   pSub result set
20400 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
20410 20 69 6e 74 20 69 4e 65 77 50 61 72 65 6e 74 20   int iNewParent 
20420 3d 20 2d 31 3b 2f 2a 20 52 65 70 6c 61 63 65 6d  = -1;/* Replacem
20430 65 6e 74 20 74 61 62 6c 65 20 66 6f 72 20 69 50  ent table for iP
20440 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  arent */.  int i
20450 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 30 3b 20 2f  sLeftJoin = 0; /
20460 2a 20 54 72 75 65 20 69 66 20 70 53 75 62 20 69  * True if pSub i
20470 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
20480 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
20490 2a 2f 20 20 20 20 0a 20 20 69 6e 74 20 69 3b 20  */    .  int i; 
204a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
204b0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
204c0 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
204d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204e0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
204f0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
20500 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
20510 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
20520 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
20530 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
20540 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
20550 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
20560 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
20570 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
20580 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
20590 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
205a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
205b0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20  >pPrior==0 );.  
205c0 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e  if( Optimization
205d0 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  Disabled(db, SQL
205e0 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
205f0 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  er) ) return 0;.
20600 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63    pSrc = p->pSrc
20610 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63  ;.  assert( pSrc
20620 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20   && iFrom>=0 && 
20630 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63  iFrom<pSrc->nSrc
20640 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d   );.  pSubitem =
20650 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d   &pSrc->a[iFrom]
20660 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53  ;.  iParent = pS
20670 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  ubitem->iCursor;
20680 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69 74  .  pSub = pSubit
20690 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61  em->pSelect;.  a
206a0 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20 29  ssert( pSub!=0 )
206b0 3b 0a 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70  ;..  pSubSrc = p
206c0 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
206d0 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
206e0 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65    /* Prior to ve
206f0 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65  rsion 3.1.2, whe
20700 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
20710 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d  ET had to be sim
20720 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20  ple constants,. 
20730 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72   ** not arbitrar
20740 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77  y expressions, w
20750 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63  e allowed some c
20760 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49  ombining of LIMI
20770 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
20780 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20 63  * because they c
20790 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
207a0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
207b0 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49  .  But when LIMI
207c0 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a  T and OFFSET.  *
207d0 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72 61  * became arbitra
207e0 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  ry expressions, 
207f0 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20 74  we were forced t
20800 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69 6f  o add restrictio
20810 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64  ns (13).  ** and
20820 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20   (14). */.  if( 
20830 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
20840 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
20850 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
20860 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
20870 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20  n (13) */.  if( 
20880 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20  pSub->pLimit && 
20890 70 53 75 62 2d 3e 70 4c 69 6d 69 74 2d 3e 70 52  pSub->pLimit->pR
208a0 69 67 68 74 20 29 20 72 65 74 75 72 6e 20 30 3b  ight ) return 0;
208b0 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
208c0 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20  n (14) */.  if( 
208d0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
208e0 46 5f 43 6f 6d 70 6f 75 6e 64 29 21 3d 30 20 26  F_Compound)!=0 &
208f0 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  & pSub->pLimit )
20900 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
20910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
20940 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a  striction (15) *
20950 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
20960 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
20970 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
20980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20990 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37  * Restriction (7
209a0 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
209b0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
209c0 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
209d0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  n 0;           /
209e0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 34  * Restriction (4
209f0 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
20a00 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72  ->pLimit && (pSr
20a10 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
20a20 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
20a30 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
20a40 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38   Restrictions (8
20a50 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  )(9) */.  }.  if
20a60 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
20a70 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
20a80 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
20a90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
20ac0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20  estriction (11) 
20ad0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41  */.  }.  if( isA
20ae0 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  gg && pSub->pOrd
20af0 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  erBy ) return 0;
20b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b10 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
20b20 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  16) */.  if( pSu
20b30 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
20b40 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
20b50 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
20b60 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
20b70 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  19) */.  if( pSu
20b80 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d  b->pLimit && (p-
20b90 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
20ba0 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20  istinct)!=0 ){. 
20bb0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
20bc0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
20bd0 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d  tion (21) */.  }
20be0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
20bf0 46 6c 61 67 73 20 26 20 28 53 46 5f 52 65 63 75  Flags & (SF_Recu
20c00 72 73 69 76 65 29 20 29 7b 0a 20 20 20 20 72 65  rsive) ){.    re
20c10 74 75 72 6e 20 30 3b 20 2f 2a 20 52 65 73 74 72  turn 0; /* Restr
20c20 69 63 74 69 6f 6e 73 20 28 32 32 29 20 2a 2f 0a  ictions (22) */.
20c30 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
20c40 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
20c50 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
20c60 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
20c70 49 4e 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a  IN, then the.  *
20c80 2a 20 73 75 62 71 75 65 72 79 20 6d 61 79 20 6e  * subquery may n
20c90 6f 74 20 62 65 20 61 20 6a 6f 69 6e 20 69 74 73  ot be a join its
20ca0 65 6c 66 20 28 33 61 29 2e 20 45 78 61 6d 70 6c  elf (3a). Exampl
20cb0 65 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73  e of why this is
20cc0 20 6e 6f 74 0a 20 20 2a 2a 20 61 6c 6c 6f 77 65   not.  ** allowe
20cd0 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
20ce0 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
20cf0 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e  ER JOIN (t2 JOIN
20d00 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   t3).  **.  ** I
20d10 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
20d20 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
20d30 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
20d40 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
20d50 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a  OUTER JOIN t2) J
20d60 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a  OIN t3.  **.  **
20d70 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74   which is not at
20d80 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68   all the same th
20d90 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ing..  **.  ** I
20da0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
20db0 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
20dc0 61 6e 64 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  and of a LEFT JO
20dd0 49 4e 2c 20 74 68 65 6e 20 74 68 65 20 6f 75 74  IN, then the out
20de0 65 72 0a 20 20 2a 2a 20 71 75 65 72 79 20 63 61  er.  ** query ca
20df0 6e 6e 6f 74 20 62 65 20 61 6e 20 61 67 67 72 65  nnot be an aggre
20e00 67 61 74 65 2e 20 28 33 63 29 20 20 54 68 69 73  gate. (3c)  This
20e10 20 69 73 20 61 6e 20 61 72 74 69 66 61 63 74 20   is an artifact 
20e20 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20  of the way.  ** 
20e30 61 67 67 72 65 67 61 74 65 73 20 61 72 65 20 70  aggregates are p
20e40 72 6f 63 65 73 73 65 64 20 2d 20 74 68 65 72 65  rocessed - there
20e50 20 69 73 20 6e 6f 20 6d 65 63 68 61 6e 69 73 6d   is no mechanism
20e60 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
20e70 0a 20 20 2a 2a 20 74 68 65 20 4c 45 46 54 20 4a  .  ** the LEFT J
20e80 4f 49 4e 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  OIN table should
20e90 20 62 65 20 61 6c 6c 2d 4e 55 4c 4c 2e 0a 20 20   be all-NULL..  
20ea0 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f  **.  ** See also
20eb0 20 74 69 63 6b 65 74 73 20 23 33 30 36 2c 20 23   tickets #306, #
20ec0 33 35 30 2c 20 61 6e 64 20 23 33 33 30 30 2e 0a  350, and #3300..
20ed0 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62    */.  if( (pSub
20ee0 69 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  item->fg.jointyp
20ef0 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
20f00 20 29 7b 0a 20 20 20 20 69 73 4c 65 66 74 4a 6f   ){.    isLeftJo
20f10 69 6e 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  in = 1;.    if( 
20f20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3e 31 20  pSubSrc->nSrc>1 
20f30 7c 7c 20 69 73 41 67 67 20 7c 7c 20 49 73 56 69  || isAgg || IsVi
20f40 72 74 75 61 6c 28 70 53 75 62 53 72 63 2d 3e 61  rtual(pSubSrc->a
20f50 5b 30 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20  [0].pTab) ){.   
20f60 20 20 20 2f 2a 20 20 28 33 61 29 20 20 20 20 20     /*  (3a)     
20f70 20 20 20 20 20 20 20 20 28 33 63 29 20 20 20 20          (3c)    
20f80 20 28 33 62 29 20 2a 2f 0a 20 20 20 20 20 20 72   (3b) */.      r
20f90 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
20fa0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
20fb0 5f 45 58 54 52 41 5f 49 46 4e 55 4c 4c 52 4f 57  _EXTRA_IFNULLROW
20fc0 0a 20 20 65 6c 73 65 20 69 66 28 20 69 46 72 6f  .  else if( iFro
20fd0 6d 3e 30 20 26 26 20 21 69 73 41 67 67 20 29 7b  m>0 && !isAgg ){
20fe0 0a 20 20 20 20 2f 2a 20 53 65 74 74 69 6e 67 20  .    /* Setting 
20ff0 69 73 4c 65 66 74 4a 6f 69 6e 20 74 6f 20 2d 31  isLeftJoin to -1
21000 20 63 61 75 73 65 73 20 4f 50 5f 49 66 4e 75 6c   causes OP_IfNul
21010 6c 52 6f 77 20 6f 70 63 6f 64 65 73 20 74 6f 20  lRow opcodes to 
21020 62 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72  be generated for
21030 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72 65  .    ** every re
21040 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 72  ference to any r
21050 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 66 72 6f  esult column fro
21060 6d 20 73 75 62 71 75 65 72 79 20 69 6e 20 61 20  m subquery in a 
21070 6a 6f 69 6e 2c 20 65 76 65 6e 0a 20 20 20 20 2a  join, even.    *
21080 2a 20 74 68 6f 75 67 68 20 74 68 65 79 20 61 72  * though they ar
21090 65 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  e not necessary.
210a0 20 20 54 68 69 73 20 77 69 6c 6c 20 73 74 72 65    This will stre
210b0 73 73 2d 74 65 73 74 20 74 68 65 20 4f 50 5f 49  ss-test the OP_I
210c0 66 4e 75 6c 6c 52 6f 77 20 0a 20 20 20 20 2a 2a  fNullRow .    **
210d0 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20   opcode. */.    
210e0 69 73 4c 65 66 74 4a 6f 69 6e 20 3d 20 2d 31 3b  isLeftJoin = -1;
210f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
21100 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
21110 37 29 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71  7): If the sub-q
21120 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
21130 6e 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20  nd SELECT, then 
21140 69 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65  it must.  ** use
21150 20 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20   only the UNION 
21160 41 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e  ALL operator. An
21170 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69  d none of the si
21180 6d 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72  mple select quer
21190 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61  ies.  ** that ma
211a0 6b 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75  ke up the compou
211b0 6e 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c  nd SELECT are al
211c0 6c 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72  lowed to be aggr
211d0 65 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63  egate or distinc
211e0 74 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a  t.  ** queries..
211f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d    */.  if( pSub-
21200 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
21210 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  f( pSub->pOrderB
21220 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
21230 6e 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63  n 0;  /* Restric
21240 74 69 6f 6e 20 28 32 30 29 20 2a 2f 0a 20 20 20  tion (20) */.   
21250 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41 67 67   }.    if( isAgg
21260 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73   || (p->selFlags
21270 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21   & SF_Distinct)!
21280 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63  =0 || pSrc->nSrc
21290 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=1 ){.      ret
212a0 75 72 6e 20 30 3b 20 2f 2a 20 28 31 37 64 31 29  urn 0; /* (17d1)
212b0 2c 20 28 31 37 64 32 29 2c 20 6f 72 20 28 31 37  , (17d2), or (17
212c0 64 33 29 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  d3) */.    }.   
212d0 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75 62 3b   for(pSub1=pSub;
212e0 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d 70 53   pSub1; pSub1=pS
212f0 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  ub1->pPrior){.  
21300 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
21310 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
21320 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
21330 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
21340 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20 20 20  _Distinct );.   
21350 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 53     testcase( (pS
21360 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
21370 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
21380 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
21390 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
213a0 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
213b0 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 20 20  >pSrc!=0 );.    
213c0 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e    assert( pSub->
213d0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 70  pEList->nExpr==p
213e0 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  Sub1->pEList->nE
213f0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 69 66 28  xpr );.      if(
21400 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
21410 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
21420 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21  |SF_Aggregate))!
21430 3d 30 20 20 20 20 2f 2a 20 28 31 37 62 29 20 2a  =0    /* (17b) *
21440 2f 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75  /.       || (pSu
21450 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53  b1->pPrior && pS
21460 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ub1->op!=TK_ALL)
21470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21480 20 2f 2a 20 28 31 37 61 29 20 2a 2f 0a 20 20 20   /* (17a) */.   
21490 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53      || pSub1->pS
214a0 72 63 2d 3e 6e 53 72 63 3c 31 20 20 20 20 20 20  rc->nSrc<1      
214b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
214d0 31 37 63 29 20 2a 2f 0a 20 20 20 20 20 20 29 7b  17c) */.      ){
214e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
214f0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
21500 20 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31   testcase( pSub1
21510 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29  ->pSrc->nSrc>1 )
21520 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
21530 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 38 29  Restriction (18)
21540 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
21550 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
21560 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
21570 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e  for(ii=0; ii<p->
21580 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
21590 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
215a0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  if( p->pOrderBy-
215b0 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65  >a[ii].u.x.iOrde
215c0 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  rByCol==0 ) retu
215d0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
215e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78    }.  }..  /* Ex
215f0 2d 72 65 73 74 72 69 63 74 69 6f 6e 20 28 32 33  -restriction (23
21600 29 3a 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 6c 79  ):.  ** The only
21610 20 77 61 79 20 74 68 61 74 20 74 68 65 20 72 65   way that the re
21620 63 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20  cursive part of 
21630 61 20 43 54 45 20 63 61 6e 20 63 6f 6e 74 61 69  a CTE can contai
21640 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 2a  n a compound.  *
21650 2a 20 73 75 62 71 75 65 72 79 20 69 73 20 66 6f  * subquery is fo
21660 72 20 74 68 65 20 73 75 62 71 75 65 72 79 20 74  r the subquery t
21670 6f 20 62 65 20 6f 6e 65 20 74 65 72 6d 20 6f 66  o be one term of
21680 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74 20 69 66   a join.  But if
21690 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
216a0 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 74 68  ry is a join, th
216b0 65 6e 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e  en the flattenin
216c0 67 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  g has already be
216d0 65 6e 20 73 74 6f 70 70 65 64 20 62 79 0a 20 20  en stopped by.  
216e0 2a 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  ** restriction (
216f0 31 37 64 33 29 0a 20 20 2a 2f 0a 20 20 61 73 73  17d3).  */.  ass
21700 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
21710 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
21720 29 3d 3d 30 20 7c 7c 20 70 53 75 62 2d 3e 70 50  )==0 || pSub->pP
21730 72 69 6f 72 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  rior==0 );..  /*
21740 2a 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68  **** If we reach
21750 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61   this point, fla
21760 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
21770 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 20 20 53  tted. *****/.  S
21780 45 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61  ELECTTRACE(1,pPa
21790 72 73 65 2c 70 2c 28 22 66 6c 61 74 74 65 6e 20  rse,p,("flatten 
217a0 25 73 2e 25 70 20 66 72 6f 6d 20 74 65 72 6d 20  %s.%p from term 
217b0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
217c0 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
217d0 7a 53 65 6c 4e 61 6d 65 2c 20 70 53 75 62 2c 20  zSelName, pSub, 
217e0 69 46 72 6f 6d 29 29 3b 0a 0a 20 20 2f 2a 20 41  iFrom));..  /* A
217f0 75 74 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62  uthorize the sub
21800 71 75 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73  query */.  pPars
21810 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
21820 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  = pSubitem->zNam
21830 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20  e;.  TESTONLY(i 
21840 3d 29 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  =) sqlite3AuthCh
21850 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
21860 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TE_SELECT, 0, 0,
21870 20 30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28   0);.  testcase(
21880 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20   i==SQLITE_DENY 
21890 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  );.  pParse->zAu
218a0 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
218b0 65 64 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a  edAuthContext;..
218c0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
218d0 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
218e0 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
218f0 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72  ment, then (by r
21900 65 73 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a  estrictions.  **
21910 20 31 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65   17 and 18 above
21920 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 20 55  ) it must be a U
21930 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65  NION ALL and the
21940 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75   parent query mu
21950 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74  st .  ** be of t
21960 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20  he form:.  **.  
21970 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65  **     SELECT <e
21980 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28  xpr-list> FROM (
21990 3c 73 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68  <sub-query>) <wh
219a0 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a  ere-clause> .  *
219b0 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20  *.  ** followed 
219c0 62 79 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c  by any ORDER BY,
219d0 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46   LIMIT and/or OF
219e0 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68  FSET clauses. Th
219f0 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72  is block.  ** cr
21a00 65 61 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73  eates N-1 copies
21a10 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 71   of the parent q
21a20 75 65 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79  uery without any
21a30 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
21a40 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54   or .  ** OFFSET
21a50 20 63 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69   clauses and joi
21a60 6e 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c  ns them to the l
21a70 65 66 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66  eft-hand-side of
21a80 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20   the original.  
21a90 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41  ** using UNION A
21aa0 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e  LL operators. In
21ab0 20 74 68 69 73 20 63 61 73 65 20 4e 20 69 73 20   this case N is 
21ac0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  the number of si
21ad0 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74  mple.  ** select
21ae0 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74   statements in t
21af0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d  he compound sub-
21b00 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  query..  **.  **
21b10 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
21b20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
21b30 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20  +1 FROM (.  **  
21b40 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46        SELECT x F
21b50 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
21b60 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
21b70 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
21b80 20 79 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a   y FROM tab.  **
21b90 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
21ba0 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  L.  **        SE
21bb0 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52  LECT abs(z*2) FR
21bc0 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20  OM tab2.  **    
21bd0 20 29 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52   ) WHERE a!=5 OR
21be0 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
21bf0 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69  ** Transformed i
21c00 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  nto:.  **.  **  
21c10 20 20 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52     SELECT x+1 FR
21c20 4f 4d 20 74 61 62 20 57 48 45 52 45 20 78 2b 31  OM tab WHERE x+1
21c30 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
21c40 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
21c50 53 45 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20  SELECT y+1 FROM 
21c60 74 61 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35  tab WHERE y+1!=5
21c70 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
21c80 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
21c90 45 43 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46  ECT abs(z*2)+1 F
21ca0 52 4f 4d 20 74 61 62 32 20 57 48 45 52 45 20 61  ROM tab2 WHERE a
21cb0 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a  bs(z*2)+1!=5.  *
21cc0 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 31  *     ORDER BY 1
21cd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61  .  **.  ** We ca
21ce0 6c 6c 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d  ll this the "com
21cf0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66  pound-subquery f
21d00 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f  lattening"..  */
21d10 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62  .  for(pSub=pSub
21d20 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20  ->pPrior; pSub; 
21d30 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
21d40 72 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  r){.    Select *
21d50 70 4e 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69  pNew;.    ExprLi
21d60 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
21d70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
21d80 45 78 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70  Expr *pLimit = p
21d90 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 53 65  ->pLimit;.    Se
21da0 6c 65 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70  lect *pPrior = p
21db0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d  ->pPrior;.    p-
21dc0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
21dd0 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a     p->pSrc = 0;.
21de0 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
21df0 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  0;.    p->pLimit
21e00 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d   = 0;.    pNew =
21e10 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
21e20 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20  p(db, p, 0);.   
21e30 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 53 65   sqlite3SelectSe
21e40 74 4e 61 6d 65 28 70 4e 65 77 2c 20 70 53 75 62  tName(pNew, pSub
21e50 2d 3e 7a 53 65 6c 4e 61 6d 65 29 3b 0a 20 20 20  ->zSelName);.   
21e60 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69   p->pLimit = pLi
21e70 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  mit;.    p->pOrd
21e80 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
21e90 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  .    p->pSrc = p
21ea0 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20 3d  Src;.    p->op =
21eb0 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 69 66 28   TK_ALL;.    if(
21ec0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
21ed0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
21ee0 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rior;.    }else{
21ef0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72  .      pNew->pPr
21f00 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20  ior = pPrior;.  
21f10 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 20 29      if( pPrior )
21f20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d   pPrior->pNext =
21f30 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 4e 65   pNew;.      pNe
21f40 77 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  w->pNext = p;.  
21f50 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
21f60 70 4e 65 77 3b 0a 20 20 20 20 20 20 53 45 4c 45  pNew;.      SELE
21f70 43 54 54 52 41 43 45 28 32 2c 70 50 61 72 73 65  CTTRACE(2,pParse
21f80 2c 70 2c 28 22 63 6f 6d 70 6f 75 6e 64 2d 73 75  ,p,("compound-su
21f90 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 65 72  bquery flattener
21fa0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
21fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fc0 22 20 63 72 65 61 74 65 73 20 25 73 2e 25 70 20  " creates %s.%p 
21fd0 61 73 20 70 65 65 72 5c 6e 22 2c 70 4e 65 77 2d  as peer\n",pNew-
21fe0 3e 7a 53 65 6c 4e 61 6d 65 2c 20 70 4e 65 77 29  >zSelName, pNew)
21ff0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
22000 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
22010 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
22020 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c  }..  /* Begin fl
22030 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72  attening the iFr
22040 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
22050 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a  he FROM clause .
22060 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65    ** in the oute
22070 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  r query..  */.  
22080 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70  pSub = pSub1 = p
22090 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
220a0 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  ;..  /* Delete t
220b0 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62  he transient tab
220c0 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73  le structure ass
220d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
220e0 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20  .  ** subquery. 
220f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
22100 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
22110 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
22120 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
22130 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  , pSubitem->zNam
22140 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
22150 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
22160 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75  ->zAlias);.  pSu
22170 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
22180 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
22190 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
221a0 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  Subitem->zAlias 
221b0 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
221c0 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20  >pSelect = 0;.. 
221d0 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69   /* Defer deleti
221e0 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  ng the Table obj
221f0 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
22200 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
22210 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65  query until code
22220 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20   generation is. 
22230 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69   ** complete, si
22240 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74  nce there may st
22250 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70  ill exist Expr.p
22260 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74  Tab entries that
22270 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  .  ** refer to t
22280 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e  he subquery even
22290 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e   after flattenin
222a0 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36  g.  Ticket #3346
222b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62  ..  **.  ** pSub
222c0 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c  item->pTab is al
222d0 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79  ways non-NULL by
222e0 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f   test restrictio
222f0 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f  ns and tests abo
22300 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41  ve..  */.  if( A
22310 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e  LWAYS(pSubitem->
22320 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
22330 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c  Table *pTabToDel
22340 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61   = pSubitem->pTa
22350 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54  b;.    if( pTabT
22360 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 3d 3d 31  oDel->nTabRef==1
22370 20 29 7b 0a 20 20 20 20 20 20 50 61 72 73 65 20   ){.      Parse 
22380 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
22390 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
223a0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  l(pParse);.     
223b0 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78   pTabToDel->pNex
223c0 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65  tZombie = pTople
223d0 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b  vel->pZombieTab;
223e0 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  .      pToplevel
223f0 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70  ->pZombieTab = p
22400 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65  TabToDel;.    }e
22410 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 54  lse{.      pTabT
22420 6f 44 65 6c 2d 3e 6e 54 61 62 52 65 66 2d 2d 3b  oDel->nTabRef--;
22430 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69  .    }.    pSubi
22440 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  tem->pTab = 0;. 
22450 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
22460 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73  lowing loop runs
22470 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
22480 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  erm in a compoun
22490 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d-subquery.  ** 
224a0 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64  flattening (as d
224b0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e  escribed above).
224c0 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e    If we are doin
224d0 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69  g a different ki
224e0 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74  nd.  ** of flatt
224f0 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65  ening - a flatte
22500 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  ning other than 
22510 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  a compound-subqu
22520 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d  ery flattening -
22530 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  .  ** then this 
22540 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f  loop only runs o
22550 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
22560 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61  his loop moves a
22570 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
22580 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
22590 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
225a0 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
225b0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
225c0 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
225d0 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
225e0 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
225f0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
22600 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
22610 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
22620 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
22630 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
22640 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
22650 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
22660 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
22670 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
22680 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
22690 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
226a0 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
226b0 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
226c0 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
226d0 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
226e0 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
226f0 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
22700 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
22710 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
22720 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  g in..  */.  for
22730 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72  (pParent=p; pPar
22740 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61  ent; pParent=pPa
22750 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53  rent->pPrior, pS
22760 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
22770 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
22780 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79  c;.    u8 jointy
22790 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  pe = 0;.    pSub
227a0 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
227b0 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
227c0 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
227d0 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20   */.    nSubSrc 
227e0 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b  = pSubSrc->nSrc;
227f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
22800 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79  erms in subquery
22810 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
22820 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
22830 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  nt->pSrc;     /*
22840 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
22850 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
22860 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  */..    if( pSrc
22870 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
22880 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20  ( pParent==p ); 
22890 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74   /* First time t
228a0 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
228b0 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  */.      jointyp
228c0 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 66 67  e = pSubitem->fg
228d0 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  .jointype;.    }
228e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
228f0 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
22900 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
22910 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
22920 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
22930 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
22940 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
22950 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
22960 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
22970 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
22980 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
22990 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
229a0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
229b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
229c0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
229d0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
229e0 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
229f0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
22a00 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
22a10 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
22a20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
22a30 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
22a40 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
22a50 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
22a60 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
22a70 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
22a80 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
22a90 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
22aa0 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
22ab0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
22ac0 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
22ad0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
22ae0 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
22af0 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
22b00 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
22b10 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
22b20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
22b30 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
22b40 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
22b50 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
22b60 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
22b70 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
22b80 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
22b90 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
22ba0 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
22bb0 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
22bc0 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
22bd0 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
22be0 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20 63 6c  er query FROM cl
22bf0 61 75 73 65 20 74 6f 20 34 20 73 6c 6f 74 73 2e  ause to 4 slots.
22c00 0a 20 20 20 20 2a 2a 20 54 68 65 20 6d 69 64 64  .    ** The midd
22c10 6c 65 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e  le slot is expan
22c20 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73  ded to two slots
22c30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
22c40 65 20 73 70 61 63 65 0a 20 20 20 20 2a 2a 20 66  e space.    ** f
22c50 6f 72 20 74 68 65 20 74 77 6f 20 65 6c 65 6d 65  or the two eleme
22c60 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  nts in the FROM 
22c70 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
22c80 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  bquery..    */. 
22c90 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
22ca0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
22cb0 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d  t->pSrc = pSrc =
22cc0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
22cd0 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c  nlarge(db, pSrc,
22ce0 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d   nSubSrc-1,iFrom
22cf0 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  +1);.      if( d
22d00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
22d10 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
22d20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22d30 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  .    /* Transfer
22d40 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
22d50 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
22d60 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
22d70 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
22d80 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
22d90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
22da0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
22db0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
22dc0 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61  lete(db, pSrc->a
22dd0 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67  [i+iFrom].pUsing
22de0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
22df0 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
22e00 5d 2e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d  ].fg.isTabFunc==
22e10 30 20 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d  0 );.      pSrc-
22e20 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53  >a[i+iFrom] = pS
22e30 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  ubSrc->a[i];.   
22e40 20 20 20 69 4e 65 77 50 61 72 65 6e 74 20 3d 20     iNewParent = 
22e50 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2e 69 43  pSubSrc->a[i].iC
22e60 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6d 65 6d  ursor;.      mem
22e70 73 65 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b  set(&pSubSrc->a[
22e80 69 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  i], 0, sizeof(pS
22e90 75 62 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20  ubSrc->a[i]));. 
22ea0 20 20 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61     }.    pSrc->a
22eb0 5b 69 46 72 6f 6d 5d 2e 66 67 2e 6a 6f 69 6e 74  [iFrom].fg.joint
22ec0 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b 0a  ype = jointype;.
22ed0 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62 65    .    /* Now be
22ee0 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e 67  gin substituting
22ef0 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c 74   subquery result
22f00 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
22f10 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65 66   for .    ** ref
22f20 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 69  erences to the i
22f30 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f 75  Parent in the ou
22f40 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a  ter query..    *
22f50 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  * .    ** Exampl
22f60 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
22f70 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20 62     SELECT a+5, b
22f80 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  *10 FROM (SELECT
22f90 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30 20   x*3 AS a, y+10 
22fa0 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57 48  AS b FROM t1) WH
22fb0 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a 20  ERE a>b;.    ** 
22fc0 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20 20    \             
22fd0 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f          \_______
22fe0 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79 20  ______ subquery 
22ff0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20  __________/     
23000 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20 20       /.    **   
23010 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
23020 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71 75  _______ outer qu
23030 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ery ____________
23040 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
23050 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  __/.    **.    *
23060 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76 65  * We look at eve
23070 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ry expression in
23080 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
23090 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65   and every place
230a0 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20 22   we see.    ** "
230b0 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  a" we substitute
230c0 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72 79   "x*3" and every
230d0 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22 62   place we see "b
230e0 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65 20  " we substitute 
230f0 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a 20  "y+10"..    */. 
23100 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
23110 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 2f  derBy ){.      /
23120 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
23130 20 61 6e 79 20 6e 6f 6e 2d 7a 65 72 6f 20 69 4f   any non-zero iO
23140 72 64 65 72 42 79 43 6f 6c 20 76 61 6c 75 65 73  rderByCol values
23150 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
23160 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  he.      ** ORDE
23170 52 20 42 59 20 63 6f 6c 75 6d 6e 20 65 78 70 72  R BY column expr
23180 65 73 73 69 6f 6e 20 69 73 20 69 64 65 6e 74 69  ession is identi
23190 63 61 6c 20 74 6f 20 74 68 65 20 69 4f 72 64 65  cal to the iOrde
231a0 72 42 79 43 6f 6c 27 74 68 0a 20 20 20 20 20 20  rByCol'th.      
231b0 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  ** expression re
231c0 74 75 72 6e 65 64 20 62 79 20 53 45 4c 45 43 54  turned by SELECT
231d0 20 73 74 61 74 65 6d 65 6e 74 20 70 53 75 62 2e   statement pSub.
231e0 20 53 69 6e 63 65 20 74 68 65 73 65 20 76 61 6c   Since these val
231f0 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 20  ues.      ** do 
23200 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
23210 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 63 6f  correspond to co
23220 6c 75 6d 6e 73 20 69 6e 20 53 45 4c 45 43 54 20  lumns in SELECT 
23230 73 74 61 74 65 6d 65 6e 74 20 70 50 61 72 65 6e  statement pParen
23240 74 2c 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  t,.      ** zero
23250 20 74 68 65 6d 20 62 65 66 6f 72 65 20 74 72 61   them before tra
23260 6e 73 66 65 72 69 6e 67 20 74 68 65 20 4f 52 44  nsfering the ORD
23270 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  ER BY clause..  
23280 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
23290 4e 6f 74 20 64 6f 69 6e 67 20 74 68 69 73 20 6d  Not doing this m
232a0 61 79 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f  ay cause an erro
232b0 72 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e  r if a subsequen
232c0 74 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20  t call to this. 
232d0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
232e0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61   attempts to fla
232f0 74 74 65 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20  tten a compound 
23300 73 75 62 2d 71 75 65 72 79 20 69 6e 74 6f 20 70  sub-query into p
23310 50 61 72 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  Parent.      ** 
23320 28 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 68  (the only way th
23330 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 69 73  is can happen is
23340 20 69 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   if the compound
23350 20 73 75 62 2d 71 75 65 72 79 20 69 73 0a 20 20   sub-query is.  
23360 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79      ** currently
23370 20 70 61 72 74 20 6f 66 20 70 53 75 62 2d 3e 70   part of pSub->p
23380 53 72 63 29 2e 20 53 65 65 20 74 69 63 6b 65 74  Src). See ticket
23390 20 5b 64 31 31 61 36 65 39 30 38 66 5d 2e 20 20   [d11a6e908f].  
233a0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73  */.      ExprLis
233b0 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 53  t *pOrderBy = pS
233c0 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ub->pOrderBy;.  
233d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
233e0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
233f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4f  i++){.        pO
23400 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 75 2e 78  rderBy->a[i].u.x
23410 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30  .iOrderByCol = 0
23420 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23430 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
23440 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
23450 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
23460 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
23470 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  By;.      pSub->
23480 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
23490 20 20 7d 0a 20 20 20 20 70 57 68 65 72 65 20 3d    }.    pWhere =
234a0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
234b0 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65  db, pSub->pWhere
234c0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 73  , 0);.    if( is
234d0 4c 65 66 74 4a 6f 69 6e 3e 30 20 29 7b 0a 20 20  LeftJoin>0 ){.  
234e0 20 20 20 20 73 65 74 4a 6f 69 6e 45 78 70 72 28      setJoinExpr(
234f0 70 57 68 65 72 65 2c 20 69 4e 65 77 50 61 72 65  pWhere, iNewPare
23500 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nt);.    }.    p
23510 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
23520 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
23530 64 62 2c 20 70 57 68 65 72 65 2c 20 70 50 61 72  db, pWhere, pPar
23540 65 6e 74 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  ent->pWhere);.  
23550 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
23560 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
23570 20 20 20 53 75 62 73 74 43 6f 6e 74 65 78 74 20     SubstContext 
23580 78 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72 73  x;.      x.pPars
23590 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
235a0 20 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 50 61    x.iTable = iPa
235b0 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69 4e  rent;.      x.iN
235c0 65 77 54 61 62 6c 65 20 3d 20 69 4e 65 77 50 61  ewTable = iNewPa
235d0 72 65 6e 74 3b 0a 20 20 20 20 20 20 78 2e 69 73  rent;.      x.is
235e0 4c 65 66 74 4a 6f 69 6e 20 3d 20 69 73 4c 65 66  LeftJoin = isLef
235f0 74 4a 6f 69 6e 3b 0a 20 20 20 20 20 20 78 2e 70  tJoin;.      x.p
23600 45 4c 69 73 74 20 3d 20 70 53 75 62 2d 3e 70 45  EList = pSub->pE
23610 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 75 62 73  List;.      subs
23620 74 53 65 6c 65 63 74 28 26 78 2c 20 70 50 61 72  tSelect(&x, pPar
23630 65 6e 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ent, 0);.    }. 
23640 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61   .    /* The fla
23650 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20  ttened query is 
23660 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68  distinct if eith
23670 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20  er the inner or 
23680 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
23690 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
236a0 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ct. .    */.    
236b0 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67  pParent->selFlag
236c0 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c  s |= pSub->selFl
236d0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
236e0 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20  t;.  .    /*.   
236f0 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46   ** SELECT ... F
23700 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
23710 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62  LIMIT a OFFSET b
23720 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54  ) LIMIT x OFFSET
23730 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   y;.    **.    *
23740 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64  * One is tempted
23750 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61   to try to add a
23760 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e   and b to combin
23770 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42  e the limits.  B
23780 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64  ut this.    ** d
23790 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20  oes not work if 
237a0 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20  either limit is 
237b0 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f  negative..    */
237c0 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
237d0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70  Limit ){.      p
237e0 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d  Parent->pLimit =
237f0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20   pSub->pLimit;. 
23800 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69       pSub->pLimi
23810 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
23820 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c  ..  /* Finially,
23830 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20   delete what is 
23840 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71  left of the subq
23850 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a  uery and return.
23860 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20    ** success..  
23870 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  */.  sqlite3Sele
23880 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  ctDelete(db, pSu
23890 62 31 29 3b 0a 0a 23 69 66 20 53 45 4c 45 43 54  b1);..#if SELECT
238a0 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
238b0 69 66 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63  if( sqlite3Selec
238c0 74 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  tTrace & 0x100 )
238d0 7b 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  {.    SELECTTRAC
238e0 45 28 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70  E(0x100,pParse,p
238f0 2c 28 22 41 66 74 65 72 20 66 6c 61 74 74 65 6e  ,("After flatten
23900 69 6e 67 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 73  ing:\n"));.    s
23910 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65  qlite3TreeViewSe
23920 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20  lect(0, p, 0);. 
23930 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
23940 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
23950 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
23960 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
23970 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
23980 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
23990 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e  */....#if !defin
239a0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
239b0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
239c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
239d0 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 4d 61 6b  _VIEW)./*.** Mak
239e0 65 20 63 6f 70 69 65 73 20 6f 66 20 72 65 6c 65  e copies of rele
239f0 76 61 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73  vant WHERE claus
23a00 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6f  e terms of the o
23a10 75 74 65 72 20 71 75 65 72 79 20 69 6e 74 6f 0a  uter query into.
23a20 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  ** the WHERE cla
23a30 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79 2e  use of subquery.
23a40 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a    Example:.**.**
23a50 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
23a60 4d 20 28 53 45 4c 45 43 54 20 61 20 41 53 20 78  M (SELECT a AS x
23a70 2c 20 63 2d 64 20 41 53 20 79 20 46 52 4f 4d 20  , c-d AS y FROM 
23a80 74 31 29 20 57 48 45 52 45 20 78 3d 35 20 41 4e  t1) WHERE x=5 AN
23a90 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54 72  D y=10;.**.** Tr
23aa0 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a  ansformed into:.
23ab0 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
23ac0 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 61  * FROM (SELECT a
23ad0 20 41 53 20 78 2c 20 63 2d 64 20 41 53 20 79 20   AS x, c-d AS y 
23ae0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d  FROM t1 WHERE a=
23af0 35 20 41 4e 44 20 63 2d 64 3d 31 30 29 0a 2a 2a  5 AND c-d=10).**
23b00 20 20 20 20 20 57 48 45 52 45 20 78 3d 35 20 41       WHERE x=5 A
23b10 4e 44 20 79 3d 31 30 3b 0a 2a 2a 0a 2a 2a 20 54  ND y=10;.**.** T
23b20 68 65 20 68 6f 70 65 20 69 73 20 74 68 61 74 20  he hope is that 
23b30 74 68 65 20 74 65 72 6d 73 20 61 64 64 65 64 20  the terms added 
23b40 74 6f 20 74 68 65 20 69 6e 6e 65 72 20 71 75 65  to the inner que
23b50 72 79 20 77 69 6c 6c 20 6d 61 6b 65 20 69 74 20  ry will make it 
23b60 6d 6f 72 65 0a 2a 2a 20 65 66 66 69 63 69 65 6e  more.** efficien
23b70 74 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20  t..**.** Do not 
23b80 61 74 74 65 6d 70 74 20 74 68 69 73 20 6f 70 74  attempt this opt
23b90 69 6d 69 7a 61 74 69 6f 6e 20 69 66 3a 0a 2a 2a  imization if:.**
23ba0 0a 2a 2a 20 20 20 28 31 29 20 28 2a 2a 20 54 68  .**   (1) (** Th
23bb0 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20 77  is restriction w
23bc0 61 73 20 72 65 6d 6f 76 65 64 20 6f 6e 20 32 30  as removed on 20
23bd0 31 37 2d 30 39 2d 32 39 2e 20 20 57 65 20 75 73  17-09-29.  We us
23be0 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20  ed to.**        
23bf0 20 20 20 64 69 73 61 6c 6c 6f 77 20 74 68 69 73     disallow this
23c00 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
23c10 72 20 61 67 67 72 65 67 61 74 65 20 73 75 62 71  r aggregate subq
23c20 75 65 72 69 65 73 2c 20 62 75 74 20 6e 6f 77 0a  ueries, but now.
23c30 2a 2a 20 20 20 20 20 20 20 20 20 20 20 69 74 20  **           it 
23c40 69 73 20 61 6c 6c 6f 77 65 64 20 62 79 20 70 75  is allowed by pu
23c50 74 74 69 6e 67 20 74 68 65 20 65 78 74 72 61 20  tting the extra 
23c60 74 65 72 6d 73 20 6f 6e 20 74 68 65 20 48 41 56  terms on the HAV
23c70 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20  ING clause..**  
23c80 20 20 20 20 20 20 20 20 20 54 68 65 20 61 64 64           The add
23c90 65 64 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  ed HAVING clause
23ca0 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 20 69 66   is pointless if
23cb0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 6c 61   the subquery la
23cc0 63 6b 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  cks.**          
23cd0 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
23ce0 73 65 2e 20 20 42 75 74 20 73 75 63 68 20 61 20  se.  But such a 
23cf0 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73  HAVING clause is
23d00 20 61 6c 73 6f 20 68 61 72 6d 6c 65 73 73 0a 2a   also harmless.*
23d10 2a 20 20 20 20 20 20 20 20 20 20 20 73 6f 20 74  *           so t
23d20 68 65 72 65 20 64 6f 65 73 20 6e 6f 74 20 61 70  here does not ap
23d30 70 65 61 72 20 74 6f 20 62 65 20 61 6e 79 20 72  pear to be any r
23d40 65 61 73 6f 6e 20 74 6f 20 61 64 64 20 65 78 74  eason to add ext
23d50 72 61 20 6c 6f 67 69 63 0a 2a 2a 20 20 20 20 20  ra logic.**     
23d60 20 20 20 20 20 20 74 6f 20 73 75 70 70 72 65 73        to suppres
23d70 73 20 69 74 2e 20 2a 2a 29 0a 2a 2a 0a 2a 2a 20  s it. **).**.** 
23d80 20 20 28 32 29 20 54 68 65 20 69 6e 6e 65 72 20    (2) The inner 
23d90 71 75 65 72 79 20 69 73 20 74 68 65 20 72 65 63  query is the rec
23da0 75 72 73 69 76 65 20 70 61 72 74 20 6f 66 20 61  ursive part of a
23db0 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78   common table ex
23dc0 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
23dd0 20 20 28 33 29 20 54 68 65 20 69 6e 6e 65 72 20    (3) The inner 
23de0 71 75 65 72 79 20 68 61 73 20 61 20 4c 49 4d 49  query has a LIMI
23df0 54 20 63 6c 61 75 73 65 20 28 73 69 6e 63 65 20  T clause (since 
23e00 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  the changes to t
23e10 68 65 20 57 48 45 52 45 0a 2a 2a 20 20 20 20 20  he WHERE.**     
23e20 20 20 63 6c 6f 73 65 20 77 6f 75 6c 64 20 63 68    close would ch
23e30 61 6e 67 65 20 74 68 65 20 6d 65 61 6e 69 6e 67  ange the meaning
23e40 20 6f 66 20 74 68 65 20 4c 49 4d 49 54 29 2e 0a   of the LIMIT)..
23e50 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 54 68 65 20  **.**   (4) The 
23e60 69 6e 6e 65 72 20 71 75 65 72 79 20 69 73 20 74  inner query is t
23e70 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
23e80 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
23e90 61 6e 64 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  and the.**      
23ea0 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   expression to b
23eb0 65 20 70 75 73 68 65 64 20 64 6f 77 6e 20 64 6f  e pushed down do
23ec0 65 73 20 6e 6f 74 20 63 6f 6d 65 20 66 72 6f 6d  es not come from
23ed0 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 0a 2a   the ON clause.*
23ee0 2a 20 20 20 20 20 20 20 6f 6e 20 74 68 61 74 20  *       on that 
23ef0 4c 45 46 54 20 4a 4f 49 4e 2e 0a 2a 2a 0a 2a 2a  LEFT JOIN..**.**
23f00 20 20 20 28 35 29 20 54 68 65 20 57 48 45 52 45     (5) The WHERE
23f10 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
23f20 6f 6e 20 6f 72 69 67 69 6e 61 74 65 73 20 69 6e  on originates in
23f30 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
23f40 20 63 6c 61 75 73 65 0a 2a 2a 20 20 20 20 20 20   clause.**      
23f50 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
23f60 77 68 65 72 65 20 69 43 75 72 73 6f 72 20 69 73  where iCursor is
23f70 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 68   not the right-h
23f80 61 6e 64 20 74 61 62 6c 65 20 6f 66 20 74 68 61  and table of tha
23f90 74 0a 2a 2a 20 20 20 20 20 20 20 6c 65 66 74 20  t.**       left 
23fa0 6a 6f 69 6e 2e 20 20 41 6e 20 65 78 61 6d 70 6c  join.  An exampl
23fb0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
23fc0 20 20 20 53 45 4c 45 43 54 20 2a 0a 2a 2a 20 20     SELECT *.**  
23fd0 20 20 20 20 20 20 20 20 20 46 52 4f 4d 20 28 53           FROM (S
23fe0 45 4c 45 43 54 20 31 20 41 53 20 61 31 20 55 4e  ELECT 1 AS a1 UN
23ff0 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 32  ION ALL SELECT 2
24000 29 20 41 53 20 61 61 0a 2a 2a 20 20 20 20 20 20  ) AS aa.**      
24010 20 20 20 20 20 4a 4f 49 4e 20 28 53 45 4c 45 43       JOIN (SELEC
24020 54 20 31 20 41 53 20 62 32 20 55 4e 49 4f 4e 20  T 1 AS b2 UNION 
24030 41 4c 4c 20 53 45 4c 45 43 54 20 32 29 20 41 53  ALL SELECT 2) AS
24040 20 62 62 20 4f 4e 20 28 61 31 3d 62 32 29 0a 2a   bb ON (a1=b2).*
24050 2a 20 20 20 20 20 20 20 20 20 20 20 4c 45 46 54  *           LEFT
24060 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 38 20   JOIN (SELECT 8 
24070 41 53 20 63 33 20 55 4e 49 4f 4e 20 41 4c 4c 20  AS c3 UNION ALL 
24080 53 45 4c 45 43 54 20 39 29 20 41 53 20 63 63 20  SELECT 9) AS cc 
24090 4f 4e 20 28 62 32 3d 32 29 3b 0a 2a 2a 0a 2a 2a  ON (b2=2);.**.**
240a0 20 20 20 20 20 20 20 54 68 65 20 63 6f 72 72 65         The corre
240b0 63 74 20 61 6e 73 77 65 72 20 69 73 20 74 68 72  ct answer is thr
240c0 65 65 20 72 6f 77 73 3a 20 20 28 31 2c 31 2c 4e  ee rows:  (1,1,N
240d0 55 4c 4c 29 2c 28 32 2c 32 2c 38 29 2c 28 32 2c  ULL),(2,2,8),(2,
240e0 32 2c 39 29 2e 0a 2a 2a 20 20 20 20 20 20 20 42  2,9)..**       B
240f0 75 74 20 69 66 20 74 68 65 20 28 62 32 3d 32 29  ut if the (b2=2)
24100 20 74 65 72 6d 20 77 65 72 65 20 74 6f 20 62 65   term were to be
24110 20 70 75 73 68 65 64 20 64 6f 77 6e 20 69 6e 74   pushed down int
24120 6f 20 74 68 65 20 62 62 20 73 75 62 71 75 65 72  o the bb subquer
24130 79 2c 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 6e  y,.**       then
24140 20 74 68 65 20 28 31 2c 31 2c 4e 55 4c 4c 29 20   the (1,1,NULL) 
24150 72 6f 77 20 77 6f 75 6c 64 20 62 65 20 73 75 70  row would be sup
24160 70 72 65 73 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  pressed..**.** R
24170 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20 63 68  eturn 0 if no ch
24180 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 61  anges are made a
24190 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f  nd non-zero if o
241a0 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45  ne or more WHERE
241b0 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73   clause.** terms
241c0 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 64 20   are duplicated 
241d0 69 6e 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  into the subquer
241e0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
241f0 20 70 75 73 68 44 6f 77 6e 57 68 65 72 65 54 65   pushDownWhereTe
24200 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rms(.  Parse *pP
24210 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
24220 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 28 66  Parse context (f
24230 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  or malloc() and 
24240 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 29  error reporting)
24250 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
24260 75 62 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ubq,        /* T
24270 68 65 20 73 75 62 71 75 65 72 79 20 77 68 6f 73  he subquery whos
24280 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
24290 73 20 74 6f 20 62 65 20 61 75 67 6d 65 6e 74 65  s to be augmente
242a0 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68  d */.  Expr *pWh
242b0 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ere,         /* 
242c0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
242d0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
242e0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  ery */.  int iCu
242f0 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rsor,          /
24300 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
24310 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
24320 2a 2f 0a 20 20 69 6e 74 20 69 73 4c 65 66 74 4a  */.  int isLeftJ
24330 6f 69 6e 20 20 20 20 20 20 20 20 2f 2a 20 54 72  oin        /* Tr
24340 75 65 20 69 66 20 70 53 75 62 71 20 69 73 20 74  ue if pSubq is t
24350 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66  he right term of
24360 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 2a 2f 0a   a LEFT JOIN */.
24370 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
24380 0a 20 20 69 6e 74 20 6e 43 68 6e 67 20 3d 20 30  .  int nChng = 0
24390 3b 0a 20 20 69 66 28 20 70 57 68 65 72 65 3d 3d  ;.  if( pWhere==
243a0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
243b0 69 66 28 20 70 53 75 62 71 2d 3e 73 65 6c 46 6c  if( pSubq->selFl
243c0 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
243d0 76 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ve ) return 0;  
243e0 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  /* restriction (
243f0 32 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  2) */..#ifdef SQ
24400 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
24410 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 74  Only the first t
24420 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  erm of a compoun
24430 64 20 63 61 6e 20 68 61 76 65 20 61 20 57 49 54  d can have a WIT
24440 48 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 6d  H clause.  But m
24450 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 6e 6f  ake.  ** sure no
24460 20 6f 74 68 65 72 20 74 65 72 6d 73 20 61 72 65   other terms are
24470 20 6d 61 72 6b 65 64 20 53 46 5f 52 65 63 75 72   marked SF_Recur
24480 73 69 76 65 20 69 6e 20 63 61 73 65 20 73 6f 6d  sive in case som
24490 65 74 68 69 6e 67 20 63 68 61 6e 67 65 73 0a 20  ething changes. 
244a0 20 2a 2a 20 69 6e 20 74 68 65 20 66 75 74 75 72   ** in the futur
244b0 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20  e..  */.  {.    
244c0 53 65 6c 65 63 74 20 2a 70 58 3b 20 20 0a 20 20  Select *pX;  .  
244d0 20 20 66 6f 72 28 70 58 3d 70 53 75 62 71 3b 20    for(pX=pSubq; 
244e0 70 58 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f  pX; pX=pX->pPrio
244f0 72 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r){.      assert
24500 28 20 28 70 58 2d 3e 73 65 6c 46 6c 61 67 73 20  ( (pX->selFlags 
24510 26 20 28 53 46 5f 52 65 63 75 72 73 69 76 65 29  & (SF_Recursive)
24520 29 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  )==0 );.    }.  
24530 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
24540 70 53 75 62 71 2d 3e 70 4c 69 6d 69 74 21 3d 30  pSubq->pLimit!=0
24550 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
24560 3b 20 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e  ; /* restriction
24570 20 28 33 29 20 2a 2f 0a 20 20 7d 0a 20 20 77 68   (3) */.  }.  wh
24580 69 6c 65 28 20 70 57 68 65 72 65 2d 3e 6f 70 3d  ile( pWhere->op=
24590 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 6e  =TK_AND ){.    n
245a0 43 68 6e 67 20 2b 3d 20 70 75 73 68 44 6f 77 6e  Chng += pushDown
245b0 57 68 65 72 65 54 65 72 6d 73 28 70 50 61 72 73  WhereTerms(pPars
245c0 65 2c 20 70 53 75 62 71 2c 20 70 57 68 65 72 65  e, pSubq, pWhere
245d0 2d 3e 70 52 69 67 68 74 2c 0a 20 20 20 20 20 20  ->pRight,.      
245e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245f0 20 20 20 20 20 20 20 20 20 20 69 43 75 72 73 6f            iCurso
24600 72 2c 20 69 73 4c 65 66 74 4a 6f 69 6e 29 3b 0a  r, isLeftJoin);.
24610 20 20 20 20 70 57 68 65 72 65 20 3d 20 70 57 68      pWhere = pWh
24620 65 72 65 2d 3e 70 4c 65 66 74 3b 0a 20 20 7d 0a  ere->pLeft;.  }.
24630 20 20 69 66 28 20 69 73 4c 65 66 74 4a 6f 69 6e    if( isLeftJoin
24640 0a 20 20 20 26 26 20 28 45 78 70 72 48 61 73 50  .   && (ExprHasP
24650 72 6f 70 65 72 74 79 28 70 57 68 65 72 65 2c 45  roperty(pWhere,E
24660 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3d 3d 30 0a 20  P_FromJoin)==0. 
24670 20 20 20 20 20 20 20 20 7c 7c 20 70 57 68 65 72          || pWher
24680 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  e->iRightJoinTab
24690 6c 65 21 3d 69 43 75 72 73 6f 72 29 0a 20 20 29  le!=iCursor).  )
246a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
246b0 2f 2a 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28  /* restriction (
246c0 34 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  4) */.  }.  if( 
246d0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
246e0 70 57 68 65 72 65 2c 45 50 5f 46 72 6f 6d 4a 6f  pWhere,EP_FromJo
246f0 69 6e 29 20 26 26 20 70 57 68 65 72 65 2d 3e 69  in) && pWhere->i
24700 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 21 3d  RightJoinTable!=
24710 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72  iCursor ){.    r
24720 65 74 75 72 6e 20 30 3b 20 2f 2a 20 72 65 73 74  eturn 0; /* rest
24730 72 69 63 74 69 6f 6e 20 28 35 29 20 2a 2f 0a 20  riction (5) */. 
24740 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
24750 45 78 70 72 49 73 54 61 62 6c 65 43 6f 6e 73 74  ExprIsTableConst
24760 61 6e 74 28 70 57 68 65 72 65 2c 20 69 43 75 72  ant(pWhere, iCur
24770 73 6f 72 29 20 29 7b 0a 20 20 20 20 6e 43 68 6e  sor) ){.    nChn
24780 67 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  g++;.    while( 
24790 70 53 75 62 71 20 29 7b 0a 20 20 20 20 20 20 53  pSubq ){.      S
247a0 75 62 73 74 43 6f 6e 74 65 78 74 20 78 3b 0a 20  ubstContext x;. 
247b0 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
247c0 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72 73  te3ExprDup(pPars
247d0 65 2d 3e 64 62 2c 20 70 57 68 65 72 65 2c 20 30  e->db, pWhere, 0
247e0 29 3b 0a 20 20 20 20 20 20 75 6e 73 65 74 4a 6f  );.      unsetJo
247f0 69 6e 45 78 70 72 28 70 4e 65 77 2c 20 2d 31 29  inExpr(pNew, -1)
24800 3b 0a 20 20 20 20 20 20 78 2e 70 50 61 72 73 65  ;.      x.pParse
24810 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 20   = pParse;.     
24820 20 78 2e 69 54 61 62 6c 65 20 3d 20 69 43 75 72   x.iTable = iCur
24830 73 6f 72 3b 0a 20 20 20 20 20 20 78 2e 69 4e 65  sor;.      x.iNe
24840 77 54 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72  wTable = iCursor
24850 3b 0a 20 20 20 20 20 20 78 2e 69 73 4c 65 66 74  ;.      x.isLeft
24860 4a 6f 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Join = 0;.      
24870 78 2e 70 45 4c 69 73 74 20 3d 20 70 53 75 62 71  x.pEList = pSubq
24880 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  ->pEList;.      
24890 70 4e 65 77 20 3d 20 73 75 62 73 74 45 78 70 72  pNew = substExpr
248a0 28 26 78 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  (&x, pNew);.    
248b0 20 20 69 66 28 20 70 53 75 62 71 2d 3e 73 65 6c    if( pSubq->sel
248c0 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
248d0 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  gate ){.        
248e0 70 53 75 62 71 2d 3e 70 48 61 76 69 6e 67 20 3d  pSubq->pHaving =
248f0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
24900 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 75 62  pParse->db, pSub
24910 71 2d 3e 70 48 61 76 69 6e 67 2c 20 70 4e 65 77  q->pHaving, pNew
24920 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
24930 20 20 20 20 20 20 20 20 70 53 75 62 71 2d 3e 70          pSubq->p
24940 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
24950 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
24960 62 2c 20 70 53 75 62 71 2d 3e 70 57 68 65 72 65  b, pSubq->pWhere
24970 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d  , pNew);.      }
24980 0a 20 20 20 20 20 20 70 53 75 62 71 20 3d 20 70  .      pSubq = p
24990 53 75 62 71 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  Subq->pPrior;.  
249a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
249b0 20 6e 43 68 6e 67 3b 0a 7d 0a 23 65 6e 64 69 66   nChng;.}.#endif
249c0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
249d0 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
249e0 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
249f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
24a00 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70   */../*.** The p
24a10 46 75 6e 63 20 69 73 20 74 68 65 20 6f 6e 6c 79  Func is the only
24a20 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
24a30 69 6f 6e 20 69 6e 20 74 68 65 20 71 75 65 72 79  ion in the query
24a40 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 0a  .  Check to see.
24a50 2a 2a 20 69 66 20 74 68 65 20 71 75 65 72 79 20  ** if the query 
24a60 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
24a70 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f  or the min/max o
24a80 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 0a 2a 2a  ptimization. .**
24a90 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
24aa0 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
24ab0 66 6f 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20  for the min/max 
24ac0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68  optimization, th
24ad0 65 6e 20 73 65 74 0a 2a 2a 20 2a 70 70 4d 69 6e  en set.** *ppMin
24ae0 4d 61 78 20 74 6f 20 62 65 20 61 6e 20 4f 52 44  Max to be an ORD
24af0 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  ER BY clause to 
24b00 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  be used for the 
24b10 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
24b20 61 6e 64 20 72 65 74 75 72 6e 20 65 69 74 68 65  and return eithe
24b30 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  r WHERE_ORDERBY_
24b40 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44  MIN or WHERE_ORD
24b50 45 52 42 59 5f 4d 41 58 20 64 65 70 65 6e 64 69  ERBY_MAX dependi
24b60 6e 67 20 6f 6e 0a 2a 2a 20 77 68 65 74 68 65 72  ng on.** whether
24b70 20 70 46 75 6e 63 20 69 73 20 61 20 6d 69 6e 28   pFunc is a min(
24b80 29 20 6f 72 20 6d 61 78 28 29 20 66 75 6e 63 74  ) or max() funct
24b90 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
24ba0 65 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  e query is not a
24bb0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 74   candidate for t
24bc0 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70 74 69 6d  he min/max optim
24bd0 69 7a 61 74 69 6f 6e 2c 20 72 65 74 75 72 6e 0a  ization, return.
24be0 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  ** WHERE_ORDERBY
24bf0 5f 4e 4f 52 4d 41 4c 20 28 77 68 69 63 68 20 6d  _NORMAL (which m
24c00 75 73 74 20 62 65 20 7a 65 72 6f 29 2e 0a 2a 2a  ust be zero)..**
24c10 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
24c20 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
24c30 61 66 74 65 72 20 61 67 67 72 65 67 61 74 65 20  after aggregate 
24c40 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 62  functions have b
24c50 65 65 6e 0a 2a 2a 20 6c 6f 63 61 74 65 64 20 62  een.** located b
24c60 75 74 20 62 65 66 6f 72 65 20 74 68 65 69 72 20  ut before their 
24c70 61 72 67 75 6d 65 6e 74 73 20 68 61 76 65 20 62  arguments have b
24c80 65 65 6e 20 73 75 62 6a 65 63 74 65 64 20 74 6f  een subjected to
24c90 20 61 67 67 72 65 67 61 74 65 0a 2a 2a 20 61 6e   aggregate.** an
24ca0 61 6c 79 73 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  alysis..*/.stati
24cb0 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79  c u8 minMaxQuery
24cc0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 45 78  (sqlite3 *db, Ex
24cd0 70 72 20 2a 70 46 75 6e 63 2c 20 45 78 70 72 4c  pr *pFunc, ExprL
24ce0 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b  ist **ppMinMax){
24cf0 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48  .  int eRet = WH
24d00 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
24d10 41 4c 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  AL;      /* Retu
24d20 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 45 78  rn value */.  Ex
24d30 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
24d40 20 70 46 75 6e 63 2d 3e 78 2e 70 4c 69 73 74 3b   pFunc->x.pList;
24d50 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 73      /* Arguments
24d60 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69 6f 6e   to agg function
24d70 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
24d80 20 2a 7a 46 75 6e 63 3b 20 20 20 20 20 20 20 20   *zFunc;        
24d90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24da0 61 6d 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  ame of aggregate
24db0 20 66 75 6e 63 74 69 6f 6e 20 70 46 75 6e 63 20   function pFunc 
24dc0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
24dd0 4f 72 64 65 72 42 79 3b 0a 20 20 75 38 20 73 6f  OrderBy;.  u8 so
24de0 72 74 4f 72 64 65 72 3b 0a 0a 20 20 61 73 73 65  rtOrder;..  asse
24df0 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30  rt( *ppMinMax==0
24e00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46   );.  assert( pF
24e10 75 6e 63 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  unc->op==TK_AGG_
24e20 46 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 69 66  FUNCTION );.  if
24e30 28 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  ( pEList==0 || p
24e40 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
24e50 29 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 20  ) return eRet;. 
24e60 20 7a 46 75 6e 63 20 3d 20 70 46 75 6e 63 2d 3e   zFunc = pFunc->
24e70 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20  u.zToken;.  if( 
24e80 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
24e90 46 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20  Func, "min")==0 
24ea0 29 7b 0a 20 20 20 20 65 52 65 74 20 3d 20 57 48  ){.    eRet = WH
24eb0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b  ERE_ORDERBY_MIN;
24ec0 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d  .    sortOrder =
24ed0 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 0a   SQLITE_SO_ASC;.
24ee0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
24ef0 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63  te3StrICmp(zFunc
24f00 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20  , "max")==0 ){. 
24f10 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f     eRet = WHERE_
24f20 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20  ORDERBY_MAX;.   
24f30 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 53 51 4c   sortOrder = SQL
24f40 49 54 45 5f 53 4f 5f 44 45 53 43 3b 0a 20 20 7d  ITE_SO_DESC;.  }
24f50 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
24f60 20 65 52 65 74 3b 0a 20 20 7d 0a 20 20 2a 70 70   eRet;.  }.  *pp
24f70 4d 69 6e 4d 61 78 20 3d 20 70 4f 72 64 65 72 42  MinMax = pOrderB
24f80 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
24f90 69 73 74 44 75 70 28 64 62 2c 20 70 45 4c 69 73  istDup(db, pELis
24fa0 74 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  t, 0);.  assert(
24fb0 20 70 4f 72 64 65 72 42 79 21 3d 30 20 7c 7c 20   pOrderBy!=0 || 
24fc0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
24fd0 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72   );.  if( pOrder
24fe0 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e 61  By ) pOrderBy->a
24ff0 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
25000 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 72 65 74  sortOrder;.  ret
25010 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn eRet;.}../*.
25020 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20 73 74  ** The select st
25030 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61  atement passed a
25040 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
25050 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67 72 65  ment is an aggre
25060 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a 20 54  gate query..** T
25070 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
25080 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63 69  nt is the associ
25090 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d 69  ated aggregate-i
250a0 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69 73  nfo object. This
250b0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74 65   .** function te
250c0 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45 43  sts if the SELEC
250d0 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  T is of the form
250e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  :.**.**   SELECT
250f0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c   count(*) FROM <
25100 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  tbl>.**.** where
25110 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74 61   table is a data
25120 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  base table, not 
25130 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
25140 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75 65  view. If the que
25150 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63 68  ry.** does match
25160 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20 74   this pattern, t
25170 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
25180 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
25190 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a 2a  t representing.*
251a0 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75 72  * <tbl> is retur
251b0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
251c0 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
251d0 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20 2a  /.static Table *
251e0 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53 65  isSimpleCount(Se
251f0 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66 6f  lect *p, AggInfo
25200 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 54   *pAggInfo){.  T
25210 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45 78  able *pTab;.  Ex
25220 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61 73  pr *pExpr;..  as
25230 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75 70  sert( !p->pGroup
25240 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  By );..  if( p->
25250 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45 4c  pWhere || p->pEL
25260 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a 20  ist->nExpr!=1 . 
25270 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e 53    || p->pSrc->nS
25280 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72 63  rc!=1 || p->pSrc
25290 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a 20  ->a[0].pSelect. 
252a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
252b0 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20 70  ;.  }.  pTab = p
252c0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61  ->pSrc->a[0].pTa
252d0 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d 3e  b;.  pExpr = p->
252e0 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
252f0 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  pr;.  assert( pT
25300 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53 65  ab && !pTab->pSe
25310 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29 3b  lect && pExpr );
25320 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  ..  if( IsVirtua
25330 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72 6e  l(pTab) ) return
25340 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
25350 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e 43  >op!=TK_AGG_FUNC
25360 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30 3b  TION ) return 0;
25370 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 41 67  .  if( NEVER(pAg
25380 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30 29  gInfo->nFunc==0)
25390 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
253a0 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61 46  f( (pAggInfo->aF
253b0 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66 75  unc[0].pFunc->fu
253c0 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46  ncFlags&SQLITE_F
253d0 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29 20  UNC_COUNT)==0 ) 
253e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
253f0 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f  pExpr->flags&EP_
25400 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
25410 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  n 0;..  return p
25420 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  Tab;.}../*.** If
25430 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
25440 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73 20   item passed as 
25450 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  an argument was 
25460 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20 61  augmented with a
25470 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59 20  n.** INDEXED BY 
25480 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72 79  clause, then try
25490 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 73   to locate the s
254a0 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e 20  pecified index. 
254b0 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73 20  If there.** was 
254c0 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61 6e  such a clause an
254d0 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65  d the named inde
254e0 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  x cannot be foun
254f0 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  d, return .** SQ
25500 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20 6c  LITE_ERROR and l
25510 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69 6e  eave an error in
25520 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77 69   pParse. Otherwi
25530 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a 2a  se, populate .**
25540 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 61   pFrom->pIndex a
25550 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
25560 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
25570 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b  te3IndexedByLook
25580 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  up(Parse *pParse
25590 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74  , struct SrcList
255a0 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a 20  _item *pFrom){. 
255b0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
255c0 20 26 26 20 70 46 72 6f 6d 2d 3e 66 67 2e 69 73   && pFrom->fg.is
255d0 49 6e 64 65 78 65 64 42 79 20 29 7b 0a 20 20 20  IndexedBy ){.   
255e0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
255f0 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
25600 63 68 61 72 20 2a 7a 49 6e 64 65 78 65 64 42 79  char *zIndexedBy
25610 20 3d 20 70 46 72 6f 6d 2d 3e 75 31 2e 7a 49 6e   = pFrom->u1.zIn
25620 64 65 78 65 64 42 79 3b 0a 20 20 20 20 49 6e 64  dexedBy;.    Ind
25630 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
25640 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
25650 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49  dex; .        pI
25660 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  dx && sqlite3Str
25670 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65  ICmp(pIdx->zName
25680 2c 20 7a 49 6e 64 65 78 65 64 42 79 29 3b 20 0a  , zIndexedBy); .
25690 20 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64          pIdx=pId
256a0 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a  x->pNext.    );.
256b0 20 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b      if( !pIdx ){
256c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
256d0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
256e0 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25  no such index: %
256f0 73 22 2c 20 7a 49 6e 64 65 78 65 64 42 79 2c 20  s", zIndexedBy, 
25700 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
25710 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
25720 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
25730 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
25740 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70    }.    pFrom->p
25750 49 42 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a  IBIndex = pIdx;.
25760 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
25770 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  ITE_OK;.}./*.** 
25780 44 65 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20  Detect compound 
25790 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
257a0 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52  s that use an OR
257b0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 77 69  DER BY clause wi
257c0 74 68 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e  th .** an altern
257d0 61 74 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20  ative collating 
257e0 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20  sequence..**.** 
257f0 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52     SELECT ... FR
25800 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c  OM t1 EXCEPT SEL
25810 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20  ECT ... FROM t2 
25820 4f 52 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c  ORDER BY .. COLL
25830 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ATE ....**.** Th
25840 65 73 65 20 61 72 65 20 72 65 77 72 69 74 74 65  ese are rewritte
25850 6e 20 61 73 20 61 20 73 75 62 71 75 65 72 79 3a  n as a subquery:
25860 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
25870 20 2a 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   * FROM (SELECT 
25880 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45  ... FROM t1 EXCE
25890 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  PT SELECT ... FR
258a0 4f 4d 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52  OM t2).**     OR
258b0 44 45 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41  DER BY ... COLLA
258c0 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  TE ....**.** Thi
258d0 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
258e0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
258f0 63 61 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53  cause the multiS
25900 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 72  electOrderBy() r
25910 6f 75 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20  outine.** above 
25920 74 68 61 74 20 67 65 6e 65 72 61 74 65 73 20 74  that generates t
25930 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f  he code for a co
25940 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69  mpound SELECT wi
25950 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  th an ORDER BY c
25960 6c 61 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20  lause.** uses a 
25970 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20  merge algorithm 
25980 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
25990 65 20 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67  e same collating
259a0 20 73 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65   sequence on the
259b0 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  .** result colum
259c0 6e 73 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44  ns as on the ORD
259d0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53  ER BY clause.  S
259e0 65 65 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74  ee ticket.** htt
259f0 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f  p://www.sqlite.o
25a00 72 67 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39  rg/src/info/6709
25a10 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69  574d2a.**.** Thi
25a20 73 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  s transformation
25a30 20 69 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20   is only needed 
25a40 66 6f 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45  for EXCEPT, INTE
25a50 52 53 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e  RSECT, and UNION
25a60 2e 0a 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41  ..** The UNION A
25a70 4c 4c 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b  LL operator work
25a80 73 20 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74  s fine with mult
25a90 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29  iSelectOrderBy()
25aa0 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68   even when.** th
25ab0 65 72 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20  ere are COLLATE 
25ac0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
25ad0 45 52 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63  ER BY..*/.static
25ae0 20 69 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70   int convertComp
25af0 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71  oundSelectToSubq
25b00 75 65 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61  uery(Walker *pWa
25b10 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
25b20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c  {.  int i;.  Sel
25b30 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c  ect *pNew;.  Sel
25b40 65 63 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  ect *pX;.  sqlit
25b50 65 33 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74  e3 *db;.  struct
25b60 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
25b70 61 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  a;.  SrcList *pN
25b80 65 77 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a  ewSrc;.  Parse *
25b90 70 50 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20  pParse;.  Token 
25ba0 64 75 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d  dummy;..  if( p-
25bb0 3e 70 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74  >pPrior==0 ) ret
25bc0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
25bd0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  ;.  if( p->pOrde
25be0 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rBy==0 ) return 
25bf0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
25c00 66 6f 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20  for(pX=p; pX && 
25c10 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  (pX->op==TK_ALL 
25c20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  || pX->op==TK_SE
25c30 4c 45 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50  LECT); pX=pX->pP
25c40 72 69 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58  rior){}.  if( pX
25c50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
25c60 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d  _Continue;.  a =
25c70 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b   p->pOrderBy->a;
25c80 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64  .  for(i=p->pOrd
25c90 65 72 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69  erBy->nExpr-1; i
25ca0 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
25cb0 66 28 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66  f( a[i].pExpr->f
25cc0 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
25cd0 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  e ) break;.  }. 
25ce0 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
25cf0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
25d00 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
25d10 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  h this point, th
25d20 61 74 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61  at means the tra
25d30 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  nsformation is r
25d40 65 71 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70  equired. */..  p
25d50 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
25d60 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
25d70 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e  pParse->db;.  pN
25d80 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
25d90 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
25da0 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
25db0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
25dc0 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
25dd0 20 20 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c    memset(&dummy,
25de0 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79   0, sizeof(dummy
25df0 29 29 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20  ));.  pNewSrc = 
25e00 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
25e10 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61  pendFromTerm(pPa
25e20 72 73 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79  rse,0,0,0,&dummy
25e30 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66  ,pNew,0,0);.  if
25e40 28 20 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72  ( pNewSrc==0 ) r
25e50 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
25e60 0a 20 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20  .  *pNew = *p;. 
25e70 20 70 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53   p->pSrc = pNewS
25e80 72 63 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20  rc;.  p->pEList 
25e90 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
25ea0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
25eb0 30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 64  0, sqlite3Expr(d
25ec0 62 2c 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20  b, TK_ASTERISK, 
25ed0 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54  0));.  p->op = T
25ee0 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70  K_SELECT;.  p->p
25ef0 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65  Where = 0;.  pNe
25f00 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b  w->pGroupBy = 0;
25f10 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67  .  pNew->pHaving
25f20 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f   = 0;.  pNew->pO
25f30 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d  rderBy = 0;.  p-
25f40 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70  >pPrior = 0;.  p
25f50 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  ->pNext = 0;.  p
25f60 2d 3e 70 57 69 74 68 20 3d 20 30 3b 0a 20 20 70  ->pWith = 0;.  p
25f70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
25f80 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 61 73  F_Compound;.  as
25f90 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
25fa0 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65  gs & SF_Converte
25fb0 64 29 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 65  d)==0 );.  p->se
25fc0 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6e  lFlags |= SF_Con
25fd0 76 65 72 74 65 64 3b 0a 20 20 61 73 73 65 72 74  verted;.  assert
25fe0 28 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 21 3d  ( pNew->pPrior!=
25ff0 30 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  0 );.  pNew->pPr
26000 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  ior->pNext = pNe
26010 77 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  w;.  pNew->pLimi
26020 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
26030 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
26040 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
26050 73 65 65 20 69 66 20 74 68 65 20 46 52 4f 4d 20  see if the FROM 
26060 63 6c 61 75 73 65 20 74 65 72 6d 20 70 46 72 6f  clause term pFro
26070 6d 20 68 61 73 20 74 61 62 6c 65 2d 76 61 6c 75  m has table-valu
26080 65 64 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  ed function.** a
26090 72 67 75 6d 65 6e 74 73 2e 20 20 49 66 20 69 74  rguments.  If it
260a0 20 64 6f 65 73 2c 20 6c 65 61 76 65 20 61 6e 20   does, leave an 
260b0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
260c0 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
260d0 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  rn.** non-zero, 
260e0 73 69 6e 63 65 20 70 46 72 6f 6d 20 69 73 20 6e  since pFrom is n
260f0 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  ot allowed to be
26100 20 61 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20   a table-valued 
26110 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
26120 74 69 63 20 69 6e 74 20 63 61 6e 6e 6f 74 42 65  tic int cannotBe
26130 46 75 6e 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  Function(Parse *
26140 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53  pParse, struct S
26150 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
26160 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d  om){.  if( pFrom
26170 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 29  ->fg.isTabFunc )
26180 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
26190 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 27  orMsg(pParse, "'
261a0 25 73 27 20 69 73 20 6e 6f 74 20 61 20 66 75 6e  %s' is not a fun
261b0 63 74 69 6f 6e 22 2c 20 70 46 72 6f 6d 2d 3e 7a  ction", pFrom->z
261c0 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
261d0 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
261e0 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n 0;.}..#ifndef 
261f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
26200 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
26210 57 69 74 68 20 28 77 68 69 63 68 20 6d 61 79 20  With (which may 
26220 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73 20  be NULL) points 
26230 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  to a linked list
26240 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20 57   of nested .** W
26250 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66 72  ITH contexts, fr
26260 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74 65  om inner to oute
26270 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74 61  rmost. If the ta
26280 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  ble identified b
26290 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73  y .** FROM claus
262a0 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d 20  e element pItem 
262b0 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d 6d  is really a comm
262c0 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73 73  on-table-express
262d0 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74 68  ion (CTE) .** th
262e0 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  en return a poin
262f0 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20 64  ter to the CTE d
26300 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74 68  efinition for th
26310 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 77  at table. Otherw
26320 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e 55  ise.** return NU
26330 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e  LL..**.** If a n
26340 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69 73  on-NULL value is
26350 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20 2a   returned, set *
26360 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f 69  ppContext to poi
26370 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a 2a  nt to the With.*
26380 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74 68  * object that th
26390 65 20 72 65 74 75 72 6e 65 64 20 43 54 45 20 62  e returned CTE b
263a0 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74  elongs to..*/.st
263b0 61 74 69 63 20 73 74 72 75 63 74 20 43 74 65 20  atic struct Cte 
263c0 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20 20 57  *searchWith(.  W
263d0 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20  ith *pWith,     
263e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
263f0 2a 20 43 75 72 72 65 6e 74 20 69 6e 6e 65 72 6d  * Current innerm
26400 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65 20  ost WITH clause 
26410 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
26420 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c  ist_item *pItem,
26430 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61       /* FROM cla
26440 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20 72  use element to r
26450 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74 68  esolve */.  With
26460 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20 20   **ppContext    
26470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
26480 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65 20  UT: WITH clause 
26490 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65 6c  return value bel
264a0 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ongs to */.){.  
264b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
264c0 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  e;.  if( pItem->
264d0 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26 20  zDatabase==0 && 
264e0 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e  (zName = pItem->
264f0 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
26500 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66 6f   With *p;.    fo
26510 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70 3d  r(p=pWith; p; p=
26520 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20 20  p->pOuter){.    
26530 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
26540 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74  or(i=0; i<p->nCt
26550 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
26560 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
26570 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b  Cmp(zName, p->a[
26580 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
26590 20 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f 6e            *ppCon
265a0 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  text = p;.      
265b0 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61      return &p->a
265c0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  [i];.        }. 
265d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
265e0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
265f0 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  /* The code gene
26600 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73 20  rator maintains 
26610 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69 76  a stack of activ
26620 65 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a 2a  e WITH clauses.*
26630 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65 72  * with the inner
26640 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73  -most WITH claus
26650 65 20 62 65 69 6e 67 20 61 74 20 74 68 65 20 74  e being at the t
26660 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e  op of the stack.
26670 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
26680 69 6e 65 20 70 75 73 68 65 73 20 74 68 65 20 57  ine pushes the W
26690 49 54 48 20 63 6c 61 75 73 65 20 70 61 73 73 65  ITH clause passe
266a0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
266b0 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f  argument.** onto
266c0 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20   the top of the 
266d0 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d 65  stack. If argume
266e0 6e 74 20 62 46 72 65 65 20 69 73 20 74 72 75 65  nt bFree is true
266f0 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 57  , then this.** W
26700 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  ITH clause will 
26710 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65 64 20  never be popped 
26720 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 20  from the stack. 
26730 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a  In this case it.
26740 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65  ** should be fre
26750 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
26760 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20  e Parse object. 
26770 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  In other cases, 
26780 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d 30  when.** bFree==0
26790 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65 63  , the With objec
267a0 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
267b0 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 53  along with the S
267c0 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65 6d  ELECT .** statem
267d0 65 6e 74 20 77 69 74 68 20 77 68 69 63 68 20 69  ent with which i
267e0 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 2e  t is associated.
267f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
26800 57 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a  WithPush(Parse *
26810 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57  pParse, With *pW
26820 69 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b 0a  ith, u8 bFree){.
26830 20 20 61 73 73 65 72 74 28 20 62 46 72 65 65 3d    assert( bFree=
26840 3d 30 20 7c 7c 20 28 70 50 61 72 73 65 2d 3e 70  =0 || (pParse->p
26850 57 69 74 68 3d 3d 30 20 26 26 20 70 50 61 72 73  With==0 && pPars
26860 65 2d 3e 70 57 69 74 68 54 6f 46 72 65 65 3d 3d  e->pWithToFree==
26870 30 29 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74  0) );.  if( pWit
26880 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  h ){.    assert(
26890 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 21 3d   pParse->pWith!=
268a0 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70 57 69  pWith );.    pWi
268b0 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50 61  th->pOuter = pPa
268c0 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20  rse->pWith;.    
268d0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
268e0 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28 20 62  pWith;.    if( b
268f0 46 72 65 65 20 29 20 70 50 61 72 73 65 2d 3e 70  Free ) pParse->p
26900 57 69 74 68 54 6f 46 72 65 65 20 3d 20 70 57 69  WithToFree = pWi
26910 74 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  th;.  }.}../*.**
26920 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
26930 68 65 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e  hecks if argumen
26940 74 20 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74  t pFrom refers t
26950 6f 20 61 20 43 54 45 20 64 65 63 6c 61 72 65 64  o a CTE declared
26960 20 62 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63   by .** a WITH c
26970 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61  lause on the sta
26980 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69  ck currently mai
26990 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 70  ntained by the p
269a0 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69  arser. And,.** i
269b0 66 20 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63  f currently proc
269c0 65 73 73 69 6e 67 20 61 20 43 54 45 20 65 78 70  essing a CTE exp
269d0 72 65 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69  ression, if it i
269e0 73 20 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a  s a recursive.**
269f0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
26a00 65 20 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a  e current CTE..*
26a10 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61  *.** If pFrom fa
26a20 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20  lls into either 
26a30 6f 66 20 74 68 65 20 74 77 6f 20 63 61 74 65 67  of the two categ
26a40 6f 72 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72  ories above, pFr
26a50 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20  om->pTab.** and 
26a60 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
26a70 20 70 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72   populated accor
26a80 64 69 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c  dingly. The call
26a90 65 72 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a  er should check.
26aa0 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21  ** (pFrom->pTab!
26ab0 3d 30 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  =0) to determine
26ac0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
26ad0 61 20 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74  a successful mat
26ae0 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e  ch.** was found.
26af0 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
26b00 72 20 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73  r not a match is
26b10 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f   found, SQLITE_O
26b20 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
26b30 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   no error.** occ
26b40 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
26b50 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20   does occur, an 
26b60 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
26b70 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a   stored in the.*
26b80 2a 20 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d  * parser and som
26b90 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  e error code oth
26ba0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
26bb0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
26bc0 74 61 74 69 63 20 69 6e 74 20 77 69 74 68 45 78  tatic int withEx
26bd0 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a  pand(.  Walker *
26be0 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75  pWalker, .  stru
26bf0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
26c00 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73  *pFrom.){.  Pars
26c10 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
26c20 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73  ker->pParse;.  s
26c30 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
26c40 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63  rse->db;.  struc
26c50 74 20 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20  t Cte *pCte;    
26c60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
26c70 74 63 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55  tched CTE (or NU
26c80 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20  LL if no match) 
26c90 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68  */.  With *pWith
26ca0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26cb0 20 20 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61       /* WITH cla
26cc0 75 73 65 20 74 68 61 74 20 70 43 74 65 20 62 65  use that pCte be
26cd0 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61  longs to */..  a
26ce0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
26cf0 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65  ab==0 );..  pCte
26d00 20 3d 20 73 65 61 72 63 68 57 69 74 68 28 70 50   = searchWith(pP
26d10 61 72 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72  arse->pWith, pFr
26d20 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69  om, &pWith);.  i
26d30 66 28 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54  f( pCte ){.    T
26d40 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
26d50 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
26d60 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
26d70 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  el;.    Select *
26d80 70 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  pLeft;          
26d90 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f        /* Left-mo
26da0 73 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  st SELECT statem
26db0 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  ent */.    int b
26dc0 4d 61 79 52 65 63 75 72 73 69 76 65 3b 20 20 20  MayRecursive;   
26dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
26de0 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69   if compound joi
26df0 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c  ned by UNION [AL
26e00 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a  L] */.    With *
26e10 70 53 61 76 65 64 57 69 74 68 3b 20 20 20 20 20  pSavedWith;     
26e20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
26e30 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72  al value of pPar
26e40 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20  se->pWith */..  
26e50 20 20 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 43    /* If pCte->zC
26e60 74 65 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c  teErr is non-NUL
26e70 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  L at this point,
26e80 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e   then this is an
26e90 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20   illegal.    ** 
26ea0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
26eb0 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e  nce to CTE pCte.
26ec0 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
26ed0 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
26ee0 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c  turn.    ** earl
26ef0 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 43 74 65  y. If pCte->zCte
26f00 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  Err is NULL, the
26f10 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  n this is not a 
26f20 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
26f30 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  nce..    ** In t
26f40 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65  his case, procee
26f50 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  d.  */.    if( p
26f60 43 74 65 2d 3e 7a 43 74 65 45 72 72 20 29 7b 0a  Cte->zCteErr ){.
26f70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
26f80 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43  orMsg(pParse, pC
26f90 74 65 2d 3e 7a 43 74 65 45 72 72 2c 20 70 43 74  te->zCteErr, pCt
26fa0 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e->zName);.     
26fb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
26fc0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
26fd0 69 66 28 20 63 61 6e 6e 6f 74 42 65 46 75 6e 63  if( cannotBeFunc
26fe0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 46 72  tion(pParse, pFr
26ff0 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  om) ) return SQL
27000 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20  ITE_ERROR;..    
27010 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
27020 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46  Tab==0 );.    pF
27030 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
27040 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
27050 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
27060 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69  f(Table));.    i
27070 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
27080 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
27090 20 20 20 70 54 61 62 2d 3e 6e 54 61 62 52 65 66     pTab->nTabRef
270a0 20 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e   = 1;.    pTab->
270b0 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
270c0 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 74 65  bStrDup(db, pCte
270d0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54  ->zName);.    pT
270e0 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
270f0 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f      pTab->nRowLo
27100 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65  gEst = 200; asse
27110 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33  rt( 200==sqlite3
27120 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29 20  LogEst(1048576) 
27130 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  );.    pTab->tab
27140 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
27150 6d 65 72 61 6c 20 7c 20 54 46 5f 4e 6f 56 69 73  meral | TF_NoVis
27160 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 70  ibleRowid;.    p
27170 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  From->pSelect = 
27180 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
27190 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65  (db, pCte->pSele
271a0 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ct, 0);.    if( 
271b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
271c0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
271d0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
271e0 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
271f0 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20  pSelect );..    
27200 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
27210 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65 20   is a recursive 
27220 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c  CTE. */.    pSel
27230 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
27240 74 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72  t;.    bMayRecur
27250 73 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f  sive = ( pSel->o
27260 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65  p==TK_ALL || pSe
27270 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  l->op==TK_UNION 
27280 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52  );.    if( bMayR
27290 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
272a0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53    int i;.      S
272b0 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
272c0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  From->pSelect->p
272d0 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Src;.      for(i
272e0 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63  =0; i<pSrc->nSrc
272f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
27300 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
27310 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53  tem *pItem = &pS
27320 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
27330 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61    if( pItem->zDa
27340 74 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20  tabase==0 .     
27350 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e      && pItem->zN
27360 61 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20  ame!=0 .        
27370 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
27380 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61  rICmp(pItem->zNa
27390 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  me, pCte->zName)
273a0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
273b0 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
273c0 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  Tab = pTab;.    
273d0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
273e0 69 73 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b  isRecursive = 1;
273f0 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d  .          pTab-
27400 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20  >nTabRef++;.    
27410 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46        pSel->selF
27420 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72  lags |= SF_Recur
27430 73 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  sive;.        }.
27440 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
27450 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72     /* Only one r
27460 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
27470 63 65 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ce is permitted.
27480 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61   */ .    if( pTa
27490 62 2d 3e 6e 54 61 62 52 65 66 3e 32 20 29 7b 0a  b->nTabRef>2 ){.
274a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
274b0 6f 72 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20  orMsg(.         
274c0 20 70 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70   pParse, "multip
274d0 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  le references to
274e0 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65   recursive table
274f0 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61  : %s", pCte->zNa
27500 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
27510 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27520 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
27530 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
27540 54 61 62 52 65 66 3d 3d 31 20 7c 7c 20 0a 20 20  TabRef==1 || .  
27550 20 20 20 20 20 20 20 20 20 20 28 28 70 53 65 6c            ((pSel
27560 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 52 65  ->selFlags&SF_Re
27570 63 75 72 73 69 76 65 29 20 26 26 20 70 54 61 62  cursive) && pTab
27580 2d 3e 6e 54 61 62 52 65 66 3d 3d 32 20 29 29 3b  ->nTabRef==2 ));
27590 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65  ..    pCte->zCte
275a0 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20  Err = "circular 
275b0 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a  reference: %s";.
275c0 20 20 20 20 70 53 61 76 65 64 57 69 74 68 20 3d      pSavedWith =
275d0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a   pParse->pWith;.
275e0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
275f0 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 69  h = pWith;.    i
27600 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65  f( bMayRecursive
27610 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   ){.      Select
27620 20 2a 70 50 72 69 6f 72 20 3d 20 70 53 65 6c 2d   *pPrior = pSel-
27630 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 61  >pPrior;.      a
27640 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
27650 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  With==0 );.     
27660 20 70 50 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d   pPrior->pWith =
27670 20 70 53 65 6c 2d 3e 70 57 69 74 68 3b 0a 20 20   pSel->pWith;.  
27680 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
27690 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
276a0 50 72 69 6f 72 29 3b 0a 20 20 20 20 20 20 70 50  Prior);.      pP
276b0 72 69 6f 72 2d 3e 70 57 69 74 68 20 3d 20 30 3b  rior->pWith = 0;
276c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
276d0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
276e0 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65  ect(pWalker, pSe
276f0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  l);.    }.    pP
27700 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57  arse->pWith = pW
27710 69 74 68 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c  ith;..    for(pL
27720 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d  eft=pSel; pLeft-
27730 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70  >pPrior; pLeft=p
27740 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  Left->pPrior);. 
27750 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c 65 66     pEList = pLef
27760 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69  t->pEList;.    i
27770 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29  f( pCte->pCols )
27780 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 4c 69  {.      if( pELi
27790 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
277a0 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73  xpr!=pCte->pCols
277b0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
277c0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
277d0 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
277e0 65 20 25 73 20 68 61 73 20 25 64 20 76 61 6c 75  e %s has %d valu
277f0 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e  es for %d column
27800 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
27810 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c  pCte->zName, pEL
27820 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65  ist->nExpr, pCte
27830 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20  ->pCols->nExpr. 
27840 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
27850 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
27860 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20  = pSavedWith;.  
27870 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27880 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
27890 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20   }.      pEList 
278a0 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20  = pCte->pCols;. 
278b0 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
278c0 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
278d0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c  List(pParse, pEL
278e0 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
278f0 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
27900 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75      if( bMayRecu
27910 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69  rsive ){.      i
27920 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67  f( pSel->selFlag
27930 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
27940 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65   ){.        pCte
27950 2d 3e 7a 43 74 65 45 72 72 20 3d 20 22 6d 75 6c  ->zCteErr = "mul
27960 74 69 70 6c 65 20 72 65 63 75 72 73 69 76 65 20  tiple recursive 
27970 72 65 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b  references: %s";
27980 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27990 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 43 74 65        pCte->zCte
279a0 45 72 72 20 3d 20 22 72 65 63 75 72 73 69 76 65  Err = "recursive
279b0 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61 20   reference in a 
279c0 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b 0a 20  subquery: %s";. 
279d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
279e0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
279f0 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20  Walker, pSel);. 
27a00 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e 7a     }.    pCte->z
27a10 43 74 65 45 72 72 20 3d 20 30 3b 0a 20 20 20 20  CteErr = 0;.    
27a20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
27a30 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a  pSavedWith;.  }.
27a40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27a50 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
27a60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
27a70 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20  IT_CTE./*.** If 
27a80 74 68 65 20 53 45 4c 45 43 54 20 70 61 73 73 65  the SELECT passe
27a90 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
27aa0 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20  argument has an 
27ab0 61 73 73 6f 63 69 61 74 65 64 20 57 49 54 48 20  associated WITH 
27ac0 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20  .** clause, pop 
27ad0 69 74 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63  it from the stac
27ae0 6b 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74  k stored as part
27af0 20 6f 66 20 74 68 65 20 50 61 72 73 65 20 6f 62   of the Parse ob
27b00 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ject..**.** This
27b10 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
27b20 64 20 61 73 20 74 68 65 20 78 53 65 6c 65 63 74  d as the xSelect
27b30 43 61 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c  Callback2() call
27b40 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74  back by.** sqlit
27b50 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29  e3SelectExpand()
27b60 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20   when walking a 
27b70 53 45 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72  SELECT tree to r
27b80 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20  esolve table.** 
27b90 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20  names and other 
27ba0 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d  FROM clause elem
27bb0 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ents. .*/.static
27bc0 20 76 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57   void selectPopW
27bd0 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  ith(Walker *pWal
27be0 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
27bf0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
27c00 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
27c10 73 65 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f  se;.  if( OK_IF_
27c20 41 4c 57 41 59 53 5f 54 52 55 45 28 70 50 61 72  ALWAYS_TRUE(pPar
27c30 73 65 2d 3e 70 57 69 74 68 29 20 26 26 20 70 2d  se->pWith) && p-
27c40 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20  >pPrior==0 ){.  
27c50 20 20 57 69 74 68 20 2a 70 57 69 74 68 20 3d 20    With *pWith = 
27c60 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
27c70 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 69 66 28  ->pWith;.    if(
27c80 20 70 57 69 74 68 21 3d 30 20 29 7b 0a 20 20 20   pWith!=0 ){.   
27c90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
27ca0 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74 68 20  e->pWith==pWith 
27cb0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
27cc0 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e  >pWith = pWith->
27cd0 70 4f 75 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20  pOuter;.    }.  
27ce0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  }.}.#else.#defin
27cf0 65 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20  e selectPopWith 
27d00 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
27d10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
27d20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63  a Walker callbac
27d30 6b 20 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67  k for "expanding
27d40 22 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  " a SELECT state
27d50 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64  ment..** "Expand
27d60 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f  ing" means to do
27d70 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
27d80 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61  **.**    (1)  Ma
27d90 6b 65 20 73 75 72 65 20 56 44 42 45 20 63 75 72  ke sure VDBE cur
27da0 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65  sor numbers have
27db0 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74   been assigned t
27dc0 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20  o every.**      
27dd0 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68     element of th
27de0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a  e FROM clause..*
27df0 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c  *.**    (2)  Fil
27e00 6c 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  l in the pTabLis
27e10 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c  t->a[].pTab fiel
27e20 64 73 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73  ds in the SrcLis
27e30 74 20 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20  t that .**      
27e40 20 20 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20     defines FROM 
27e50 63 6c 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69  clause.  When vi
27e60 65 77 73 20 61 70 70 65 61 72 20 69 6e 20 74 68  ews appear in th
27e70 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a  e FROM clause,.*
27e80 2a 20 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70  *         fill p
27e90 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65  TabList->a[].pSe
27ea0 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 70 79  lect with a copy
27eb0 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
27ec0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
27ed0 20 20 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65      that impleme
27ee0 6e 74 73 20 74 68 65 20 76 69 65 77 2e 20 20 41  nts the view.  A
27ef0 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66   copy is made of
27f00 20 74 68 65 20 76 69 65 77 27 73 20 53 45 4c 45   the view's SELE
27f10 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74  CT.**         st
27f20 61 74 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20  atement so that 
27f30 77 65 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f  we can freely mo
27f40 64 69 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74  dify or delete t
27f50 68 61 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  hat statement.**
27f60 20 20 20 20 20 20 20 20 20 77 69 74 68 6f 75 74           without
27f70 20 77 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20   worrying about 
27f80 6d 65 73 73 69 6e 67 20 75 70 20 74 68 65 20 70  messing up the p
27f90 65 72 73 69 73 74 65 6e 74 20 72 65 70 72 65 73  ersistent repres
27fa0 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  entation.**     
27fb0 20 20 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e      of the view.
27fc0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41  .**.**    (3)  A
27fd0 64 64 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  dd terms to the 
27fe0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20  WHERE clause to 
27ff0 61 63 63 6f 6d 6d 6f 64 61 74 65 20 74 68 65 20  accommodate the 
28000 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a  NATURAL keyword.
28010 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f  **         on jo
28020 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e 20 61  ins and the ON a
28030 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  nd USING clause 
28040 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20  of joins..**.** 
28050 20 20 20 28 34 29 20 20 53 63 61 6e 20 74 68 65     (4)  Scan the
28060 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
28070 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
28080 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b  et (pEList) look
28090 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 66  ing.**         f
280a0 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  or instances of 
280b0 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74 6f 72  the "*" operator
280c0 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e 2a 20   or the TABLE.* 
280d0 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20  operator..**    
280e0 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c 20 65       If found, e
280f0 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22 20 74  xpand each "*" t
28100 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  o be every colum
28110 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62 6c 65  n in every table
28120 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20  .**         and 
28130 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76  TABLE.* to be ev
28140 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41  ery column in TA
28150 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  BLE..**.*/.stati
28160 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78 70 61  c int selectExpa
28170 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70 57 61  nder(Walker *pWa
28180 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
28190 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
281a0 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
281b0 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  rse;.  int i, j,
281c0 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   k;.  SrcList *p
281d0 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c  TabList;.  ExprL
281e0 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
281f0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
28200 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c  em *pFrom;.  sql
28210 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
28220 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
28230 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70 45 78  E, *pRight, *pEx
28240 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46 6c 61  pr;.  u16 selFla
28250 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  gs = p->selFlags
28260 3b 0a 20 20 75 33 32 20 65 6c 69 73 74 46 6c 61  ;.  u32 elistFla
28270 67 73 20 3d 20 30 3b 0a 0a 20 20 70 2d 3e 73 65  gs = 0;..  p->se
28280 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78 70  lFlags |= SF_Exp
28290 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64 62 2d  anded;.  if( db-
282a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 20 29  >mallocFailed  )
282b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
282c0 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 61 73  _Abort;.  }.  as
282d0 73 65 72 74 28 20 70 2d 3e 70 53 72 63 21 3d 30  sert( p->pSrc!=0
282e0 20 29 3b 0a 20 20 69 66 28 20 28 73 65 6c 46 6c   );.  if( (selFl
282f0 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65  ags & SF_Expande
28300 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  d)!=0 ){.    ret
28310 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
28320 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20   }.  pTabList = 
28330 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
28340 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
28350 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68   sqlite3WithPush
28360 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 57 69 74  (pParse, p->pWit
28370 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  h, 0);..  /* Mak
28380 65 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75  e sure cursor nu
28390 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20  mbers have been 
283a0 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
283b0 65 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20  entries in.  ** 
283c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
283d0 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
283e0 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
283f0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73  sqlite3SrcListAs
28400 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72  signCursors(pPar
28410 73 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a  se, pTabList);..
28420 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65    /* Look up eve
28430 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69  ry table named i
28440 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
28450 65 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  e of the select.
28460 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74    If.  ** an ent
28470 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ry of the FROM c
28480 6c 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75  lause is a subqu
28490 65 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ery instead of a
284a0 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a   table or view,.
284b0 20 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65    ** then create
284c0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62   a transient tab
284d0 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  le structure to 
284e0 64 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62  describe the sub
284f0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  query..  */.  fo
28500 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61  r(i=0, pFrom=pTa
28510 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62  bList->a; i<pTab
28520 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
28530 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54   pFrom++){.    T
28540 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
28550 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 66  assert( pFrom->f
28560 67 2e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30  g.isRecursive==0
28570 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21   || pFrom->pTab!
28580 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46  =0 );.    if( pF
28590 72 6f 6d 2d 3e 66 67 2e 69 73 52 65 63 75 72 73  rom->fg.isRecurs
285a0 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ive ) continue;.
285b0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
285c0 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 23 69  m->pTab==0 );.#i
285d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
285e0 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69  T_CTE.    if( wi
285f0 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72  thExpand(pWalker
28600 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72  , pFrom) ) retur
28610 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
28620 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
28630 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69   ) {} else.#endi
28640 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  f.    if( pFrom-
28650 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
28660 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28670 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
28680 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
28690 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
286a0 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
286b0 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
286c0 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
286d0 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
286e0 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20  rt( pSel!=0 );. 
286f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
28700 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
28710 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
28720 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
28730 65 72 2c 20 70 53 65 6c 29 20 29 20 72 65 74 75  er, pSel) ) retu
28740 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
28750 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20      pFrom->pTab 
28760 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33  = pTab = sqlite3
28770 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
28780 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
28790 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
287a0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
287b0 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61  Abort;.      pTa
287c0 62 2d 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a  b->nTabRef = 1;.
287d0 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d        if( pFrom-
287e0 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
287f0 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d     pTab->zName =
28800 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
28810 28 64 62 2c 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  (db, pFrom->zAli
28820 61 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  as);.      }else
28830 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  {.        pTab->
28840 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
28850 50 72 69 6e 74 66 28 64 62 2c 20 22 73 75 62 71  Printf(db, "subq
28860 75 65 72 79 5f 25 70 22 2c 20 28 76 6f 69 64 2a  uery_%p", (void*
28870 29 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a  )pTab);.      }.
28880 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
28890 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65  l->pPrior ){ pSe
288a0 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
288b0 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ; }.      sqlite
288c0 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
288d0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
288e0 6c 2d 3e 70 45 4c 69 73 74 2c 26 70 54 61 62 2d  l->pEList,&pTab-
288f0 3e 6e 43 6f 6c 2c 26 70 54 61 62 2d 3e 61 43 6f  >nCol,&pTab->aCo
28900 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  l);.      pTab->
28910 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20  iPKey = -1;.    
28920 20 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45    pTab->nRowLogE
28930 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
28940 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
28950 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
28960 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62  .      pTab->tab
28970 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
28980 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20  meral;.#endif.  
28990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
289a0 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  * An ordinary ta
289b0 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
289c0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
289d0 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  use */.      ass
289e0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
289f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72  ==0 );.      pFr
28a00 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
28a10 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
28a20 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
28a30 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20   0, pFrom);.    
28a40 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
28a50 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
28a60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
28a70 2d 3e 6e 54 61 62 52 65 66 3e 3d 30 78 66 66 66  ->nTabRef>=0xfff
28a80 66 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  f ){.        sql
28a90 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
28aa0 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72  rse, "too many r
28ab0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25  eferences to \"%
28ac0 73 5c 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c  s\": max 65535",
28ad0 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
28ae0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
28af0 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
28b00 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
28b10 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
28b20 20 20 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d     }.      pTab-
28b30 3e 6e 54 61 62 52 65 66 2b 2b 3b 0a 20 20 20 20  >nTabRef++;.    
28b40 20 20 69 66 28 20 21 49 73 56 69 72 74 75 61 6c    if( !IsVirtual
28b50 28 70 54 61 62 29 20 26 26 20 63 61 6e 6e 6f 74  (pTab) && cannot
28b60 42 65 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  BeFunction(pPars
28b70 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20  e, pFrom) ){.   
28b80 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
28b90 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 23  Abort;.      }.#
28ba0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
28bb0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
28bc0 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c 49 54   !defined (SQLIT
28bd0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
28be0 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28 20 49  BLE).      if( I
28bf0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 7c  sVirtual(pTab) |
28c00 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
28c10 29 7b 0a 20 20 20 20 20 20 20 20 69 31 36 20 6e  ){.        i16 n
28c20 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Col;.        if(
28c30 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
28c40 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
28c50 65 2c 20 70 54 61 62 29 20 29 20 72 65 74 75 72  e, pTab) ) retur
28c60 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
28c70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
28c80 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  om->pSelect==0 )
28c90 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  ;.        pFrom-
28ca0 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
28cb0 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
28cc0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pTab->pSelect, 0
28cd0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
28ce0 65 33 53 65 6c 65 63 74 53 65 74 4e 61 6d 65 28  e3SelectSetName(
28cf0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pFrom->pSelect, 
28d00 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
28d10 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 70 54 61        nCol = pTa
28d20 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->nCol;.       
28d30 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 2d 31   pTab->nCol = -1
28d40 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
28d50 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
28d60 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ker, pFrom->pSel
28d70 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 54  ect);.        pT
28d80 61 62 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b  ab->nCol = nCol;
28d90 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
28da0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f      }..    /* Lo
28db0 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e  cate the index n
28dc0 61 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45  amed by the INDE
28dd0 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69  XED BY clause, i
28de0 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66  f any. */.    if
28df0 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64  ( sqlite3Indexed
28e00 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  ByLookup(pParse,
28e10 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20   pFrom) ){.     
28e20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
28e30 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
28e40 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52  /* Process NATUR
28e50 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64  AL keywords, and
28e60 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
28e70 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a  auses of joins..
28e80 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d    */.  if( db->m
28e90 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73  allocFailed || s
28ea0 71 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e  qliteProcessJoin
28eb0 28 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20  (pParse, p) ){. 
28ec0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
28ed0 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ort;.  }..  /* F
28ee0 6f 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61  or every "*" tha
28ef0 74 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  t occurs in the 
28f00 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73  column list, ins
28f10 65 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ert the names of
28f20 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e  .  ** all column
28f30 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
28f40 20 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20    And for every 
28f50 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74  TABLE.* insert t
28f60 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66  he names.  ** of
28f70 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
28f80 54 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73  TABLE.  The pars
28f90 65 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70  er inserted a sp
28fa0 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e  ecial expression
28fb0 0a 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54  .  ** with the T
28fc0 4b 5f 41 53 54 45 52 49 53 4b 20 6f 70 65 72 61  K_ASTERISK opera
28fd0 74 6f 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22  tor for each "*"
28fe0 20 74 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69   that it found i
28ff0 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 2a  n the column.  *
29000 2a 20 6c 69 73 74 2e 20 20 54 68 65 20 66 6f 6c  * list.  The fol
29010 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75 73 74  lowing code just
29020 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65 20 74   has to locate t
29030 68 65 20 54 4b 5f 41 53 54 45 52 49 53 4b 0a 20  he TK_ASTERISK. 
29040 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20   ** expressions 
29050 61 6e 64 20 65 78 70 61 6e 64 20 65 61 63 68 20  and expand each 
29060 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20  one to the list 
29070 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  of all columns i
29080 6e 0a 20 20 2a 2a 20 61 6c 6c 20 74 61 62 6c 65  n.  ** all table
29090 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
290a0 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74   first loop just
290b0 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
290c0 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
290d0 22 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20  "*" operators.  
290e0 2a 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70  ** that need exp
290f0 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  anding..  */.  f
29100 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
29110 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
29120 20 20 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e     pE = pEList->
29130 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
29140 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41  if( pE->op==TK_A
29150 53 54 45 52 49 53 4b 20 29 20 62 72 65 61 6b 3b  STERISK ) break;
29160 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
29170 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
29180 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  E->pRight!=0 );.
29190 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
291a0 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70  op!=TK_DOT || (p
291b0 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70  E->pLeft!=0 && p
291c0 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  E->pLeft->op==TK
291d0 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20  _ID) );.    if( 
291e0 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
291f0 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  & pE->pRight->op
29200 3d 3d 54 4b 5f 41 53 54 45 52 49 53 4b 20 29 20  ==TK_ASTERISK ) 
29210 62 72 65 61 6b 3b 0a 20 20 20 20 65 6c 69 73 74  break;.    elist
29220 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61  Flags |= pE->fla
29230 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c  gs;.  }.  if( k<
29240 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
29250 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49  .    /*.    ** I
29260 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69 74  f we get here it
29270 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c   means the resul
29280 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f  t set contains o
29290 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20  ne or more "*". 
292a0 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20     ** operators 
292b0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
292c0 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20  expanded.  Loop 
292d0 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78 70  through each exp
292e0 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69  ression.    ** i
292f0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
29300 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d   and expand them
29310 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20   one by one..   
29320 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45   */.    struct E
29330 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20  xprList_item *a 
29340 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20  = pEList->a;.   
29350 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20   ExprList *pNew 
29360 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61  = 0;.    int fla
29370 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  gs = pParse->db-
29380 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20  >flags;.    int 
29390 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61  longNames = (fla
293a0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
293b0 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20  ColNames)!=0.   
293c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293d0 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20 53     && (flags & S
293e0 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
293f0 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f  mes)==0;..    fo
29400 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
29410 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
29420 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70 45      pE = a[k].pE
29430 78 70 72 3b 0a 20 20 20 20 20 20 65 6c 69 73 74  xpr;.      elist
29440 46 6c 61 67 73 20 7c 3d 20 70 45 2d 3e 66 6c 61  Flags |= pE->fla
29450 67 73 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  gs;.      pRight
29460 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20   = pE->pRight;. 
29470 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
29480 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
29490 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
294a0 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b    if( pE->op!=TK
294b0 5f 41 53 54 45 52 49 53 4b 0a 20 20 20 20 20 20  _ASTERISK.      
294c0 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f   && (pE->op!=TK_
294d0 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f  DOT || pRight->o
294e0 70 21 3d 54 4b 5f 41 53 54 45 52 49 53 4b 29 0a  p!=TK_ASTERISK).
294f0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
29500 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
29510 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
29520 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
29530 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
29540 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
29550 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
29560 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
29570 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e  rse, pNew, a[k].
29580 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
29590 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
295a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
295b0 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
295c0 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
295d0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
295e0 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
295f0 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a  ].zSpan = a[k].z
29600 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  Span;.          
29610 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
29620 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
29630 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Span = 0;.      
29640 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
29650 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
29660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29670 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
29680 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
29690 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
296a0 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
296b0 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
296c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
296d0 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
296e0 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
296f0 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
29700 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
29710 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20  ar *zTName = 0; 
29720 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
29730 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
29740 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
29750 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
29760 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
29770 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29  ( pE->pLeft!=0 )
29780 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
29790 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
297a0 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20  erty(pE->pLeft, 
297b0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
297c0 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
297d0 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e   = pE->pLeft->u.
297e0 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
297f0 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
29800 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
29810 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
29820 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
29830 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
29840 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
29850 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
29860 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
29870 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ub = pFrom->pSel
29880 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ect;.          c
29890 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
298a0 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pFrom->zAlias;. 
298b0 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
298c0 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65  har *zSchemaName
298d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
298e0 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
298f0 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
29900 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
29910 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61    zTabName = pTa
29920 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
29930 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29940 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
29950 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  iled ) break;.  
29960 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
29970 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65  ==0 || (pSub->se
29980 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
29990 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20  edFrom)==0 ){.  
299a0 20 20 20 20 20 20 20 20 20 20 70 53 75 62 20 3d            pSub =
299b0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
299c0 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71  if( zTName && sq
299d0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e  lite3StrICmp(zTN
299e0 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d  ame, zTabName)!=
299f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
29a00 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
29a10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29a20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c         iDb = sql
29a30 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
29a40 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
29a50 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
29a60 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20    zSchemaName = 
29a70 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62  iDb>=0 ? db->aDb
29a80 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 3a  [iDb].zDbSName :
29a90 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20   "*";.          
29aa0 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  }.          for(
29ab0 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  j=0; j<pTab->nCo
29ac0 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; j++){.       
29ad0 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
29ae0 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
29af0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
29b00 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61      char *zColna
29b10 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  me;  /* The comp
29b20 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
29b30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
29b40 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20  char *zToFree;  
29b50 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72   /* Malloced str
29b60 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73 20 74  ing that needs t
29b70 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
29b80 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20            Token 
29b90 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f  sColname;  /* Co
29ba0 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
29bb0 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f  me as a token */
29bc0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ..            as
29bd0 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20  sert( zName );. 
29be0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
29bf0 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20  TName && pSub.  
29c00 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
29c10 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61  lite3MatchSpanNa
29c20 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d  me(pSub->pEList-
29c30 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20  >a[j].zSpan, 0, 
29c40 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20  zTName, 0)==0.  
29c50 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
29c60 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
29c70 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
29c80 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
29c90 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69  /* If a column i
29ca0 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64  s marked as 'hid
29cb0 64 65 6e 27 2c 20 6f 6d 69 74 20 69 74 20 66 72  den', omit it fr
29cc0 6f 6d 20 74 68 65 20 65 78 70 61 6e 64 65 64 0a  om the expanded.
29cd0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72              ** r
29ce0 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 20 75  esult-set list u
29cf0 6e 6c 65 73 73 20 74 68 65 20 53 45 4c 45 43 54  nless the SELECT
29d00 20 68 61 73 20 74 68 65 20 53 46 5f 49 6e 63 6c   has the SF_Incl
29d10 75 64 65 48 69 64 64 65 6e 0a 20 20 20 20 20 20  udeHidden.      
29d20 20 20 20 20 20 20 2a 2a 20 62 69 74 20 73 65 74        ** bit set
29d30 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
29d40 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
29d50 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
29d60 53 46 5f 49 6e 63 6c 75 64 65 48 69 64 64 65 6e  SF_IncludeHidden
29d70 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )==0.           
29d80 20 20 26 26 20 49 73 48 69 64 64 65 6e 43 6f 6c    && IsHiddenCol
29d90 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  umn(&pTab->aCol[
29da0 6a 5d 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  j]) .           
29db0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29dc0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
29dd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29de0 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20        tableSeen 
29df0 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
29e00 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e    if( i>0 && zTN
29e10 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
29e20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46 72          if( (pFr
29e30 6f 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  om->fg.jointype 
29e40 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30  & JT_NATURAL)!=0
29e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29e60 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75   && tableAndColu
29e70 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74  mnIndex(pTabList
29e80 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30  , i, zName, 0, 0
29e90 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
29ea0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
29eb0 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52     /* In a NATUR
29ec0 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68  AL join, omit th
29ed0 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66  e join columns f
29ee0 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20  rom the .       
29ef0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
29f00 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f  e to the right o
29f10 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20  f the join */.  
29f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
29f30 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
29f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29f50 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
29f60 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72  3IdListIndex(pFr
29f70 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d  om->pUsing, zNam
29f80 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)>=0 ){.       
29f90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61           /* In a
29fa0 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49   join with a USI
29fb0 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20  NG clause, omit 
29fc0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20  columns in the. 
29fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
29fe0 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66  * using clause f
29ff0 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e  rom the table on
2a000 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20   the right. */. 
2a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2a020 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2a030 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2a050 20 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69     pRight = sqli
2a060 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
2a070 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  D, zName);.     
2a080 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20         zColname 
2a090 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  = zName;.       
2a0a0 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30       zToFree = 0
2a0b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2a0c0 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70  ( longNames || p
2a0d0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20  TabList->nSrc>1 
2a0e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2a0f0 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20   Expr *pLeft;.  
2a100 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66              pLef
2a110 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
2a120 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e  db, TK_ID, zTabN
2a130 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2a140 20 20 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69      pExpr = sqli
2a150 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2a160 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
2a170 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
2a180 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68 65         if( zSche
2a190 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  maName ){.      
2a1a0 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
2a1b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
2a1c0 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61  , TK_ID, zSchema
2a1d0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
2a1e0 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
2a1f0 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
2a200 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
2a210 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  t, pExpr);.     
2a220 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a230 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e           if( lon
2a240 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  gNames ){.      
2a250 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61            zColna
2a260 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
2a270 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
2a280 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65   zTabName, zName
2a290 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2a2a0 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f     zToFree = zCo
2a2b0 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  lname;.         
2a2c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2a2d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a2e0 20 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20          pExpr = 
2a2f0 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
2a300 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2a310 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
2a320 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
2a330 50 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78  Parse, pNew, pEx
2a340 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
2a350 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69   sqlite3TokenIni
2a360 74 28 26 73 43 6f 6c 6e 61 6d 65 2c 20 7a 43 6f  t(&sColname, zCo
2a370 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  lname);.        
2a380 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
2a390 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73  istSetName(pPars
2a3a0 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61  e, pNew, &sColna
2a3b0 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  me, 0);.        
2a3c0 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26 20      if( pNew && 
2a3d0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
2a3e0 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30  F_NestedFrom)!=0
2a3f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a400 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
2a410 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e  t_item *pX = &pN
2a420 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70  ew->a[pNew->nExp
2a430 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  r-1];.          
2a440 20 20 20 20 69 66 28 20 70 53 75 62 20 29 7b 0a      if( pSub ){.
2a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a460 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69  pX->zSpan = sqli
2a470 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
2a480 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  pSub->pEList->a[
2a490 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  j].zSpan);.     
2a4a0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
2a4b0 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d  ase( pX->zSpan==
2a4c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0 );.           
2a4d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a4e0 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a 53            pX->zS
2a4f0 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  pan = sqlite3MPr
2a500 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 2e  intf(db, "%s.%s.
2a510 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
2a520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a540 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61  zSchemaName, zTa
2a550 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29  bName, zColname)
2a560 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a570 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
2a580 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  zSpan==0 );.    
2a590 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a5a0 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 62 53            pX->bS
2a5b0 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20 20  panIsTab = 1;.  
2a5c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a5d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
2a5e0 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65  bFree(db, zToFre
2a5f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
2a600 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a610 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e    if( !tableSeen
2a620 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2a630 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ( zTName ){.    
2a640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2a650 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2a660 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  "no such table: 
2a670 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20  %s", zTName);.  
2a680 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2a690 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2a6a0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2a6b0 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70  e, "no tables sp
2a6c0 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20  ecified");.     
2a6d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2a6e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2a6f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
2a700 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c  stDelete(db, pEL
2a710 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c  ist);.    p->pEL
2a720 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  ist = pNew;.  }.
2a730 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 20    if( p->pEList 
2a740 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 45  ){.    if( p->pE
2a750 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  List->nExpr>db->
2a760 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
2a770 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
2a780 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2a790 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
2a7a0 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69  o many columns i
2a7b0 6e 20 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a  n result set");.
2a7c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
2a7d0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
2a7e0 20 20 69 66 28 20 28 65 6c 69 73 74 46 6c 61 67    if( (elistFlag
2a7f0 73 20 26 20 28 45 50 5f 48 61 73 46 75 6e 63 7c  s & (EP_HasFunc|
2a800 45 50 5f 53 75 62 71 75 65 72 79 29 29 21 3d 30  EP_Subquery))!=0
2a810 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 65 6c   ){.      p->sel
2a820 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6d 70  Flags |= SF_Comp
2a830 6c 65 78 52 65 73 75 6c 74 3b 0a 20 20 20 20 7d  lexResult;.    }
2a840 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
2a850 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2a860 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69  *.** No-op routi
2a870 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  ne for the parse
2a880 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a  -tree walker..**
2a890 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
2a8a0 75 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c  utine is the Wal
2a8b0 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
2a8c0 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f  k then expressio
2a8d0 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77  n trees.** are w
2a8e0 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e  alked without an
2a8f0 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20  y actions being 
2a900 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f  taken at each no
2a910 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c  de.  Presumably,
2a920 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f  .** when this ro
2a930 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
2a940 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  r Walker.xExprCa
2a950 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20  llback then .** 
2a960 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61  Walker.xSelectCa
2a970 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f  llback is set to
2a980 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73   do something us
2a990 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a  eful for every .
2a9a0 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74  ** subquery in t
2a9b0 68 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a  he parser tree..
2a9c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
2a9d0 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65  prWalkNoop(Walke
2a9e0 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72  r *NotUsed, Expr
2a9f0 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55   *NotUsed2){.  U
2aa00 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
2aa10 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
2aa20 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  d2);.  return WR
2aa30 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
2aa40 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69  *.** No-op routi
2aa50 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  ne for the parse
2aa60 2d 74 72 65 65 20 77 61 6c 6b 65 72 20 66 6f 72  -tree walker for
2aa70 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2aa80 74 73 2e 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ts..** subquery 
2aa90 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72  in the parser tr
2aaa0 65 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ee..*/.int sqlit
2aab0 65 33 53 65 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70  e3SelectWalkNoop
2aac0 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64  (Walker *NotUsed
2aad0 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73 65  , Select *NotUse
2aae0 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
2aaf0 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
2ab00 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
2ab10 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
2ab20 75 65 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  ue;.}..#if SQLIT
2ab30 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 6c  E_DEBUG./*.** Al
2ab40 77 61 79 73 20 61 73 73 65 72 74 2e 20 20 54 68  ways assert.  Th
2ab50 69 73 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61  is xSelectCallba
2ab60 63 6b 32 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ck2 implementati
2ab70 6f 6e 20 70 72 6f 76 65 73 20 74 68 61 74 20 74  on proves that t
2ab80 68 65 0a 2a 2a 20 78 53 65 6c 65 63 74 43 61 6c  he.** xSelectCal
2ab90 6c 62 61 63 6b 32 20 69 73 20 6e 65 76 65 72 20  lback2 is never 
2aba0 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 76 6f 69 64  invoked..*/.void
2abb0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 61   sqlite3SelectWa
2abc0 6c 6b 41 73 73 65 72 74 32 28 57 61 6c 6b 65 72  lkAssert2(Walker
2abd0 20 2a 4e 6f 74 55 73 65 64 2c 20 53 65 6c 65 63   *NotUsed, Selec
2abe0 74 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  t *NotUsed2){.  
2abf0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2ac00 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
2ac10 65 64 32 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ed2);.  assert( 
2ac20 30 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 2f 2a  0 );.}.#endif./*
2ac30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2ac40 20 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c   "expands" a SEL
2ac50 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  ECT statement an
2ac60 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
2ac70 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20  queries..** For 
2ac80 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
2ac90 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69  mation on what i
2aca0 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61  t means to "expa
2acb0 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20  nd" a SELECT.** 
2acc0 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74  statement, see t
2acd0 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
2ace0 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77  e selectExpand w
2acf0 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61  orker callback a
2ad00 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61  bove..**.** Expa
2ad10 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73  nding a SELECT s
2ad20 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20  tatement is the 
2ad30 66 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72  first step in pr
2ad40 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45  ocessing a.** SE
2ad50 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
2ad60 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
2ad70 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78  ement must be ex
2ad80 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a  panded before.**
2ad90 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
2ada0 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
2adb0 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67  *.** If anything
2adc0 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20   goes wrong, an 
2add0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
2ade0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50   written into pP
2adf0 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c  arse..** The cal
2ae00 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61  ling function ca
2ae10 6e 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f  n detect the pro
2ae20 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  blem by looking 
2ae30 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a  at pParse->nErr.
2ae40 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65  ** and/or pParse
2ae50 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2ae60 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
2ae70 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
2ae80 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50  Expand(Parse *pP
2ae90 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
2aea0 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72  elect){.  Walker
2aeb0 20 77 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c   w;.  w.xExprCal
2aec0 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  lback = sqlite3E
2aed0 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
2aee0 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
2aef0 3b 0a 20 20 69 66 28 20 4f 4b 5f 49 46 5f 41 4c  ;.  if( OK_IF_AL
2af00 57 41 59 53 5f 54 52 55 45 28 70 50 61 72 73 65  WAYS_TRUE(pParse
2af10 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 29 20 29  ->hasCompound) )
2af20 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74 43  {.    w.xSelectC
2af30 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65 72  allback = conver
2af40 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54  tCompoundSelectT
2af50 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20 77  oSubquery;.    w
2af60 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
2af70 32 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  2 = 0;.    sqlit
2af80 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
2af90 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20   pSelect);.  }. 
2afa0 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
2afb0 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e  ck = selectExpan
2afc0 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  der;.  w.xSelect
2afd0 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65  Callback2 = sele
2afe0 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c  ctPopWith;.  sql
2aff0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
2b000 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a  w, pSelect);.}..
2b010 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b020 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
2b030 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61  .** This is a Wa
2b040 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
2b050 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f  back callback fo
2b060 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c  r the sqlite3Sel
2b070 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a  ectTypeInfo().**
2b080 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a   interface..**.*
2b090 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d  * For each FROM-
2b0a0 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c  clause subquery,
2b0b0 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70   add Column.zTyp
2b0c0 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  e and Column.zCo
2b0d0 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
2b0e0 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73  n to the Table s
2b0f0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
2b100 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
2b110 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68  ult set.** of th
2b120 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a  at subquery..**.
2b130 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
2b140 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
2b150 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
2b160 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72  t set was constr
2b170 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65  ucted.** by sele
2b180 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74  ctExpander() but
2b190 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f   the type and co
2b1a0 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
2b1b0 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a  ion was omitted.
2b1c0 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ** at that point
2b1d0 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66   because identif
2b1e0 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74  iers had not yet
2b1f0 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
2b200 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
2b210 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
2b220 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f   identifier reso
2b230 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
2b240 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64  c void selectAdd
2b250 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
2b260 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
2b270 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
2b280 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
2b290 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73   int i;.  SrcLis
2b2a0 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  t *pTabList;.  s
2b2b0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2b2c0 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73  em *pFrom;..  as
2b2d0 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
2b2e0 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20  s & SF_Resolved 
2b2f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 2d  );.  assert( (p-
2b300 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
2b310 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20 29  asTypeInfo)==0 )
2b320 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  ;.  p->selFlags 
2b330 7c 3d 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66  |= SF_HasTypeInf
2b340 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  o;.  pParse = pW
2b350 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
2b360 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
2b370 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  Src;.  for(i=0, 
2b380 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
2b390 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
2b3a0 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
2b3b0 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
2b3c0 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
2b3d0 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
2b3e0 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab!=0 );.    if
2b3f0 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
2b400 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
2b410 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
2b420 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
2b430 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2b440 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
2b450 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
2b460 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
2b470 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  ct;.      if( pS
2b480 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  el ){.        wh
2b490 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f  ile( pSel->pPrio
2b4a0 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d  r ) pSel = pSel-
2b4b0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
2b4c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
2b4d0 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
2b4e0 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
2b4f0 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20  pTab, pSel);.   
2b500 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
2b510 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
2b520 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64  This routine add
2b530 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20 63  s datatype and c
2b540 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
2b550 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
2b560 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73 74  .** the Table st
2b570 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c 20  ructures of all 
2b580 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
2b590 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20 53  ueries in a.** S
2b5a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2b5b0 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73 20  .**.** Use this 
2b5c0 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e 61  routine after na
2b5d0 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a  me resolution..*
2b5e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
2b5f0 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79  lite3SelectAddTy
2b600 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  peInfo(Parse *pP
2b610 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
2b620 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66 20  elect){.#ifndef 
2b630 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
2b640 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77 3b  UERY.  Walker w;
2b650 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
2b660 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 53 65  back = sqlite3Se
2b670 6c 65 63 74 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  lectWalkNoop;.  
2b680 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
2b690 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75  k2 = selectAddSu
2b6a0 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a  bqueryTypeInfo;.
2b6b0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
2b6c0 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 57  k = sqlite3ExprW
2b6d0 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61  alkNoop;.  w.pPa
2b6e0 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
2b6f0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
2b700 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
2b710 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
2b720 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
2b730 74 73 20 75 70 20 61 20 53 45 4c 45 43 54 20 73  ts up a SELECT s
2b740 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f  tatement for pro
2b750 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a  cessing.  The.**
2b760 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63   following is ac
2b770 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a  complished:.**.*
2b780 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20 43 75  *     *  VDBE Cu
2b790 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65  rsor numbers are
2b7a0 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c   assigned to all
2b7b0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72   FROM-clause ter
2b7c0 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70  ms..**     *  Ep
2b7d0 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62  hemeral Table ob
2b7e0 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
2b7f0 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63  d for all FROM-c
2b800 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
2b810 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61  ..**     *  ON a
2b820 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
2b830 20 61 72 65 20 73 68 69 66 74 65 64 20 69 6e 74   are shifted int
2b840 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e  o WHERE statemen
2b850 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c  ts.**     *  Wil
2b860 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22  dcards "*" and "
2b870 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75  TABLE.*" in resu
2b880 6c 74 20 73 65 74 73 20 61 72 65 20 65 78 70 61  lt sets are expa
2b890 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  nded..**     *  
2b8a0 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65  Identifiers in e
2b8b0 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61  xpression are ma
2b8c0 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e  tched to tables.
2b8d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2b8e0 69 6e 65 20 61 63 74 73 20 72 65 63 75 72 73 69  ine acts recursi
2b8f0 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71  vely on all subq
2b900 75 65 72 69 65 73 20 77 69 74 68 69 6e 20 74 68  ueries within th
2b910 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
2b920 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50  d sqlite3SelectP
2b930 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rep(.  Parse *pP
2b940 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
2b950 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
2b960 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
2b970 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
2b980 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
2b990 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
2b9a0 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  ded. */.  NameCo
2b9b0 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20  ntext *pOuterNC 
2b9c0 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
2b9d0 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a   for container *
2b9e0 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  /.){.  assert( p
2b9f0 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  !=0 || pParse->d
2ba00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2ba10 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
2ba20 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2ba30 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
2ba40 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
2ba50 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20 29  SF_HasTypeInfo )
2ba60 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
2ba70 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 70  e3SelectExpand(p
2ba80 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66 28  Parse, p);.  if(
2ba90 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
2baa0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
2bab0 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
2bac0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73  rn;.  sqlite3Res
2bad0 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28  olveSelectNames(
2bae0 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65  pParse, p, pOute
2baf0 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72  rNC);.  if( pPar
2bb00 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72  se->nErr || pPar
2bb10 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
2bb20 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
2bb30 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64   sqlite3SelectAd
2bb40 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73 65  dTypeInfo(pParse
2bb50 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , p);.}../*.** R
2bb60 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67 61  eset the aggrega
2bb70 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e 0a  te accumulator..
2bb80 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65 67  **.** The aggreg
2bb90 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20  ate accumulator 
2bba0 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d 6f  is a set of memo
2bbb0 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68 6f  ry cells that ho
2bbc0 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61  ld.** intermedia
2bbd0 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c 65  te results while
2bbe0 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e 20   calculating an 
2bbf0 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69 73  aggregate.  This
2bc00 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  .** routine gene
2bc10 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74 20  rates code that 
2bc20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e 20  stores NULLs in 
2bc30 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65 6d  all of those mem
2bc40 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f  ory.** cells..*/
2bc50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
2bc60 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  etAccumulator(Pa
2bc70 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
2bc80 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
2bc90 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
2bca0 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
2bcb0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67  t i;.  struct Ag
2bcc0 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75 6e  gInfo_func *pFun
2bcd0 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d 20  c;.  int nReg = 
2bce0 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20  pAggInfo->nFunc 
2bcf0 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  + pAggInfo->nCol
2bd00 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67 3d  umn;.  if( nReg=
2bd10 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
2bd20 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2bd30 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
2bd40 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72 65  t all AggInfo re
2bd50 67 69 73 74 65 72 73 20 61 72 65 20 77 69 74 68  gisters are with
2bd60 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70 65  in the range spe
2bd70 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20 41  cified by.  ** A
2bd80 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67  ggInfo.mnReg..Ag
2bd90 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20  gInfo.mxReg */. 
2bda0 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d 70   assert( nReg==p
2bdb0 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70  AggInfo->mxReg-p
2bdc0 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31  AggInfo->mnReg+1
2bdd0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
2bde0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75  <pAggInfo->nColu
2bdf0 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  mn; i++){.    as
2be00 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e  sert( pAggInfo->
2be10 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41  aCol[i].iMem>=pA
2be20 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20  ggInfo->mnReg.  
2be30 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e         && pAggIn
2be40 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
2be50 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  <=pAggInfo->mxRe
2be60 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  g );.  }.  for(i
2be70 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
2be80 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFunc; i++){.   
2be90 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e 66   assert( pAggInf
2bea0 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d  o->aFunc[i].iMem
2beb0 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
2bec0 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
2bed0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d  ggInfo->aFunc[i]
2bee0 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d  .iMem<=pAggInfo-
2bef0 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23 65  >mxReg );.  }.#e
2bf00 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 64  ndif.  sqlite3Vd
2bf10 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
2bf20 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f  ull, 0, pAggInfo
2bf30 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e 66  ->mnReg, pAggInf
2bf40 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f 72  o->mxReg);.  for
2bf50 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f 2d  (pFunc=pAggInfo-
2bf60 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c 70  >aFunc, i=0; i<p
2bf70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2bf80 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a 20  i++, pFunc++){. 
2bf90 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69 44     if( pFunc->iD
2bfa0 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20  istinct>=0 ){.  
2bfb0 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
2bfc0 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Func->pExpr;.   
2bfd0 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
2bfe0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
2bff0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
2c000 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 78  .      if( pE->x
2c010 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45 2d  .pList==0 || pE-
2c020 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  >x.pList->nExpr!
2c030 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
2c040 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2c050 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54 20  arse, "DISTINCT 
2c060 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74 20  aggregates must 
2c070 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  have exactly one
2c080 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   ".           "a
2c090 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20 20  rgument");.     
2c0a0 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69     pFunc->iDisti
2c0b0 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  nct = -1;.      
2c0c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4b  }else{.        K
2c0d0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
2c0e0 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78   = keyInfoFromEx
2c0f0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2c100 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 2c 20 30  E->x.pList, 0, 0
2c110 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2c120 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2c130 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
2c140 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  , pFunc->iDistin
2c150 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  ct, 0, 0,.      
2c160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c170 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49      (char*)pKeyI
2c180 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
2c190 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c1a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
2c1b0 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69  oke the OP_AggFi
2c1c0 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f  nalize opcode fo
2c1d0 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61 74  r every aggregat
2c1e0 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e  e function.** in
2c1f0 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
2c200 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
2c210 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41  c void finalizeA
2c220 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73  ggFunctions(Pars
2c230 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e  e *pParse, AggIn
2c240 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20  fo *pAggInfo){. 
2c250 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
2c260 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
2c270 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49  i;.  struct AggI
2c280 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20  nfo_func *pF;.  
2c290 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67  for(i=0, pF=pAgg
2c2a0 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70  Info->aFunc; i<p
2c2b0 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20  AggInfo->nFunc; 
2c2c0 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20  i++, pF++){.    
2c2d0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
2c2e0 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70  = pF->pExpr->x.p
2c2f0 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
2c300 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
2c310 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50  ty(pF->pExpr, EP
2c320 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
2c330 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2c340 64 4f 70 32 28 76 2c 20 4f 50 5f 41 67 67 46 69  dOp2(v, OP_AggFi
2c350 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70  nal, pF->iMem, p
2c360 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
2c370 78 70 72 20 3a 20 30 29 3b 0a 20 20 20 20 73 71  xpr : 0);.    sq
2c380 6c 69 74 65 33 56 64 62 65 41 70 70 65 6e 64 50  lite3VdbeAppendP
2c390 34 28 76 2c 20 70 46 2d 3e 70 46 75 6e 63 2c 20  4(v, pF->pFunc, 
2c3a0 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d  P4_FUNCDEF);.  }
2c3b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65  .}../*.** Update
2c3c0 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
2c3d0 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
2c3e0 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62  r an aggregate b
2c3f0 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  ased on.** the c
2c400 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
2c410 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  sition..*/.stati
2c420 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63  c void updateAcc
2c430 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
2c440 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
2c450 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
2c460 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
2c470 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
2c480 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30    int regHit = 0
2c490 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74 54  ;.  int addrHitT
2c4a0 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63  est = 0;.  struc
2c4b0 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
2c4c0 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67  pF;.  struct Agg
2c4d0 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20  Info_col *pC;.. 
2c4e0 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
2c4f0 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72  tMode = 1;.  for
2c500 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66  (i=0, pF=pAggInf
2c510 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67  o->aFunc; i<pAgg
2c520 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
2c530 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  , pF++){.    int
2c540 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20 61   nArg;.    int a
2c550 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ddrNext = 0;.   
2c560 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20 20   int regAgg;.   
2c570 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
2c580 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e   = pF->pExpr->x.
2c590 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72  pList;.    asser
2c5a0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
2c5b0 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45  rty(pF->pExpr, E
2c5c0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
2c5d0 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b      if( pList ){
2c5e0 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70 4c  .      nArg = pL
2c5f0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
2c600 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69 74    regAgg = sqlit
2c610 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
2c620 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20  Parse, nArg);.  
2c630 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2c640 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
2c650 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41 67  se, pList, regAg
2c660 67 2c 20 30 2c 20 53 51 4c 49 54 45 5f 45 43 45  g, 0, SQLITE_ECE
2c670 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73  L_DUP);.    }els
2c680 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  e{.      nArg = 
2c690 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  0;.      regAgg 
2c6a0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
2c6b0 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  f( pF->iDistinct
2c6c0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  >=0 ){.      add
2c6d0 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
2c6e0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
2c6f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
2c700 20 6e 41 72 67 3d 3d 30 20 29 3b 20 20 2f 2a 20   nArg==0 );  /* 
2c710 45 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20  Error condition 
2c720 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
2c730 65 28 20 6e 41 72 67 3e 31 20 29 3b 20 20 20 2f  e( nArg>1 );   /
2c740 2a 20 41 6c 73 6f 20 61 6e 20 65 72 72 6f 72 20  * Also an error 
2c750 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73  */.      codeDis
2c760 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46  tinct(pParse, pF
2c770 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64  ->iDistinct, add
2c780 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67  rNext, 1, regAgg
2c790 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2c7a0 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63   pF->pFunc->func
2c7b0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
2c7c0 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
2c7d0 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
2c7e0 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Coll = 0;.      
2c7f0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
2c800 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
2c810 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
2c820 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
2c830 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30   );  /* pList!=0
2c840 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61   if pF->pFunc ha
2c850 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20  s NEEDCOLL */.  
2c860 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
2c870 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43  em=pList->a; !pC
2c880 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a  oll && j<nArg; j
2c890 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2c8a0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
2c8b0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2c8c0 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
2c8d0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
2c8e0 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
2c8f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
2c900 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
2c910 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2c920 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67   }.      if( reg
2c930 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e  Hit==0 && pAggIn
2c940 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
2c950 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50   ) regHit = ++pP
2c960 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2c970 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2c980 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
2c990 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c  q, regHit, 0, 0,
2c9a0 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
2c9b0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
2c9c0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
2c9d0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41  beAddOp3(v, OP_A
2c9e0 67 67 53 74 65 70 30 2c 20 30 2c 20 72 65 67 41  ggStep0, 0, regA
2c9f0 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 29 3b 0a 20  gg, pF->iMem);. 
2ca00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 70     sqlite3VdbeAp
2ca10 70 65 6e 64 50 34 28 76 2c 20 70 46 2d 3e 70 46  pendP4(v, pF->pF
2ca20 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
2ca30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2ca40 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
2ca50 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69  )nArg);.    sqli
2ca60 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
2ca70 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
2ca80 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29  e, regAgg, nArg)
2ca90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
2caa0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
2cab0 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
2cac0 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  rg);.    if( add
2cad0 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73  rNext ){.      s
2cae0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2caf0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65  eLabel(v, addrNe
2cb00 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xt);.      sqlit
2cb10 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2cb20 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
2cb30 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65    }..  /* Before
2cb40 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20   populating the 
2cb50 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
2cb60 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65  sters, clear the
2cb70 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20   column cache.. 
2cb80 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
2cb90 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71  f any of the req
2cba0 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c  uired column val
2cbb0 75 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  ues are already 
2cbc0 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e  present .  ** in
2cbd0 20 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69   registers, sqli
2cbe0 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61  te3ExprCode() ma
2cbf0 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74  y use OP_SCopy t
2cc00 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65  o copy the value
2cc10 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65  .  ** to pC->iMe
2cc20 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20 74 69  m. But by the ti
2cc30 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  me the value is 
2cc40 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e  used, the origin
2cc50 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a  al register.  **
2cc60 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
2cc70 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e  sed, invalidatin
2cc80 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  g the underlying
2cc90 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20   buffer holding 
2cca0 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72  the.  ** text or
2ccb0 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65   blob value. See
2ccc0 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64   ticket [883034d
2ccd0 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  cb5]..  **.  ** 
2cce0 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e  Another solution
2ccf0 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61   would be to cha
2cd00 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79  nge the OP_SCopy
2cd10 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61   used to copy ca
2cd20 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73  ched.  ** values
2cd30 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a   to an OP_Copy..
2cd40 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69    */.  if( regHi
2cd50 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74  t ){.    addrHit
2cd60 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Test = sqlite3Vd
2cd70 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
2cd80 66 2c 20 72 65 67 48 69 74 29 3b 20 56 64 62 65  f, regHit); Vdbe
2cd90 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
2cda0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
2cdb0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2cdc0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d  ;.  for(i=0, pC=
2cdd0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20  pAggInfo->aCol; 
2cde0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63  i<pAggInfo->nAcc
2cdf0 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70  umulator; i++, p
2ce00 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  C++){.    sqlite
2ce10 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
2ce20 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d  , pC->pExpr, pC-
2ce30 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41  >iMem);.  }.  pA
2ce40 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
2ce50 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  de = 0;.  sqlite
2ce60 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2ce70 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61  pParse);.  if( a
2ce80 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20  ddrHitTest ){.  
2ce90 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
2cea0 70 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74  pHere(v, addrHit
2ceb0 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Test);.  }.}../*
2cec0 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65  .** Add a single
2ced0 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74   OP_Explain inst
2cee0 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56  ruction to the V
2cef0 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61  DBE to explain a
2cf00 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74   simple.** count
2cf10 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45  (*) query ("SELE
2cf20 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2cf30 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e   pTab")..*/.#ifn
2cf40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2cf50 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76  EXPLAIN.static v
2cf60 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c  oid explainSimpl
2cf70 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20  eCount(.  Parse 
2cf80 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2cf90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
2cfa0 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
2cfb0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
2cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfd0 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71  /* Table being q
2cfe0 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ueried */.  Inde
2cff0 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
2d000 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2d010 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74  ndex used to opt
2d020 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e  imize scan, or N
2d030 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ULL */.){.  if( 
2d040 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
2d050 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 43  =2 ){.    int bC
2d060 6f 76 65 72 20 3d 20 28 70 49 64 78 21 3d 30 20  over = (pIdx!=0 
2d070 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54 61  && (HasRowid(pTa
2d080 62 29 20 7c 7c 20 21 49 73 50 72 69 6d 61 72 79  b) || !IsPrimary
2d090 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 29 29  KeyIndex(pIdx)))
2d0a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2d0b0 65 45 78 70 6c 61 69 6e 28 70 50 61 72 73 65 2c  eExplain(pParse,
2d0c0 20 30 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20   0, "SCAN TABLE 
2d0d0 25 73 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20  %s%s%s",.       
2d0e0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20   pTab->zName,.  
2d0f0 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 22        bCover ? "
2d100 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e 47 20   USING COVERING 
2d110 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a 20 20  INDEX " : "",.  
2d120 20 20 20 20 20 20 62 43 6f 76 65 72 20 3f 20 70        bCover ? p
2d130 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a  Idx->zName : "".
2d140 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c      );.  }.}.#el
2d150 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  se.# define expl
2d160 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61  ainSimpleCount(a
2d170 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,b,c).#endif../*
2d180 0a 2a 2a 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  .** sqlite3WalkE
2d190 78 70 72 28 29 20 63 61 6c 6c 62 61 63 6b 20 75  xpr() callback u
2d1a0 73 65 64 20 62 79 20 68 61 76 69 6e 67 54 6f 57  sed by havingToW
2d1b0 68 65 72 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  here()..**.** If
2d1c0 20 74 68 65 20 6e 6f 64 65 20 70 61 73 73 65 64   the node passed
2d1d0 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   to the callback
2d1e0 20 69 73 20 61 20 54 4b 5f 41 4e 44 20 6e 6f 64   is a TK_AND nod
2d1f0 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 57 52  e, return .** WR
2d200 43 5f 43 6f 6e 74 69 6e 75 65 20 74 6f 20 74 65  C_Continue to te
2d210 6c 6c 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  ll sqlite3WalkEx
2d220 70 72 28 29 20 74 6f 20 69 74 65 72 61 74 65 20  pr() to iterate 
2d230 74 68 72 6f 75 67 68 20 63 68 69 6c 64 20 6e 6f  through child no
2d240 64 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  des..**.** Other
2d250 77 69 73 65 2c 20 72 65 74 75 72 6e 20 57 52 43  wise, return WRC
2d260 5f 50 72 75 6e 65 2e 20 49 6e 20 74 68 69 73 20  _Prune. In this 
2d270 63 61 73 65 2c 20 61 6c 73 6f 20 63 68 65 63 6b  case, also check
2d280 20 69 66 20 74 68 65 20 0a 2a 2a 20 73 75 62 2d   if the .** sub-
2d290 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63 68  expression match
2d2a0 65 73 20 74 68 65 20 63 72 69 74 65 72 69 61 20  es the criteria 
2d2b0 66 6f 72 20 62 65 69 6e 67 20 6d 6f 76 65 64 20  for being moved 
2d2c0 74 6f 20 74 68 65 20 57 48 45 52 45 0a 2a 2a 20  to the WHERE.** 
2d2d0 63 6c 61 75 73 65 2e 20 49 66 20 73 6f 2c 20 61  clause. If so, a
2d2e0 64 64 20 69 74 20 74 6f 20 74 68 65 20 57 48 45  dd it to the WHE
2d2f0 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20 72 65  RE clause and re
2d300 70 6c 61 63 65 20 74 68 65 20 73 75 62 2d 65 78  place the sub-ex
2d310 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 77 69 74 68  pression.** with
2d320 69 6e 20 74 68 65 20 48 41 56 49 4e 47 20 65 78  in the HAVING ex
2d330 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 61 20  pression with a 
2d340 63 6f 6e 73 74 61 6e 74 20 22 31 22 2e 0a 2a 2f  constant "1"..*/
2d350 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 76 69  .static int havi
2d360 6e 67 54 6f 57 68 65 72 65 45 78 70 72 43 62 28  ngToWhereExprCb(
2d370 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
2d380 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
2d390 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
2d3a0 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 53 65  TK_AND ){.    Se
2d3b0 6c 65 63 74 20 2a 70 53 20 3d 20 70 57 61 6c 6b  lect *pS = pWalk
2d3c0 65 72 2d 3e 75 2e 70 53 65 6c 65 63 74 3b 0a 20  er->u.pSelect;. 
2d3d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
2d3e0 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 47 72  prIsConstantOrGr
2d3f0 6f 75 70 42 79 28 70 57 61 6c 6b 65 72 2d 3e 70  oupBy(pWalker->p
2d400 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53  Parse, pExpr, pS
2d410 2d 3e 70 47 72 6f 75 70 42 79 29 20 29 7b 0a 20  ->pGroupBy) ){. 
2d420 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
2d430 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
2d440 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 45 78  se->db;.      Ex
2d450 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
2d460 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
2d470 54 4b 5f 49 4e 54 45 47 45 52 2c 20 26 73 71 6c  TK_INTEGER, &sql
2d480 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 31 5d  ite3IntTokens[1]
2d490 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2d4a0 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
2d4b0 45 78 70 72 20 2a 70 57 68 65 72 65 20 3d 20 70  Expr *pWhere = p
2d4c0 53 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20  S->pWhere;.     
2d4d0 20 20 20 53 57 41 50 28 45 78 70 72 2c 20 2a 70     SWAP(Expr, *p
2d4e0 4e 65 77 2c 20 2a 70 45 78 70 72 29 3b 0a 20 20  New, *pExpr);.  
2d4f0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
2d500 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
2d510 70 57 68 65 72 65 2c 20 70 4e 65 77 29 3b 0a 20  pWhere, pNew);. 
2d520 20 20 20 20 20 20 20 70 53 2d 3e 70 57 68 65 72         pS->pWher
2d530 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
2d540 20 20 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65    pWalker->eCode
2d550 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
2d560 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 57    }.    return W
2d570 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20  RC_Prune;.  }.  
2d580 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
2d590 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  nue;.}../*.** Tr
2d5a0 61 6e 73 66 65 72 20 65 6c 69 67 69 62 6c 65 20  ansfer eligible 
2d5b0 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 48  terms from the H
2d5c0 41 56 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  AVING clause of 
2d5d0 61 20 71 75 65 72 79 2c 20 77 68 69 63 68 20 69  a query, which i
2d5e0 73 0a 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 61  s.** processed a
2d5f0 66 74 65 72 20 67 72 6f 75 70 69 6e 67 2c 20 74  fter grouping, t
2d600 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
2d610 73 65 2c 20 77 68 69 63 68 20 69 73 20 70 72 6f  se, which is pro
2d620 63 65 73 73 65 64 20 62 65 66 6f 72 65 0a 2a 2a  cessed before.**
2d630 20 67 72 6f 75 70 69 6e 67 2e 20 46 6f 72 20 65   grouping. For e
2d640 78 61 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72  xample, the quer
2d650 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  y:.**.**   SELEC
2d660 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c 65 73  T * FROM <tables
2d670 3e 20 57 48 45 52 45 20 61 3d 3f 20 47 52 4f 55  > WHERE a=? GROU
2d680 50 20 42 59 20 62 20 48 41 56 49 4e 47 20 62 3d  P BY b HAVING b=
2d690 3f 20 41 4e 44 20 63 3d 3f 0a 2a 2a 0a 2a 2a 20  ? AND c=?.**.** 
2d6a0 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e  can be rewritten
2d6b0 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c   as:.**.**   SEL
2d6c0 45 43 54 20 2a 20 46 52 4f 4d 20 3c 74 61 62 6c  ECT * FROM <tabl
2d6d0 65 73 3e 20 57 48 45 52 45 20 61 3d 3f 20 41 4e  es> WHERE a=? AN
2d6e0 44 20 62 3d 3f 20 47 52 4f 55 50 20 42 59 20 62  D b=? GROUP BY b
2d6f0 20 48 41 56 49 4e 47 20 63 3d 3f 0a 2a 2a 0a 2a   HAVING c=?.**.*
2d700 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20  * A term of the 
2d710 48 41 56 49 4e 47 20 65 78 70 72 65 73 73 69 6f  HAVING expressio
2d720 6e 20 69 73 20 65 6c 69 67 69 62 6c 65 20 66 6f  n is eligible fo
2d730 72 20 74 72 61 6e 73 66 65 72 20 69 66 20 69 74  r transfer if it
2d740 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 65 6e 74   consists.** ent
2d750 69 72 65 6c 79 20 6f 66 20 63 6f 6e 73 74 61 6e  irely of constan
2d760 74 73 20 61 6e 64 20 65 78 70 72 65 73 73 69 6f  ts and expressio
2d770 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f  ns that are also
2d780 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
2d790 74 68 61 74 0a 2a 2a 20 75 73 65 20 74 68 65 20  that.** use the 
2d7a0 22 42 49 4e 41 52 59 22 20 63 6f 6c 6c 61 74 69  "BINARY" collati
2d7b0 6f 6e 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  on sequence..*/.
2d7c0 73 74 61 74 69 63 20 76 6f 69 64 20 68 61 76 69  static void havi
2d7d0 6e 67 54 6f 57 68 65 72 65 28 50 61 72 73 65 20  ngToWhere(Parse 
2d7e0 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
2d7f0 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57  *p){.  Walker sW
2d800 61 6c 6b 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28  alker;.  memset(
2d810 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a  &sWalker, 0, siz
2d820 65 6f 66 28 73 57 61 6c 6b 65 72 29 29 3b 0a 20  eof(sWalker));. 
2d830 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65 20   sWalker.pParse 
2d840 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 57 61 6c  = pParse;.  sWal
2d850 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63  ker.xExprCallbac
2d860 6b 20 3d 20 68 61 76 69 6e 67 54 6f 57 68 65 72  k = havingToWher
2d870 65 45 78 70 72 43 62 3b 0a 20 20 73 57 61 6c 6b  eExprCb;.  sWalk
2d880 65 72 2e 75 2e 70 53 65 6c 65 63 74 20 3d 20 70  er.u.pSelect = p
2d890 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
2d8a0 78 70 72 28 26 73 57 61 6c 6b 65 72 2c 20 70 2d  xpr(&sWalker, p-
2d8b0 3e 70 48 61 76 69 6e 67 29 3b 0a 23 69 66 20 53  >pHaving);.#if S
2d8c0 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
2d8d0 45 44 0a 20 20 69 66 28 20 73 57 61 6c 6b 65 72  ED.  if( sWalker
2d8e0 2e 65 43 6f 64 65 20 26 26 20 28 73 71 6c 69 74  .eCode && (sqlit
2d8f0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20  e3SelectTrace & 
2d900 30 78 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20  0x100)!=0 ){.   
2d910 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
2d920 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 4d 6f  00,pParse,p,("Mo
2d930 76 65 20 48 41 56 49 4e 47 20 74 65 72 6d 73 20  ve HAVING terms 
2d940 69 6e 74 6f 20 57 48 45 52 45 3a 5c 6e 22 29 29  into WHERE:\n"))
2d950 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54 72 65  ;.    sqlite3Tre
2d960 65 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70  eViewSelect(0, p
2d970 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
2d980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
2d990 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 70 54  to see if the pT
2d9a0 68 69 73 20 65 6e 74 72 79 20 6f 66 20 70 54 61  his entry of pTa
2d9b0 62 4c 69 73 74 20 69 73 20 61 20 73 65 6c 66 2d  bList is a self-
2d9c0 6a 6f 69 6e 20 6f 66 20 61 20 70 72 69 6f 72 20  join of a prior 
2d9d0 76 69 65 77 2e 0a 2a 2a 20 49 66 20 69 74 20 69  view..** If it i
2d9e0 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  s, then return t
2d9f0 68 65 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  he SrcList_item 
2da00 66 6f 72 20 74 68 65 20 70 72 69 6f 72 20 76 69  for the prior vi
2da10 65 77 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ew.  If it is no
2da20 74 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  t,.** then retur
2da30 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  n 0..*/.static s
2da40 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2da50 65 6d 20 2a 69 73 53 65 6c 66 4a 6f 69 6e 56 69  em *isSelfJoinVi
2da60 65 77 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ew(.  SrcList *p
2da70 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20  TabList,        
2da80 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
2da90 20 73 65 6c 66 2d 6a 6f 69 6e 73 20 69 6e 20 74   self-joins in t
2daa0 68 69 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  his FROM clause 
2dab0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
2dac0 69 73 74 5f 69 74 65 6d 20 2a 70 54 68 69 73 20  ist_item *pThis 
2dad0 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
2dae0 70 72 69 6f 72 20 72 65 66 65 72 65 6e 63 65 20  prior reference 
2daf0 74 6f 20 74 68 69 73 20 73 75 62 71 75 65 72 79  to this subquery
2db00 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
2db10 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2db20 74 65 6d 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  tem;.  for(pItem
2db30 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20   = pTabList->a; 
2db40 70 49 74 65 6d 3c 70 54 68 69 73 3b 20 70 49 74  pItem<pThis; pIt
2db50 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  em++){.    if( p
2db60 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  Item->pSelect==0
2db70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2db80 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 76   if( pItem->fg.v
2db90 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 20 63 6f  iaCoroutine ) co
2dba0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2dbb0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pItem->zName==0 
2dbc0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2dbd0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
2dbe0 63 6d 70 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61  cmp(pItem->zData
2dbf0 62 61 73 65 2c 20 70 54 68 69 73 2d 3e 7a 44 61  base, pThis->zDa
2dc00 74 61 62 61 73 65 29 21 3d 30 20 29 20 63 6f 6e  tabase)!=0 ) con
2dc10 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
2dc20 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70  qlite3_stricmp(p
2dc30 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 54 68  Item->zName, pTh
2dc40 69 73 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 20  is->zName)!=0 ) 
2dc50 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2dc60 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
2dc70 70 61 72 65 28 30 2c 20 0a 20 20 20 20 20 20 20  pare(0, .       
2dc80 20 20 20 70 54 68 69 73 2d 3e 70 53 65 6c 65 63     pThis->pSelec
2dc90 74 2d 3e 70 57 68 65 72 65 2c 20 70 49 74 65 6d  t->pWhere, pItem
2dca0 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72  ->pSelect->pWher
2dcb0 65 2c 20 2d 31 29 20 0a 20 20 20 20 29 7b 0a 20  e, -1) .    ){. 
2dcc0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 65 77       /* The view
2dcd0 20 77 61 73 20 6d 6f 64 69 66 69 65 64 20 62 79   was modified by
2dce0 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 74 69   some other opti
2dcf0 6d 69 7a 61 74 69 6f 6e 20 73 75 63 68 20 61 73  mization such as
2dd00 0a 20 20 20 20 20 20 2a 2a 20 70 75 73 68 44 6f  .      ** pushDo
2dd10 77 6e 57 68 65 72 65 54 65 72 6d 73 28 29 20 2a  wnWhereTerms() *
2dd20 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  /.      continue
2dd30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
2dd40 72 6e 20 70 49 74 65 6d 3b 0a 20 20 7d 0a 20 20  rn pItem;.  }.  
2dd50 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66  return 0;.}..#if
2dd60 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55 4e 54  def SQLITE_COUNT
2dd70 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a 41 54  OFVIEW_OPTIMIZAT
2dd80 49 4f 4e 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  ION./*.** Attemp
2dd90 74 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61  t to transform a
2dda0 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
2ddb0 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  rm.**.**    SELE
2ddc0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
2ddd0 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20   (SELECT x FROM 
2dde0 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  t1 UNION ALL SEL
2ddf0 45 43 54 20 79 20 46 52 4f 4d 20 74 32 29 0a 2a  ECT y FROM t2).*
2de00 2a 0a 2a 2a 20 49 6e 74 6f 20 74 68 69 73 3a 0a  *.** Into this:.
2de10 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20  **.**    SELECT 
2de20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  (SELECT count(*)
2de30 20 46 52 4f 4d 20 74 31 29 2b 28 53 45 4c 45 43   FROM t1)+(SELEC
2de40 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2de50 74 32 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 72  t2).**.** The tr
2de60 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 6c  ansformation onl
2de70 79 20 77 6f 72 6b 73 20 69 66 20 61 6c 6c 20 6f  y works if all o
2de80 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2de90 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
2dea0 20 20 2a 20 20 54 68 65 20 73 75 62 71 75 65 72    *  The subquer
2deb0 79 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  y is a UNION ALL
2dec0 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   of two or more 
2ded0 74 65 72 6d 73 0a 2a 2a 20 20 20 2a 20 20 54 68  terms.**   *  Th
2dee0 65 72 65 20 69 73 20 6e 6f 20 57 48 45 52 45 20  ere is no WHERE 
2def0 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20 48  or GROUP BY or H
2df00 41 56 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 6e  AVING clauses on
2df10 20 74 68 65 20 73 75 62 71 75 65 72 69 65 73 0a   the subqueries.
2df20 2a 2a 20 20 20 2a 20 20 54 68 65 20 6f 75 74 65  **   *  The oute
2df30 72 20 71 75 65 72 79 20 69 73 20 61 20 73 69 6d  r query is a sim
2df40 70 6c 65 20 63 6f 75 6e 74 28 2a 29 0a 2a 2a 0a  ple count(*).**.
2df50 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
2df60 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
2df70 6f 6e 20 69 73 20 75 6e 64 65 72 74 61 6b 65 6e  on is undertaken
2df80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2df90 63 6f 75 6e 74 4f 66 56 69 65 77 4f 70 74 69 6d  countOfViewOptim
2dfa0 69 7a 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  ization(Parse *p
2dfb0 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
2dfc0 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  ){.  Select *pSu
2dfd0 62 2c 20 2a 70 50 72 69 6f 72 3b 0a 20 20 45 78  b, *pPrior;.  Ex
2dfe0 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 45 78 70  pr *pExpr;.  Exp
2dff0 72 20 2a 70 43 6f 75 6e 74 3b 0a 20 20 73 71 6c  r *pCount;.  sql
2e000 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
2e010 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
2e020 46 5f 41 67 67 72 65 67 61 74 65 29 3d 3d 30 20  F_Aggregate)==0 
2e030 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a  ) return 0;   /*
2e040 20 54 68 69 73 20 69 73 20 61 6e 20 61 67 67 72   This is an aggr
2e050 65 67 61 74 65 20 2a 2f 0a 20 20 69 66 28 20 70  egate */.  if( p
2e060 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
2e070 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
2e080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e090 53 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f  Single result co
2e0a0 6c 75 6d 6e 20 2a 2f 0a 20 20 70 45 78 70 72 20  lumn */.  pExpr 
2e0b0 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
2e0c0 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ].pExpr;.  if( p
2e0d0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
2e0e0 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
2e0f0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20  rn 0;        /* 
2e100 52 65 73 75 6c 74 20 69 73 20 61 6e 20 61 67 67  Result is an agg
2e110 72 65 67 61 74 65 20 2a 2f 0a 20 20 69 66 28 20  regate */.  if( 
2e120 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
2e130 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
2e140 22 63 6f 75 6e 74 22 29 20 29 20 72 65 74 75 72  "count") ) retur
2e150 6e 20 30 3b 20 20 2f 2a 20 49 73 20 63 6f 75 6e  n 0;  /* Is coun
2e160 74 28 29 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  t() */.  if( pEx
2e170 70 72 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 20 29  pr->x.pList!=0 )
2e180 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
2e190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
2e1a0 73 74 20 62 65 20 63 6f 75 6e 74 28 2a 29 20 2a  st be count(*) *
2e1b0 2f 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63 2d  /.  if( p->pSrc-
2e1c0 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72  >nSrc!=1 ) retur
2e1d0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
2e1e0 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 74 61 62        /* One tab
2e1f0 6c 65 20 69 6e 20 46 52 4f 4d 20 20 2a 2f 0a 20  le in FROM  */. 
2e200 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pSub = p->pSrc-
2e210 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[0].pSelect;. 
2e220 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20 72   if( pSub==0 ) r
2e230 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
2e240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e250 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 69     /* The FROM i
2e260 73 20 61 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  s a subquery */.
2e270 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69    if( pSub->pPri
2e280 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  or==0 ) return 0
2e290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e2a0 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 61      /* Must be a
2e2b0 20 63 6f 6d 70 6f 75 6e 64 20 72 79 20 2a 2f 0a   compound ry */.
2e2c0 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 53    do{.    if( pS
2e2d0 75 62 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26  ub->op!=TK_ALL &
2e2e0 26 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 29  & pSub->pPrior )
2e2f0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4d   return 0;  /* M
2e300 75 73 74 20 62 65 20 55 4e 49 4f 4e 20 41 4c 4c  ust be UNION ALL
2e310 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
2e320 2d 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72  ->pWhere ) retur
2e330 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
2e340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
2e350 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
2e360 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65      if( pSub->se
2e370 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
2e380 65 67 61 74 65 20 29 20 72 65 74 75 72 6e 20 30  egate ) return 0
2e390 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6e 20  ;     /* Not an 
2e3a0 61 67 67 72 65 67 61 74 65 20 2a 2f 0a 20 20 20  aggregate */.   
2e3b0 20 70 53 75 62 20 3d 20 70 53 75 62 2d 3e 70 50   pSub = pSub->pP
2e3c0 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rior;           
2e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3e0 20 20 20 2f 2a 20 52 65 70 65 61 74 20 6f 76 65     /* Repeat ove
2e3f0 72 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20  r compound */.  
2e400 7d 77 68 69 6c 65 28 20 70 53 75 62 20 29 3b 0a  }while( pSub );.
2e410 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
2e420 68 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  h this point the
2e430 6e 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 70 65  n it is OK to pe
2e440 72 66 6f 72 6d 20 74 68 65 20 74 72 61 6e 73 66  rform the transf
2e450 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 64  ormation */..  d
2e460 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
2e470 20 20 70 43 6f 75 6e 74 20 3d 20 70 45 78 70 72    pCount = pExpr
2e480 3b 0a 20 20 70 45 78 70 72 20 3d 20 30 3b 0a 20  ;.  pExpr = 0;. 
2e490 20 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pSub = p->pSrc-
2e4a0 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[0].pSelect;. 
2e4b0 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
2e4c0 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 73 71  Select = 0;.  sq
2e4d0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
2e4e0 74 65 28 64 62 2c 20 70 2d 3e 70 53 72 63 29 3b  te(db, p->pSrc);
2e4f0 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 73 71 6c  .  p->pSrc = sql
2e500 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
2e510 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
2e520 65 6f 66 28 2a 70 2d 3e 70 53 72 63 29 29 3b 0a  eof(*p->pSrc));.
2e530 20 20 77 68 69 6c 65 28 20 70 53 75 62 20 29 7b    while( pSub ){
2e540 0a 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d  .    Expr *pTerm
2e550 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70  ;.    pPrior = p
2e560 53 75 62 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  Sub->pPrior;.   
2e570 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 3d 20   pSub->pPrior = 
2e580 30 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 4e 65  0;.    pSub->pNe
2e590 78 74 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  xt = 0;.    pSub
2e5a0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
2e5b0 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20  _Aggregate;.    
2e5c0 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
2e5d0 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a  = ~SF_Compound;.
2e5e0 20 20 20 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63      pSub->nSelec
2e5f0 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 73 71  tRow = 0;.    sq
2e600 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2e610 65 74 65 28 64 62 2c 20 70 53 75 62 2d 3e 70 45  ete(db, pSub->pE
2e620 4c 69 73 74 29 3b 0a 20 20 20 20 70 54 65 72 6d  List);.    pTerm
2e630 20 3d 20 70 50 72 69 6f 72 20 3f 20 73 71 6c 69   = pPrior ? sqli
2e640 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
2e650 43 6f 75 6e 74 2c 20 30 29 20 3a 20 70 43 6f 75  Count, 0) : pCou
2e660 6e 74 3b 0a 20 20 20 20 70 53 75 62 2d 3e 70 45  nt;.    pSub->pE
2e670 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
2e680 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
2e690 72 73 65 2c 20 30 2c 20 70 54 65 72 6d 29 3b 0a  rse, 0, pTerm);.
2e6a0 20 20 20 20 70 54 65 72 6d 20 3d 20 73 71 6c 69      pTerm = sqli
2e6b0 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
2e6c0 20 54 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30   TK_SELECT, 0, 0
2e6d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 45  );.    sqlite3PE
2e6e0 78 70 72 41 64 64 53 65 6c 65 63 74 28 70 50 61  xprAddSelect(pPa
2e6f0 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 53 75 62  rse, pTerm, pSub
2e700 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  );.    if( pExpr
2e710 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  ==0 ){.      pEx
2e720 70 72 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  pr = pTerm;.    
2e730 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78  }else{.      pEx
2e740 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
2e750 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 50 4c 55  r(pParse, TK_PLU
2e760 53 2c 20 70 54 65 72 6d 2c 20 70 45 78 70 72 29  S, pTerm, pExpr)
2e770 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62  ;.    }.    pSub
2e780 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20   = pPrior;.  }. 
2e790 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
2e7a0 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
2e7b0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
2e7c0 20 7e 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a   ~SF_Aggregate;.
2e7d0 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
2e7e0 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
2e7f0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2e800 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20  e & 0x400 ){.   
2e810 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 34   SELECTTRACE(0x4
2e820 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41 66  00,pParse,p,("Af
2e830 74 65 72 20 63 6f 75 6e 74 2d 6f 66 2d 76 69 65  ter count-of-vie
2e840 77 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 5c  w optimization:\
2e850 6e 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n"));.    sqlite
2e860 33 54 72 65 65 56 69 65 77 53 65 6c 65 63 74 28  3TreeViewSelect(
2e870 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, p, 0);.  }.#e
2e880 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 31 3b  ndif.  return 1;
2e890 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2e8a0 49 54 45 5f 43 4f 55 4e 54 4f 46 56 49 45 57 5f  ITE_COUNTOFVIEW_
2e8b0 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
2e8c0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
2e8d0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c  code for the SEL
2e8e0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69  ECT statement gi
2e8f0 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67  ven in the p arg
2e900 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  ument.  .**.** T
2e910 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 72  he results are r
2e920 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64 69 6e  eturned accordin
2e930 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63 74 44  g to the SelectD
2e940 65 73 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  est structure..*
2e950 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69  * See comments i
2e960 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f  n sqliteInt.h fo
2e970 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d  r further inform
2e980 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
2e990 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2e9a0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2e9b0 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20  errors.  If any 
2e9c0 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e  errors are.** en
2e9d0 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
2e9e0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
2e9f0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
2ea00 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73  left in.** pPars
2ea10 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
2ea20 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
2ea30 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65  oes NOT free the
2ea40 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
2ea50 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68  e passed in.  Th
2ea60 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e  e.** calling fun
2ea70 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64  ction needs to d
2ea80 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73  o that..*/.int s
2ea90 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20  qlite3Select(.  
2eaa0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
2eab0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
2eac0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
2ead0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
2eae0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2eaf0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2eb00 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
2eb10 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
2eb20 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61  Dest      /* Wha
2eb30 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
2eb40 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
2eb50 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
2eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2eb70 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
2eb80 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
2eb90 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65  WInfo;     /* Re
2eba0 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65  turn from sqlite
2ebb0 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
2ebc0 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
2ebd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2ebe0 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
2ebf0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
2ec00 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ion */.  int isA
2ec10 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gg;             
2ec20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65  /* True for sele
2ec30 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63  ct lists like "c
2ec40 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78  ount(*)" */.  Ex
2ec50 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
2ec60 20 30 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20   0;  /* List of 
2ec70 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61  columns to extra
2ec80 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ct. */.  SrcList
2ec90 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
2eca0 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
2ecb0 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d  s to select from
2ecc0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
2ecd0 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re;          /* 
2ece0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
2ecf0 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
2ed00 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
2ed10 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68  roupBy;    /* Th
2ed20 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
2ed30 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
2ed40 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69  */.  Expr *pHavi
2ed50 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng;         /* T
2ed60 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  he HAVING clause
2ed70 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
2ed80 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20  /.  int rc = 1; 
2ed90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
2eda0 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72  lue to return fr
2edb0 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
2edc0 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74   */.  DistinctCt
2edd0 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20  x sDistinct; /* 
2ede0 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63  Info on how to c
2edf0 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e 43 54  ode the DISTINCT
2ee00 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20 53 6f   keyword */.  So
2ee10 72 74 43 74 78 20 73 53 6f 72 74 3b 20 20 20 20  rtCtx sSort;    
2ee20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20       /* Info on 
2ee30 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
2ee40 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2ee50 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67  */.  AggInfo sAg
2ee60 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49  gInfo;      /* I
2ee70 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20  nformation used 
2ee80 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65  by aggregate que
2ee90 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45  ries */.  int iE
2eea0 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
2eeb0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
2eec0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75  he end of the qu
2eed0 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
2eee0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
2eef0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
2ef00 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
2ef10 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61  ExprList *pMinMa
2ef20 78 4f 72 64 65 72 42 79 20 3d 20 30 3b 20 20 2f  xOrderBy = 0;  /
2ef30 2a 20 41 64 64 65 64 20 4f 52 44 45 52 20 42 59  * Added ORDER BY
2ef40 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65   for min/max que
2ef50 72 69 65 73 20 2a 2f 0a 20 20 75 38 20 6d 69 6e  ries */.  u8 min
2ef60 4d 61 78 46 6c 61 67 3b 20 20 20 20 20 20 20 20  MaxFlag;        
2ef70 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
2ef80 20 66 6f 72 20 6d 69 6e 2f 6d 61 78 20 71 75 65   for min/max que
2ef90 72 69 65 73 20 2a 2f 0a 0a 20 20 64 62 20 3d 20  ries */..  db = 
2efa0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20  pParse->db;.  v 
2efb0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
2efc0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
2efd0 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
2efe0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
2eff0 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
2f000 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
2f010 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
2f020 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
2f030 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  ITE_SELECT, 0, 0
2f040 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b  , 0) ) return 1;
2f050 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49  .  memset(&sAggI
2f060 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  nfo, 0, sizeof(s
2f070 41 67 67 49 6e 66 6f 29 29 3b 0a 23 69 66 20 53  AggInfo));.#if S
2f080 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
2f090 45 44 0a 20 20 53 45 4c 45 43 54 54 52 41 43 45  ED.  SELECTTRACE
2f0a0 28 31 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 62  (1,pParse,p, ("b
2f0b0 65 67 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 3a  egin processing:
2f0c0 5c 6e 22 2c 20 70 50 61 72 73 65 2d 3e 61 64 64  \n", pParse->add
2f0d0 72 45 78 70 6c 61 69 6e 29 29 3b 0a 20 20 69 66  rExplain));.  if
2f0e0 28 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54  ( sqlite3SelectT
2f0f0 72 61 63 65 20 26 20 30 78 31 30 30 20 29 7b 0a  race & 0x100 ){.
2f100 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56      sqlite3TreeV
2f110 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20  iewSelect(0, p, 
2f120 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  0);.  }.#endif..
2f130 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
2f140 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
2f150 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69  t->eDest!=SRT_Di
2f160 73 74 46 69 66 6f 20 29 3b 0a 20 20 61 73 73 65  stFifo );.  asse
2f170 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  rt( p->pOrderBy=
2f180 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  =0 || pDest->eDe
2f190 73 74 21 3d 53 52 54 5f 46 69 66 6f 20 29 3b 0a  st!=SRT_Fifo );.
2f1a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
2f1b0 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 44 65 73  derBy==0 || pDes
2f1c0 74 2d 3e 65 44 65 73 74 21 3d 53 52 54 5f 44 69  t->eDest!=SRT_Di
2f1d0 73 74 51 75 65 75 65 20 29 3b 0a 20 20 61 73 73  stQueue );.  ass
2f1e0 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
2f1f0 3d 3d 30 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  ==0 || pDest->eD
2f200 65 73 74 21 3d 53 52 54 5f 51 75 65 75 65 20 29  est!=SRT_Queue )
2f210 3b 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  ;.  if( Ignorabl
2f220 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
2f230 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44  ){.    assert(pD
2f240 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2f250 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d  Exists || pDest-
2f260 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f  >eDest==SRT_Unio
2f270 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  n || .          
2f280 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2f290 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65  RT_Except || pDe
2f2a0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
2f2b0 69 73 63 61 72 64 20 7c 7c 0a 20 20 20 20 20 20  iscard ||.      
2f2c0 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73       pDest->eDes
2f2d0 74 3d 3d 53 52 54 5f 51 75 65 75 65 20 20 7c 7c  t==SRT_Queue  ||
2f2e0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
2f2f0 52 54 5f 44 69 73 74 46 69 66 6f 20 7c 7c 0a 20  RT_DistFifo ||. 
2f300 20 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d            pDest-
2f310 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74  >eDest==SRT_Dist
2f320 51 75 65 75 65 20 7c 7c 20 70 44 65 73 74 2d 3e  Queue || pDest->
2f330 65 44 65 73 74 3d 3d 53 52 54 5f 46 69 66 6f 29  eDest==SRT_Fifo)
2f340 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45  ;.    /* If ORDE
2f350 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69  R BY makes no di
2f360 66 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20  fference in the 
2f370 6f 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74  output then neit
2f380 68 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20  her does.    ** 
2f390 44 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63  DISTINCT so it c
2f3a0 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f  an be removed to
2f3b0 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  o. */.    sqlite
2f3c0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
2f3d0 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29  db, p->pOrderBy)
2f3e0 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
2f3f0 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65  y = 0;.    p->se
2f400 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
2f410 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71  stinct;.  }.  sq
2f420 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
2f430 70 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20  pParse, p, 0);. 
2f440 20 6d 65 6d 73 65 74 28 26 73 53 6f 72 74 2c 20   memset(&sSort, 
2f450 30 2c 20 73 69 7a 65 6f 66 28 73 53 6f 72 74 29  0, sizeof(sSort)
2f460 29 3b 0a 20 20 73 53 6f 72 74 2e 70 4f 72 64 65  );.  sSort.pOrde
2f470 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
2f480 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  y;.  pTabList = 
2f490 70 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70  p->pSrc;.  if( p
2f4a0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
2f4b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2f4c0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
2f4d0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 61 73  ct_end;.  }.  as
2f4e0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 21  sert( p->pEList!
2f4f0 3d 30 20 29 3b 0a 20 20 69 73 41 67 67 20 3d 20  =0 );.  isAgg = 
2f500 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
2f510 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b  F_Aggregate)!=0;
2f520 0a 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45  .#if SELECTTRACE
2f530 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
2f540 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
2f550 65 20 26 20 30 78 31 30 34 20 29 7b 0a 20 20 20  e & 0x104 ){.   
2f560 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78 31   SELECTTRACE(0x1
2f570 30 34 2c 70 50 61 72 73 65 2c 70 2c 20 28 22 61  04,pParse,p, ("a
2f580 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75  fter name resolu
2f590 74 69 6f 6e 3a 5c 6e 22 29 29 3b 0a 20 20 20 20  tion:\n"));.    
2f5a0 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77 53  sqlite3TreeViewS
2f5b0 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a  elect(0, p, 0);.
2f5c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
2f5d0 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
2f5e0 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
2f5f0 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
2f600 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
2f610 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 72 79 20  ;.  }..  /* Try 
2f620 74 6f 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d  to various optim
2f630 69 7a 61 74 69 6f 6e 73 20 28 66 6c 61 74 74 65  izations (flatte
2f640 6e 69 6e 67 20 73 75 62 71 75 65 72 69 65 73 2c  ning subqueries,
2f650 20 61 6e 64 20 73 74 72 65 6e 67 74 68 0a 20 20   and strength.  
2f660 2a 2a 20 72 65 64 75 63 74 69 6f 6e 20 6f 66 20  ** reduction of 
2f670 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 29 20  join operators) 
2f680 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2f690 73 65 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6d  se up into the m
2f6a0 61 69 6e 20 71 75 65 72 79 0a 20 20 2a 2f 0a 23  ain query.  */.#
2f6b0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2f6c0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
2f6d0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
2f6e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
2f6f0 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70    for(i=0; !p->p
2f700 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c  Prior && i<pTabL
2f710 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
2f720 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
2f730 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
2f740 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
2f750 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ];.    Select *p
2f760 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65  Sub = pItem->pSe
2f770 6c 65 63 74 3b 0a 20 20 20 20 54 61 62 6c 65 20  lect;.    Table 
2f780 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pTab = pItem->p
2f790 54 61 62 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  Tab;..    /* Con
2f7a0 76 65 72 74 20 4c 45 46 54 20 4a 4f 49 4e 20 69  vert LEFT JOIN i
2f7b0 6e 74 6f 20 4a 4f 49 4e 20 69 66 20 74 68 65 72  nto JOIN if ther
2f7c0 65 20 61 72 65 20 74 65 72 6d 73 20 6f 66 20 74  e are terms of t
2f7d0 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 0a 20  he right table. 
2f7e0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 4c 45 46     ** of the LEF
2f7f0 54 20 4a 4f 49 4e 20 75 73 65 64 20 69 6e 20 74  T JOIN used in t
2f800 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
2f810 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2f820 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pItem->fg.joint
2f830 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
2f840 30 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  0.     && sqlite
2f850 33 45 78 70 72 49 6d 70 6c 69 65 73 4e 6f 6e 4e  3ExprImpliesNonN
2f860 75 6c 6c 52 6f 77 28 70 2d 3e 70 57 68 65 72 65  ullRow(p->pWhere
2f870 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
2f880 29 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69  ).     && Optimi
2f890 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
2f8a0 2c 20 53 51 4c 49 54 45 5f 53 69 6d 70 6c 69 66  , SQLITE_Simplif
2f8b0 79 4a 6f 69 6e 29 0a 20 20 20 20 29 7b 0a 20 20  yJoin).    ){.  
2f8c0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
2f8d0 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 0a  0x100,pParse,p,.
2f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8f0 28 22 4c 45 46 54 2d 4a 4f 49 4e 20 73 69 6d 70  ("LEFT-JOIN simp
2f900 6c 69 66 69 65 73 20 74 6f 20 4a 4f 49 4e 20 6f  lifies to JOIN o
2f910 6e 20 74 65 72 6d 20 25 64 5c 6e 22 2c 69 29 29  n term %d\n",i))
2f920 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66  ;.      pItem->f
2f930 67 2e 6a 6f 69 6e 74 79 70 65 20 26 3d 20 7e 28  g.jointype &= ~(
2f940 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52  JT_LEFT|JT_OUTER
2f950 29 3b 0a 20 20 20 20 20 20 75 6e 73 65 74 4a 6f  );.      unsetJo
2f960 69 6e 45 78 70 72 28 70 2d 3e 70 57 68 65 72 65  inExpr(p->pWhere
2f970 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
2f980 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
2f990 20 4e 6f 20 66 75 74 68 65 72 20 61 63 74 69 6f   No futher actio
2f9a0 6e 20 69 66 20 74 68 69 73 20 74 65 72 6d 20 6f  n if this term o
2f9b0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
2f9c0 65 20 69 73 20 6e 6f 20 61 20 73 75 62 71 75 65  e is no a subque
2f9d0 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53  ry */.    if( pS
2f9e0 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ub==0 ) continue
2f9f0 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 74 63 68 20  ;..    /* Catch 
2fa00 6d 69 73 6d 61 74 63 68 20 69 6e 20 74 68 65 20  mismatch in the 
2fa10 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 73  declared columns
2fa20 20 6f 66 20 61 20 76 69 65 77 20 61 6e 64 20 74   of a view and t
2fa30 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
2fa40 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   ** columns in t
2fa50 68 65 20 53 45 4c 45 43 54 20 6f 6e 20 74 68 65  he SELECT on the
2fa60 20 52 48 53 20 2a 2f 0a 20 20 20 20 69 66 28 20   RHS */.    if( 
2fa70 70 54 61 62 2d 3e 6e 43 6f 6c 21 3d 70 53 75 62  pTab->nCol!=pSub
2fa80 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
2fa90 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2faa0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2fab0 20 22 65 78 70 65 63 74 65 64 20 25 64 20 63 6f   "expected %d co
2fac0 6c 75 6d 6e 73 20 66 6f 72 20 27 25 73 27 20 62  lumns for '%s' b
2fad0 75 74 20 67 6f 74 20 25 64 22 2c 0a 20 20 20 20  ut got %d",.    
2fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2faf0 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54    pTab->nCol, pT
2fb00 61 62 2d 3e 7a 4e 61 6d 65 2c 20 70 53 75 62 2d  ab->zName, pSub-
2fb10 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
2fb20 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
2fb30 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 0a 20  ct_end;.    }.. 
2fb40 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 74 72 79     /* Do not try
2fb50 20 74 6f 20 66 6c 61 74 74 65 6e 20 61 6e 20 61   to flatten an a
2fb60 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
2fb70 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
2fb80 20 46 6c 61 74 74 65 6e 69 6e 67 20 61 6e 20 61   Flattening an a
2fb90 67 67 72 65 67 61 74 65 20 73 75 62 71 75 65 72  ggregate subquer
2fba0 79 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62  y is only possib
2fbb0 6c 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20  le if the outer 
2fbc0 71 75 65 72 79 0a 20 20 20 20 2a 2a 20 69 73 20  query.    ** is 
2fbd0 6e 6f 74 20 61 20 6a 6f 69 6e 2e 20 20 42 75 74  not a join.  But
2fbe0 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   if the outer qu
2fbf0 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
2fc00 6e 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 71  n, then the subq
2fc10 75 65 72 79 0a 20 20 20 20 2a 2a 20 77 69 6c 6c  uery.    ** will
2fc20 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   be implemented 
2fc30 61 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20  as a co-routine 
2fc40 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
2fc50 61 64 76 61 6e 74 61 67 65 20 74 6f 0a 20 20 20  advantage to.   
2fc60 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   ** flattening i
2fc70 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
2fc80 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 53 75   */.    if( (pSu
2fc90 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
2fca0 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 20 29  _Aggregate)!=0 )
2fcb0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
2fcc0 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 47 72  ssert( pSub->pGr
2fcd0 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20  oupBy==0 );..   
2fce0 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 65 72   /* If the outer
2fcf0 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20   query contains 
2fd00 61 20 22 63 6f 6d 70 6c 65 78 22 20 72 65 73 75  a "complex" resu
2fd10 6c 74 20 73 65 74 20 28 74 68 61 74 20 69 73 2c  lt set (that is,
2fd20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 72  .    ** if the r
2fd30 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
2fd40 20 6f 75 74 65 72 20 71 75 65 72 79 20 75 73 65   outer query use
2fd50 73 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 73  s functions or s
2fd60 75 62 71 75 65 72 69 65 73 29 0a 20 20 20 20 2a  ubqueries).    *
2fd70 2a 20 61 6e 64 20 69 66 20 74 68 65 20 73 75 62  * and if the sub
2fd80 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73 20 61  query contains a
2fd90 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
2fda0 65 20 61 6e 64 20 69 66 0a 20 20 20 20 2a 2a 20  e and if.    ** 
2fdb0 69 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 65  it will be imple
2fdc0 6d 65 6e 74 65 64 20 61 73 20 61 20 63 6f 2d 72  mented as a co-r
2fdd0 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 64 6f 20  outine, then do 
2fde0 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 20 20 54 68  not flatten.  Th
2fdf0 69 73 0a 20 20 20 20 2a 2a 20 72 65 73 74 72 69  is.    ** restri
2fe00 63 74 69 6f 6e 20 61 6c 6c 6f 77 73 20 53 51 4c  ction allows SQL
2fe10 20 63 6f 6e 73 74 72 75 63 74 73 20 6c 69 6b 65   constructs like
2fe20 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
2fe30 20 20 2a 2a 20 20 53 45 4c 45 43 54 20 65 78 70    **  SELECT exp
2fe40 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28  ensive_function(
2fe50 78 29 0a 20 20 20 20 2a 2a 20 20 20 20 46 52 4f  x).    **    FRO
2fe60 4d 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  M (SELECT x FROM
2fe70 20 74 61 62 20 4f 52 44 45 52 20 42 59 20 79 20   tab ORDER BY y 
2fe80 4c 49 4d 49 54 20 31 30 29 3b 0a 20 20 20 20 2a  LIMIT 10);.    *
2fe90 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 78 70  *.    ** The exp
2fea0 65 6e 73 69 76 65 5f 66 75 6e 63 74 69 6f 6e 28  ensive_function(
2feb0 29 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 75 74  ) is only comput
2fec0 65 64 20 6f 6e 20 74 68 65 20 31 30 20 72 6f 77  ed on the 10 row
2fed0 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 72  s that.    ** ar
2fee0 65 20 6f 75 74 70 75 74 2c 20 72 61 74 68 65 72  e output, rather
2fef0 20 74 68 61 6e 20 65 76 65 72 79 20 72 6f 77 20   than every row 
2ff00 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  of the table..  
2ff10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2ff20 72 65 71 75 69 72 65 6d 65 6e 74 20 74 68 61 74  requirement that
2ff30 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
2ff40 20 68 61 76 65 20 61 20 63 6f 6d 70 6c 65 78 20   have a complex 
2ff50 72 65 73 75 6c 74 20 73 65 74 0a 20 20 20 20 2a  result set.    *
2ff60 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 66 6c 61  * means that fla
2ff70 74 74 65 6e 69 6e 67 20 64 6f 65 73 20 6f 63 63  ttening does occ
2ff80 75 72 20 6f 6e 20 73 69 6d 70 6c 65 72 20 53 51  ur on simpler SQ
2ff90 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69  L constraints wi
2ffa0 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 74 68 65  thout.    ** the
2ffb0 20 65 78 70 65 6e 73 69 76 65 5f 66 75 6e 63 74   expensive_funct
2ffc0 69 6f 6e 28 29 20 6c 69 6b 65 3a 0a 20 20 20 20  ion() like:.    
2ffd0 2a 2a 0a 20 20 20 20 2a 2a 20 20 53 45 4c 45 43  **.    **  SELEC
2ffe0 54 20 78 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  T x FROM (SELECT
2fff0 20 78 20 46 52 4f 4d 20 74 61 62 20 4f 52 44 45   x FROM tab ORDE
30000 52 20 42 59 20 79 20 4c 49 4d 49 54 20 31 30 29  R BY y LIMIT 10)
30010 3b 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ;.    */.    if(
30020 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 21   pSub->pOrderBy!
30030 3d 30 0a 20 20 20 20 20 26 26 20 69 3d 3d 30 0a  =0.     && i==0.
30040 20 20 20 20 20 26 26 20 28 70 2d 3e 73 65 6c 46       && (p->selF
30050 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70 6c 65  lags & SF_Comple
30060 78 52 65 73 75 6c 74 29 21 3d 30 0a 20 20 20 20  xResult)!=0.    
30070 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e   && (pTabList->n
30080 53 72 63 3d 3d 31 0a 20 20 20 20 20 20 20 20 20  Src==1.         
30090 7c 7c 20 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b  || (pTabList->a[
300a0 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 26 28  1].fg.jointype&(
300b0 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
300c0 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ))!=0).    ){.  
300d0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
300e0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 66 6c 61    }..    if( fla
300f0 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
30100 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67  rse, p, i, isAgg
30110 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
30120 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e 20  is subquery can 
30130 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74 6f  be absorbed into
30140 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a   its parent. */.
30150 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20        i = -1;.  
30160 20 20 7d 0a 20 20 20 20 70 54 61 62 4c 69 73 74    }.    pTabList
30170 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
30180 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
30190 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
301a0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20  ct_end;.    if( 
301b0 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62  !IgnorableOrderb
301c0 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
301d0 20 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79    sSort.pOrderBy
301e0 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
301f0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
30200 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
30210 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
30220 45 4c 45 43 54 0a 20 20 2f 2a 20 48 61 6e 64 6c  ELECT.  /* Handl
30230 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
30240 54 20 73 74 61 74 65 6d 65 6e 74 73 20 75 73 69  T statements usi
30250 6e 67 20 74 68 65 20 73 65 70 61 72 61 74 65 20  ng the separate 
30260 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 0a 20 20  multiSelect().  
30270 2a 2a 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 20  ** procedure..  
30280 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
30290 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d  or ){.    rc = m
302a0 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
302b0 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 23 69  e, p, pDest);.#i
302c0 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
302d0 41 42 4c 45 44 0a 20 20 20 20 53 45 4c 45 43 54  ABLED.    SELECT
302e0 54 52 41 43 45 28 30 78 31 2c 70 50 61 72 73 65  TRACE(0x1,pParse
302f0 2c 70 2c 28 22 65 6e 64 20 63 6f 6d 70 6f 75 6e  ,p,("end compoun
30300 64 2d 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73  d-select process
30310 69 6e 67 5c 6e 22 29 29 3b 0a 20 20 20 20 69 66  ing\n"));.    if
30320 28 20 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ( (sqlite3Select
30330 54 72 61 63 65 20 26 20 30 78 32 30 30 30 29 21  Trace & 0x2000)!
30340 3d 30 20 26 26 20 45 78 70 6c 61 69 6e 51 75 65  =0 && ExplainQue
30350 72 79 50 6c 61 6e 50 61 72 65 6e 74 28 70 50 61  ryPlanParent(pPa
30360 72 73 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rse)==0 ){.     
30370 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
30380 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30 29 3b  Select(0, p, 0);
30390 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
303a0 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 3d 3d    if( p->pNext==
303b0 30 20 29 20 45 78 70 6c 61 69 6e 51 75 65 72 79  0 ) ExplainQuery
303c0 50 6c 61 6e 50 6f 70 28 70 50 61 72 73 65 29 3b  PlanPop(pParse);
303d0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
303e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
303f0 20 46 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69   For each term i
30400 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
30410 65 2c 20 64 6f 20 74 77 6f 20 74 68 69 6e 67 73  e, do two things
30420 3a 0a 20 20 2a 2a 20 28 31 29 20 41 75 74 68 6f  :.  ** (1) Autho
30430 72 69 7a 65 64 20 75 6e 72 65 66 65 72 65 6e 63  rized unreferenc
30440 65 64 20 74 61 62 6c 65 73 0a 20 20 2a 2a 20 28  ed tables.  ** (
30450 32 29 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  2) Generate code
30460 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65   for all sub-que
30470 72 69 65 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ries.  */.  for(
30480 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
30490 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
304a0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
304b0 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
304c0 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  TabList->a[i];. 
304d0 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
304e0 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  st;.    Select *
304f0 70 53 75 62 3b 0a 23 69 66 20 21 64 65 66 69 6e  pSub;.#if !defin
30500 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
30510 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
30520 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
30530 5f 56 49 45 57 29 0a 20 20 20 20 63 6f 6e 73 74  _VIEW).    const
30540 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75 74   char *zSavedAut
30550 68 43 6f 6e 74 65 78 74 3b 0a 23 65 6e 64 69 66  hContext;.#endif
30560 0a 0a 20 20 20 20 2f 2a 20 49 73 73 75 65 20 53  ..    /* Issue S
30570 51 4c 49 54 45 5f 52 45 41 44 20 61 75 74 68 6f  QLITE_READ autho
30580 72 69 7a 61 74 69 6f 6e 73 20 77 69 74 68 20 61  rizations with a
30590 20 66 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d   fake column nam
305a0 65 20 66 6f 72 20 61 6e 79 0a 20 20 20 20 2a 2a  e for any.    **
305b0 20 74 61 62 6c 65 73 20 74 68 61 74 20 61 72 65   tables that are
305c0 20 72 65 66 65 72 65 6e 63 65 64 20 62 75 74 20   referenced but 
305d0 66 72 6f 6d 20 77 68 69 63 68 20 6e 6f 20 76 61  from which no va
305e0 6c 75 65 73 20 61 72 65 20 65 78 74 72 61 63 74  lues are extract
305f0 65 64 2e 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ed..    ** Examp
30600 6c 65 73 20 6f 66 20 77 68 65 72 65 20 74 68 65  les of where the
30610 73 65 20 6b 69 6e 64 73 20 6f 66 20 6e 75 6c 6c  se kinds of null
30620 20 53 51 4c 49 54 45 5f 52 45 41 44 20 61 75 74   SQLITE_READ aut
30630 68 6f 72 69 7a 61 74 69 6f 6e 73 0a 20 20 20 20  horizations.    
30640 2a 2a 20 77 6f 75 6c 64 20 6f 63 63 75 72 3a 0a  ** would occur:.
30650 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
30660 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
30670 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20  ) FROM t1;   -- 
30680 53 51 4c 49 54 45 5f 52 45 41 44 20 74 31 2e 22  SQLITE_READ t1."
30690 22 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c  ".    **     SEL
306a0 45 43 54 20 74 31 2e 2a 20 46 52 4f 4d 20 74 31  ECT t1.* FROM t1
306b0 2c 20 74 32 3b 20 20 20 2d 2d 20 53 51 4c 49 54  , t2;   -- SQLIT
306c0 45 5f 52 45 41 44 20 74 32 2e 22 22 0a 20 20 20  E_READ t2."".   
306d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   **.    ** The f
306e0 61 6b 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ake column name 
306f0 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  is an empty stri
30700 6e 67 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69  ng.  It is possi
30710 62 6c 65 20 66 6f 72 20 61 20 74 61 62 6c 65 20  ble for a table 
30720 74 6f 0a 20 20 20 20 2a 2a 20 68 61 76 65 20 61  to.    ** have a
30730 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 62 79   column named by
30740 20 74 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e   the empty strin
30750 67 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  g, in which case
30760 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
30770 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 74 69   to.    ** disti
30780 6e 67 75 69 73 68 20 62 65 74 77 65 65 6e 20 61  nguish between a
30790 6e 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 74  n unreferenced t
307a0 61 62 6c 65 20 61 6e 64 20 61 6e 20 61 63 74 75  able and an actu
307b0 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  al reference to 
307c0 74 68 65 0a 20 20 20 20 2a 2a 20 22 22 20 63 6f  the.    ** "" co
307d0 6c 75 6d 6e 2e 20 54 68 65 20 6f 72 69 67 69 6e  lumn. The origin
307e0 61 6c 20 64 65 73 69 67 6e 20 77 61 73 20 66 6f  al design was fo
307f0 72 20 74 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d  r the fake colum
30800 6e 20 6e 61 6d 65 20 74 6f 20 62 65 20 61 20 4e  n name to be a N
30810 55 4c 4c 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63  ULL,.    ** whic
30820 68 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 6d 62  h would be unamb
30830 69 67 75 6f 75 73 2e 20 20 42 75 74 20 6c 65 67  iguous.  But leg
30840 61 63 79 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  acy authorizatio
30850 6e 20 63 61 6c 6c 62 61 63 6b 73 20 6d 69 67 68  n callbacks migh
30860 74 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 20  t.    ** assume 
30870 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
30880 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 6e 64 20  is non-NULL and 
30890 73 65 67 66 61 75 6c 74 2e 20 20 54 68 65 20 75  segfault.  The u
308a0 73 65 20 6f 66 20 61 6e 20 65 6d 70 74 79 0a 20  se of an empty. 
308b0 20 20 20 2a 2a 20 73 74 72 69 6e 67 20 66 6f 72     ** string for
308c0 20 74 68 65 20 66 61 6b 65 20 63 6f 6c 75 6d 6e   the fake column
308d0 20 6e 61 6d 65 20 73 65 65 6d 73 20 73 61 66 65   name seems safe
308e0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
308f0 28 20 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  ( pItem->colUsed
30900 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
30910 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
30920 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 41  arse, SQLITE_REA
30930 44 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c  D, pItem->zName,
30940 20 22 22 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74   "", pItem->zDat
30950 61 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23  abase);.    }..#
30960 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
30970 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
30980 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
30990 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
309a0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
309b0 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
309c0 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  -queries in the 
309d0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20  FROM clause.    
309e0 2a 2f 0a 20 20 20 20 70 53 75 62 20 3d 20 70 49  */.    pSub = pI
309f0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
30a00 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20    if( pSub==0 ) 
30a10 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
30a20 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20  * Sometimes the 
30a30 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71 75  code for a subqu
30a40 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65  ery will be gene
30a50 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a  rated more than.
30a60 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20      ** once, if 
30a70 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
30a80 70 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52  part of the WHER
30a90 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45  E clause in a LE
30aa0 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20  FT JOIN,.    ** 
30ab0 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e  for example.  In
30ac0 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e   that case, do n
30ad0 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20 74 68  ot regenerate th
30ae0 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65  e code to manife
30af0 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77  st.    ** a view
30b00 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69   or the co-routi
30b10 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ne to implement 
30b20 61 20 76 69 65 77 2e 20 20 54 68 65 20 66 69 72  a view.  The fir
30b30 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20  st instance.    
30b40 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  ** is sufficient
30b50 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73 75 62  , though the sub
30b60 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66  routine to manif
30b70 65 73 74 20 74 68 65 20 76 69 65 77 20 64 6f 65  est the view doe
30b80 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  s need.    ** to
30b90 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69   be invoked agai
30ba0 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49  n. */.    if( pI
30bb0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
30bc0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49   ){.      if( pI
30bd0 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75  tem->fg.viaCorou
30be0 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tine==0 ){.     
30bf0 20 20 20 2f 2a 20 54 68 65 20 73 75 62 72 6f 75     /* The subrou
30c00 74 69 6e 65 20 74 68 61 74 20 6d 61 6e 69 66 65  tine that manife
30c10 73 74 73 20 74 68 65 20 76 69 65 77 20 6d 69 67  sts the view mig
30c20 68 74 20 62 65 20 61 20 6f 6e 65 2d 74 69 6d 65  ht be a one-time
30c30 20 72 6f 75 74 69 6e 65 2c 0a 20 20 20 20 20 20   routine,.      
30c40 20 20 2a 2a 20 6f 72 20 69 74 20 6d 69 67 68 74    ** or it might
30c50 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 72 75   need to be reru
30c60 6e 20 6f 6e 20 65 61 63 68 20 69 74 65 72 61 74  n on each iterat
30c70 69 6f 6e 20 62 65 63 61 75 73 65 20 69 74 0a 20  ion because it. 
30c80 20 20 20 20 20 20 20 2a 2a 20 65 6e 63 6f 64 65         ** encode
30c90 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
30ca0 75 62 71 75 65 72 79 2e 20 2a 2f 0a 20 20 20 20  ubquery. */.    
30cb0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 71      testcase( sq
30cc0 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
30cd0 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c  , pItem->addrFil
30ce0 6c 53 75 62 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  lSub)->opcode==O
30cf0 50 5f 4f 6e 63 65 20 29 3b 0a 20 20 20 20 20 20  P_Once );.      
30d00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
30d10 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
30d20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
30d30 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  n, pItem->addrFi
30d40 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a  llSub);.      }.
30d50 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
30d60 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e      }..    /* In
30d70 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48  crement Parse.nH
30d80 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65 69  eight by the hei
30d90 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65  ght of the large
30da0 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  st expression.  
30db0 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72    ** tree referr
30dc0 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74  ed to by this, t
30dd0 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74  he parent select
30de0 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65  . The child sele
30df0 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f  ct.    ** may co
30e00 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  ntain expression
30e10 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73   trees of at mos
30e20 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45  t.    ** (SQLITE
30e30 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d  _MAX_EXPR_DEPTH-
30e40 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68  Parse.nHeight) h
30e50 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20 61  eight. This is a
30e60 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65   bit.    ** more
30e70 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68   conservative th
30e80 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75  an necessary, bu
30e90 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 68  t much easier th
30ea0 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20  an enforcing.   
30eb0 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d   ** an exact lim
30ec0 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  it..    */.    p
30ed0 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b  Parse->nHeight +
30ee0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
30ef0 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20  xprHeight(p);.. 
30f00 20 20 20 2f 2a 20 4d 61 6b 65 20 63 6f 70 69 65     /* Make copie
30f10 73 20 6f 66 20 63 6f 6e 73 74 61 6e 74 20 57 48  s of constant WH
30f20 45 52 45 2d 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE-clause terms
30f30 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   in the outer qu
30f40 65 72 79 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20  ery down.    ** 
30f50 69 6e 73 69 64 65 20 74 68 65 20 73 75 62 71 75  inside the subqu
30f60 65 72 79 2e 20 20 54 68 69 73 20 63 61 6e 20 68  ery.  This can h
30f70 65 6c 70 20 74 68 65 20 73 75 62 71 75 65 72 79  elp the subquery
30f80 20 74 6f 20 72 75 6e 20 6d 6f 72 65 20 65 66 66   to run more eff
30f90 69 63 69 65 6e 74 6c 79 2e 0a 20 20 20 20 2a 2f  iciently..    */
30fa0 0a 20 20 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  .    if( Optimiz
30fb0 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
30fc0 20 53 51 4c 49 54 45 5f 50 75 73 68 44 6f 77 6e   SQLITE_PushDown
30fd0 29 0a 20 20 20 20 20 26 26 20 70 75 73 68 44 6f  ).     && pushDo
30fe0 77 6e 57 68 65 72 65 54 65 72 6d 73 28 70 50 61  wnWhereTerms(pPa
30ff0 72 73 65 2c 20 70 53 75 62 2c 20 70 2d 3e 70 57  rse, pSub, p->pW
31000 68 65 72 65 2c 20 70 49 74 65 6d 2d 3e 69 43 75  here, pItem->iCu
31010 72 73 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20  rsor,.          
31020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31030 20 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e   (pItem->fg.join
31040 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
31050 21 3d 30 29 0a 20 20 20 20 29 7b 0a 23 69 66 20  !=0).    ){.#if 
31060 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
31070 4c 45 44 0a 20 20 20 20 20 20 69 66 28 20 73 71  LED.      if( sq
31080 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
31090 20 26 20 30 78 31 30 30 20 29 7b 0a 20 20 20 20   & 0x100 ){.    
310a0 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28      SELECTTRACE(
310b0 30 78 31 30 30 2c 70 50 61 72 73 65 2c 70 2c 28  0x100,pParse,p,(
310c0 22 41 66 74 65 72 20 57 48 45 52 45 2d 63 6c 61  "After WHERE-cla
310d0 75 73 65 20 70 75 73 68 2d 64 6f 77 6e 3a 5c 6e  use push-down:\n
310e0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  "));.        sql
310f0 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65  ite3TreeViewSele
31100 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 20  ct(0, p, 0);.   
31110 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
31120 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 53 45 4c  }else{.      SEL
31130 45 43 54 54 52 41 43 45 28 30 78 31 30 30 2c 70  ECTTRACE(0x100,p
31140 50 61 72 73 65 2c 70 2c 28 22 50 75 73 68 2d 64  Parse,p,("Push-d
31150 6f 77 6e 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  own not possible
31160 5c 6e 22 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  \n"));.    }..  
31170 20 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74    zSavedAuthCont
31180 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
31190 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
311a0 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
311b0 74 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e  text = pItem->zN
311c0 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e  ame;..    /* Gen
311d0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 69 6d  erate code to im
311e0 70 6c 65 6d 65 6e 74 20 74 68 65 20 73 75 62 71  plement the subq
311f0 75 65 72 79 0a 20 20 20 20 2a 2a 0a 20 20 20 20  uery.    **.    
31200 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
31210 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
31220 73 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69  s a co-routine i
31230 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
31240 73 0a 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74  s.    ** guarant
31250 65 65 64 20 74 6f 20 62 65 20 74 68 65 20 6f 75  eed to be the ou
31260 74 65 72 20 6c 6f 6f 70 20 28 73 6f 20 74 68 61  ter loop (so tha
31270 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  t it does not ne
31280 65 64 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ed to be.    ** 
31290 63 6f 6d 70 75 74 65 64 20 6d 6f 72 65 20 74 68  computed more th
312a0 61 6e 20 6f 6e 63 65 29 0a 20 20 20 20 2a 2a 0a  an once).    **.
312b0 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 41 72 65      ** TODO: Are
312c0 20 74 68 65 72 65 20 6f 74 68 65 72 20 72 65 61   there other rea
312d0 73 6f 6e 73 20 62 65 73 69 64 65 20 28 31 29 20  sons beside (1) 
312e0 74 6f 20 75 73 65 20 61 20 63 6f 2d 72 6f 75 74  to use a co-rout
312f0 69 6e 65 0a 20 20 20 20 2a 2a 20 69 6d 70 6c 65  ine.    ** imple
31300 6d 65 6e 74 61 74 69 6f 6e 3f 0a 20 20 20 20 2a  mentation?.    *
31310 2f 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 0a 20  /.    if( i==0. 
31320 20 20 20 20 26 26 20 28 70 54 61 62 4c 69 73 74      && (pTabList
31330 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20 20  ->nSrc==1.      
31340 20 20 20 20 20 20 7c 7c 20 28 70 54 61 62 4c 69        || (pTabLi
31350 73 74 2d 3e 61 5b 31 5d 2e 66 67 2e 6a 6f 69 6e  st->a[1].fg.join
31360 74 79 70 65 26 28 4a 54 5f 4c 45 46 54 7c 4a 54  type&(JT_LEFT|JT
31370 5f 43 52 4f 53 53 29 29 21 3d 30 29 20 20 2f 2a  _CROSS))!=0)  /*
31380 20 28 31 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20   (1) */.    ){. 
31390 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e       /* Implemen
313a0 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  t a co-routine t
313b0 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  hat will return 
313c0 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
313d0 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
313e0 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20   ** set on each 
313f0 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20  invocation..    
31400 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61    */.      int a
31410 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
31420 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
31430 76 29 2b 31 3b 0a 20 20 20 20 20 0a 20 20 20 20  v)+1;.     .    
31440 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75    pItem->regRetu
31450 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rn = ++pParse->n
31460 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
31470 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
31480 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  OP_InitCoroutine
31490 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
314a0 72 6e 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b  rn, 0, addrTop);
314b0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
314c0 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 74  nt((v, "%s", pIt
314d0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
314e0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
314f0 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 61 64  addrFillSub = ad
31500 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c  drTop;.      sql
31510 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
31520 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f  it(&dest, SRT_Co
31530 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
31540 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
31550 20 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c    ExplainQueryPl
31560 61 6e 28 28 70 50 61 72 73 65 2c 20 31 2c 20 22  an((pParse, 1, "
31570 43 4f 2d 52 4f 55 54 49 4e 45 20 30 78 25 70 22  CO-ROUTINE 0x%p"
31580 2c 20 70 53 75 62 29 29 3b 0a 20 20 20 20 20 20  , pSub));.      
31590 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
315a0 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73  arse, pSub, &des
315b0 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  t);.      pItem-
315c0 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73  >pTab->nRowLogEs
315d0 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63  t = pSub->nSelec
315e0 74 52 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65  tRow;.      pIte
315f0 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
31600 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49  ne = 1;.      pI
31610 74 65 6d 2d 3e 72 65 67 52 65 73 75 6c 74 20 3d  tem->regResult =
31620 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 20   dest.iSdst;.   
31630 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e     sqlite3VdbeEn
31640 64 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 70 49  dCoroutine(v, pI
31650 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
31660 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
31670 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
31680 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20  drTop-1);.      
31690 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
316a0 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29  RegCache(pParse)
316b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
316c0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
316d0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
316e0 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70   will fill an ep
316f0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
31700 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  th.      ** the 
31710 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20  content of this 
31720 73 75 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d  subquery.  pItem
31730 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69  ->addrFillSub wi
31740 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a  ll point.      *
31750 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73  * to the address
31760 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
31770 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70  d subroutine.  p
31780 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a  Item->regReturn.
31790 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65        ** is a re
317a0 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64  gister allocated
317b0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62   to hold the sub
317c0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61  routine return a
317d0 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a  ddress.      */.
317e0 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64        int topAdd
317f0 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63  r;.      int onc
31800 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  eAddr = 0;.     
31810 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20   int retAddr;.  
31820 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
31830 73 74 5f 69 74 65 6d 20 2a 70 50 72 69 6f 72 3b  st_item *pPrior;
31840 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
31850 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
31860 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ub==0 );.      p
31870 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20  Item->regReturn 
31880 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
31890 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72 20  ;.      topAddr 
318a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
318b0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
318c0 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67  r, 0, pItem->reg
318d0 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 70  Return);.      p
318e0 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
318f0 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20  b = topAddr+1;. 
31900 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
31910 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d  fg.isCorrelated=
31920 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
31930 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
31940 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74   is not correlat
31950 65 64 20 61 6e 64 20 69 66 20 77 65 20 61 72 65  ed and if we are
31960 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20   not inside of. 
31970 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67         ** a trig
31980 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c  ger, then we onl
31990 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  y need to comput
319a0 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
319b0 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20  he subquery.    
319c0 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a      ** once. */.
319d0 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72          onceAddr
319e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
319f0 64 4f 70 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29  dOp0(v, OP_Once)
31a00 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
31a10 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
31a20 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65  omment((v, "mate
31a30 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22 22 2c  rialize \"%s\"",
31a40 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e   pItem->pTab->zN
31a50 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ame));.      }el
31a60 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  se{.        Vdbe
31a70 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
31a80 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25  "materialize \"%
31a90 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  s\"", pItem->pTa
31aa0 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
31ab0 20 20 7d 0a 20 20 20 20 20 20 70 50 72 69 6f 72    }.      pPrior
31ac0 20 3d 20 69 73 53 65 6c 66 4a 6f 69 6e 56 69 65   = isSelfJoinVie
31ad0 77 28 70 54 61 62 4c 69 73 74 2c 20 70 49 74 65  w(pTabList, pIte
31ae0 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  m);.      if( pP
31af0 72 69 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rior ){.        
31b00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
31b10 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 44 75 70 2c  2(v, OP_OpenDup,
31b20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c   pItem->iCursor,
31b30 20 70 50 72 69 6f 72 2d 3e 69 43 75 72 73 6f 72   pPrior->iCursor
31b40 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
31b50 74 28 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c 65  t( pPrior->pSele
31b60 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct!=0 );.       
31b70 20 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f   pSub->nSelectRo
31b80 77 20 3d 20 70 50 72 69 6f 72 2d 3e 70 53 65 6c  w = pPrior->pSel
31b90 65 63 74 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ect->nSelectRow;
31ba0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31bb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
31bc0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
31bd0 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c  t, SRT_EphemTab,
31be0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
31bf0 3b 0a 20 20 20 20 20 20 20 20 45 78 70 6c 61 69  ;.        Explai
31c00 6e 51 75 65 72 79 50 6c 61 6e 28 28 70 50 61 72  nQueryPlan((pPar
31c10 73 65 2c 20 31 2c 20 22 4d 41 54 45 52 49 41 4c  se, 1, "MATERIAL
31c20 49 5a 45 20 30 78 25 70 22 2c 20 70 53 75 62 29  IZE 0x%p", pSub)
31c30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
31c40 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
31c50 20 70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20   pSub, &dest);. 
31c60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74       }.      pIt
31c70 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f  em->pTab->nRowLo
31c80 67 45 73 74 20 3d 20 70 53 75 62 2d 3e 6e 53 65  gEst = pSub->nSe
31c90 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69  lectRow;.      i
31ca0 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20 73 71  f( onceAddr ) sq
31cb0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
31cc0 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a  e(v, onceAddr);.
31cd0 20 20 20 20 20 20 72 65 74 41 64 64 72 20 3d 20        retAddr = 
31ce0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
31cf0 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
31d00 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
31d10 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
31d20 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73  ment((v, "end %s
31d30 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
31d40 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
31d50 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
31d60 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c 20 72  P1(v, topAddr, r
31d70 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20 20 73  etAddr);.      s
31d80 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70 52  qlite3ClearTempR
31d90 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29 3b  egCache(pParse);
31da0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
31db0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
31dc0 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
31dd0 64 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  d;.    pParse->n
31de0 48 65 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65  Height -= sqlite
31df0 33 53 65 6c 65 63 74 45 78 70 72 48 65 69 67 68  3SelectExprHeigh
31e00 74 28 70 29 3b 0a 20 20 20 20 70 50 61 72 73 65  t(p);.    pParse
31e10 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
31e20 20 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65   zSavedAuthConte
31e30 78 74 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  xt;.#endif.  }..
31e40 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 65 6c 65    /* Various ele
31e50 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 53 45 4c  ments of the SEL
31e60 45 43 54 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  ECT copied into 
31e70 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20  local variables 
31e80 66 6f 72 0a 20 20 2a 2a 20 63 6f 6e 76 65 6e 69  for.  ** conveni
31e90 65 6e 63 65 20 2a 2f 0a 20 20 70 45 4c 69 73 74  ence */.  pEList
31ea0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
31eb0 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
31ec0 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d  re;.  pGroupBy =
31ed0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
31ee0 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
31ef0 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e 63  ving;.  sDistinc
31f00 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73  t.isTnct = (p->s
31f10 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
31f20 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 20  tinct)!=0;..#if 
31f30 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42  SELECTTRACE_ENAB
31f40 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LED.  if( sqlite
31f50 33 53 65 6c 65 63 74 54 72 61 63 65 20 26 20 30  3SelectTrace & 0
31f60 78 34 30 30 20 29 7b 0a 20 20 20 20 53 45 4c 45  x400 ){.    SELE
31f70 43 54 54 52 41 43 45 28 30 78 34 30 30 2c 70 50  CTTRACE(0x400,pP
31f80 61 72 73 65 2c 70 2c 28 22 41 66 74 65 72 20 61  arse,p,("After a
31f90 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 61  ll FROM-clause a
31fa0 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20  nalysis:\n"));. 
31fb0 20 20 20 73 71 6c 69 74 65 33 54 72 65 65 56 69     sqlite3TreeVi
31fc0 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c 20 30  ewSelect(0, p, 0
31fd0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
31fe0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 55  ifdef SQLITE_COU
31ff0 4e 54 4f 46 56 49 45 57 5f 4f 50 54 49 4d 49 5a  NTOFVIEW_OPTIMIZ
32000 41 54 49 4f 4e 0a 20 20 69 66 28 20 4f 70 74 69  ATION.  if( Opti
32010 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
32020 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79  db, SQLITE_Query
32030 46 6c 61 74 74 65 6e 65 72 7c 53 51 4c 49 54 45  Flattener|SQLITE
32040 5f 43 6f 75 6e 74 4f 66 56 69 65 77 29 0a 20 20  _CountOfView).  
32050 20 26 26 20 63 6f 75 6e 74 4f 66 56 69 65 77 4f   && countOfViewO
32060 70 74 69 6d 69 7a 61 74 69 6f 6e 28 70 50 61 72  ptimization(pPar
32070 73 65 2c 20 70 29 0a 20 20 29 7b 0a 20 20 20 20  se, p).  ){.    
32080 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
32090 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
320a0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 70 45 4c 69  ct_end;.    pELi
320b0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
320c0 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
320d0 2d 3e 70 53 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  ->pSrc;.  }.#end
320e0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  if..  /* If the 
320f0 71 75 65 72 79 20 69 73 20 44 49 53 54 49 4e 43  query is DISTINC
32100 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  T with an ORDER 
32110 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e  BY but is not an
32120 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20   aggregate, and 
32130 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c  .  ** if the sel
32140 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20  ect-list is the 
32150 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45  same as the ORDE
32160 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20  R BY list, then 
32170 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20  this query.  ** 
32180 63 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e  can be rewritten
32190 20 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20   as a GROUP BY. 
321a0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
321b0 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this:.  **.  ** 
321c0 20 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49      SELECT DISTI
321d0 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  NCT xyz FROM ...
321e0 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20   ORDER BY xyz.  
321f0 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73  **.  ** is trans
32200 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a  formed to:.  **.
32210 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
32220 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f  xyz FROM ... GRO
32230 55 50 20 42 59 20 78 79 7a 20 4f 52 44 45 52 20  UP BY xyz ORDER 
32240 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a  BY xyz.  **.  **
32250 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
32260 20 69 73 20 70 72 65 66 65 72 72 65 64 20 61 73   is preferred as
32270 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20   a single index 
32280 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65 29 20  (or temp-table) 
32290 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75 73 65  may be .  ** use
322a0 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 4f  d for both the O
322b0 52 44 45 52 20 42 59 20 61 6e 64 20 44 49 53 54  RDER BY and DIST
322c0 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e 67 2e  INCT processing.
322d0 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a   As originally .
322e0 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 68 65    ** written the
322f0 20 71 75 65 72 79 20 6d 75 73 74 20 75 73 65 20   query must use 
32300 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72  a temp-table for
32310 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   at least one of
32320 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a   the ORDER .  **
32330 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
32340 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f  , and an index o
32350 72 20 73 65 70 61 72 61 74 65 20 74 65 6d 70 2d  r separate temp-
32360 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6f 74  table for the ot
32370 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  her..  */.  if( 
32380 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
32390 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
323a0 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
323b0 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26 20 73  istinct .   && s
323c0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
323d0 6d 70 61 72 65 28 73 53 6f 72 74 2e 70 4f 72 64  mpare(sSort.pOrd
323e0 65 72 42 79 2c 20 70 45 4c 69 73 74 2c 20 2d 31  erBy, pEList, -1
323f0 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d  )==0.  ){.    p-
32400 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
32410 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70  _Distinct;.    p
32420 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
32430 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
32440 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
32450 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 2f  EList, 0);.    /
32460 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65 76  * Notice that ev
32470 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44 69  en thought SF_Di
32480 73 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e 20  stinct has been 
32490 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e  cleared from p->
324a0 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a  selFlags,.    **
324b0 20 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e 69   the sDistinct.i
324c0 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20 73  sTnct is still s
324d0 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54 6e  et.  Hence, isTn
324e0 63 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  ct represents th
324f0 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61  e.    ** origina
32500 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65  l setting of the
32510 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c 61   SF_Distinct fla
32520 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72 65  g, not the curre
32530 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20  nt setting */.  
32540 20 20 61 73 73 65 72 74 28 20 73 44 69 73 74 69    assert( sDisti
32550 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 0a 23  nct.isTnct );..#
32560 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
32570 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20 73  NABLED.    if( s
32580 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
32590 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20 20  e & 0x400 ){.   
325a0 20 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30     SELECTTRACE(0
325b0 78 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22  x400,pParse,p,("
325c0 54 72 61 6e 73 66 6f 72 6d 20 44 49 53 54 49 4e  Transform DISTIN
325d0 43 54 20 69 6e 74 6f 20 47 52 4f 55 50 20 42 59  CT into GROUP BY
325e0 3a 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 73 71  :\n"));.      sq
325f0 6c 69 74 65 33 54 72 65 65 56 69 65 77 53 65 6c  lite3TreeViewSel
32600 65 63 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20  ect(0, p, 0);.  
32610 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
32620 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
32630 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
32640 75 73 65 2c 20 74 68 65 6e 20 63 72 65 61 74 65  use, then create
32650 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e   an ephemeral in
32660 64 65 78 20 74 6f 0a 20 20 2a 2a 20 64 6f 20 74  dex to.  ** do t
32670 68 65 20 73 6f 72 74 69 6e 67 2e 20 20 42 75 74  he sorting.  But
32680 20 74 68 69 73 20 73 6f 72 74 69 6e 67 20 65 70   this sorting ep
32690 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20 6d 69  hemeral index mi
326a0 67 68 74 20 65 6e 64 20 75 70 0a 20 20 2a 2a 20  ght end up.  ** 
326b0 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20  being unused if 
326c0 74 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20  the data can be 
326d0 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65  extracted in pre
326e0 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 0a 20  -sorted order.. 
326f0 20 2a 2a 20 49 66 20 74 68 61 74 20 69 73 20 74   ** If that is t
32700 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
32710 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
32720 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77  al instruction w
32730 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 68 61 6e  ill be.  ** chan
32740 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  ged to an OP_Noo
32750 70 20 6f 6e 63 65 20 77 65 20 66 69 67 75 72 65  p once we figure
32760 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f   out that the so
32770 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 0a 20  rting index is. 
32780 20 2a 2a 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20   ** not needed. 
32790 20 54 68 65 20 73 53 6f 72 74 2e 61 64 64 72 53   The sSort.addrS
327a0 6f 72 74 49 6e 64 65 78 20 76 61 72 69 61 62 6c  ortIndex variabl
327b0 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63  e is used to fac
327c0 69 6c 69 74 61 74 65 0a 20 20 2a 2a 20 74 68 61  ilitate.  ** tha
327d0 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20  t change..  */. 
327e0 20 69 66 28 20 73 53 6f 72 74 2e 70 4f 72 64 65   if( sSort.pOrde
327f0 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
32800 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
32810 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
32820 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
32830 28 70 50 61 72 73 65 2c 20 73 53 6f 72 74 2e 70  (pParse, sSort.p
32840 4f 72 64 65 72 42 79 2c 20 30 2c 20 70 45 4c 69  OrderBy, 0, pELi
32850 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
32860 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72 20 3d  sSort.iECursor =
32870 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
32880 0a 20 20 20 20 73 53 6f 72 74 2e 61 64 64 72 53  .    sSort.addrS
32890 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20  ortIndex =.     
328a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
328b0 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p4(v, OP_OpenEph
328c0 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20  emeral,.        
328d0 20 20 73 53 6f 72 74 2e 69 45 43 75 72 73 6f 72    sSort.iECursor
328e0 2c 20 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79  , sSort.pOrderBy
328f0 2d 3e 6e 45 78 70 72 2b 31 2b 70 45 4c 69 73 74  ->nExpr+1+pEList
32900 2d 3e 6e 45 78 70 72 2c 20 30 2c 0a 20 20 20 20  ->nExpr, 0,.    
32910 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
32920 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
32930 4f 0a 20 20 20 20 20 20 29 3b 0a 20 20 7d 65 6c  O.      );.  }el
32940 73 65 7b 0a 20 20 20 20 73 53 6f 72 74 2e 61 64  se{.    sSort.ad
32950 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31  drSortIndex = -1
32960 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
32970 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73  he output is des
32980 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70  tined for a temp
32990 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65  orary table, ope
329a0 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20  n that table..  
329b0 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  */.  if( pDest->
329c0 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
329d0 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
329e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
329f0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
32a00 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
32a10 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
32a20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
32a30 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a  the limiter..  *
32a40 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74  /.  iEnd = sqlit
32a50 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
32a60 76 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65  v);.  if( (p->se
32a70 6c 46 6c 61 67 73 20 26 20 53 46 5f 46 69 78 65  lFlags & SF_Fixe
32a80 64 4c 69 6d 69 74 29 3d 3d 30 20 29 7b 0a 20 20  dLimit)==0 ){.  
32a90 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
32aa0 3d 20 33 32 30 3b 20 20 2f 2a 20 34 20 62 69 6c  = 320;  /* 4 bil
32ab0 6c 69 6f 6e 20 72 6f 77 73 20 2a 2f 0a 20 20 7d  lion rows */.  }
32ac0 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
32ad0 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
32ae0 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66 28   p, iEnd);.  if(
32af0 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26 26   p->iLimit==0 &&
32b00 20 73 53 6f 72 74 2e 61 64 64 72 53 6f 72 74 49   sSort.addrSortI
32b10 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73  ndex>=0 ){.    s
32b20 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
32b30 4f 70 63 6f 64 65 28 76 2c 20 73 53 6f 72 74 2e  Opcode(v, sSort.
32b40 61 64 64 72 53 6f 72 74 49 6e 64 65 78 2c 20 4f  addrSortIndex, O
32b50 50 5f 53 6f 72 74 65 72 4f 70 65 6e 29 3b 0a 20  P_SorterOpen);. 
32b60 20 20 20 73 53 6f 72 74 2e 73 6f 72 74 46 6c 61     sSort.sortFla
32b70 67 73 20 7c 3d 20 53 4f 52 54 46 4c 41 47 5f 55  gs |= SORTFLAG_U
32b80 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20  seSorter;.  }.. 
32b90 20 2f 2a 20 4f 70 65 6e 20 61 6e 20 65 70 68 65   /* Open an ephe
32ba0 6d 65 72 61 6c 20 69 6e 64 65 78 20 74 6f 20 75  meral index to u
32bb0 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
32bc0 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
32bd0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
32be0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b  & SF_Distinct ){
32bf0 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74  .    sDistinct.t
32c00 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  abTnct = pParse-
32c10 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69  >nTab++;.    sDi
32c20 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74 20  stinct.addrTnct 
32c30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
32c40 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
32c50 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
32c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c70 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e        sDistinct.
32c80 74 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  tabTnct, 0, 0,. 
32c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ca0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
32cb0 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  r*)keyInfoFromEx
32cc0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
32cd0 2d 3e 70 45 4c 69 73 74 2c 30 2c 30 29 2c 0a 20  ->pEList,0,0),. 
32ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32cf0 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b              P4_K
32d00 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c  EYINFO);.    sql
32d10 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
32d20 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  (v, BTREE_UNORDE
32d30 52 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69  RED);.    sDisti
32d40 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
32d50 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
32d60 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73  NORDERED;.  }els
32d70 65 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  e{.    sDistinct
32d80 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45  .eTnctType = WHE
32d90 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50  RE_DISTINCT_NOOP
32da0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73  ;.  }..  if( !is
32db0 41 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d  Agg && pGroupBy=
32dc0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  =0 ){.    /* No 
32dd0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
32de0 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50  ons and no GROUP
32df0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
32e00 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73    u16 wctrlFlags
32e10 20 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73   = (sDistinct.is
32e20 54 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e  Tnct ? WHERE_WAN
32e30 54 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b  T_DISTINCT : 0);
32e40 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 48 45  .    assert( WHE
32e50 52 45 5f 55 53 45 5f 4c 49 4d 49 54 3d 3d 53 46  RE_USE_LIMIT==SF
32e60 5f 46 69 78 65 64 4c 69 6d 69 74 20 29 3b 0a 20  _FixedLimit );. 
32e70 20 20 20 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d     wctrlFlags |=
32e80 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
32e90 46 5f 46 69 78 65 64 4c 69 6d 69 74 3b 0a 0a 20  F_FixedLimit;.. 
32ea0 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20     /* Begin the 
32eb0 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a  database scan. *
32ec0 2f 0a 20 20 20 20 53 45 4c 45 43 54 54 52 41 43  /.    SELECTTRAC
32ed0 45 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 57  E(1,pParse,p,("W
32ee0 68 65 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a  hereBegin\n"));.
32ef0 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
32f00 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
32f10 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
32f20 20 70 57 68 65 72 65 2c 20 73 53 6f 72 74 2e 70   pWhere, sSort.p
32f30 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
32f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f50 20 20 20 20 20 20 20 20 70 2d 3e 70 45 4c 69 73          p->pELis
32f60 74 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 70  t, wctrlFlags, p
32f70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 29 3b 0a 20  ->nSelectRow);. 
32f80 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
32f90 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
32fa0 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  nd;.    if( sqli
32fb0 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
32fc0 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c  wCount(pWInfo) <
32fd0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29   p->nSelectRow )
32fe0 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  {.      p->nSele
32ff0 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 57  ctRow = sqlite3W
33000 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75  hereOutputRowCou
33010 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nt(pWInfo);.    
33020 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73 74 69  }.    if( sDisti
33030 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 73 71  nct.isTnct && sq
33040 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
33050 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a  inct(pWInfo) ){.
33060 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e        sDistinct.
33070 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71 6c 69  eTnctType = sqli
33080 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e  te3WhereIsDistin
33090 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  ct(pWInfo);.    
330a0 7d 0a 20 20 20 20 69 66 28 20 73 53 6f 72 74 2e  }.    if( sSort.
330b0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
330c0 20 20 73 53 6f 72 74 2e 6e 4f 42 53 61 74 20 3d    sSort.nOBSat =
330d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f   sqlite3WhereIsO
330e0 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 3b 0a  rdered(pWInfo);.
330f0 20 20 20 20 20 20 73 53 6f 72 74 2e 62 4f 72 64        sSort.bOrd
33100 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20 3d 20  eredInnerLoop = 
33110 73 71 6c 69 74 65 33 57 68 65 72 65 4f 72 64 65  sqlite3WhereOrde
33120 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 28 70 57 49  redInnerLoop(pWI
33130 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
33140 73 53 6f 72 74 2e 6e 4f 42 53 61 74 3d 3d 73 53  sSort.nOBSat==sS
33150 6f 72 74 2e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ort.pOrderBy->nE
33160 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  xpr ){.        s
33170 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d 20  Sort.pOrderBy = 
33180 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
33190 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74  ..    /* If sort
331a0 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
331b0 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
331c0 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68  prior OP_OpenEph
331d0 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69  emeral .    ** i
331e0 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64  nstruction ended
331f0 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65   up not being ne
33200 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67  eded, then chang
33210 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
33220 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  emeral.    ** in
33230 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20  to an OP_Noop.. 
33240 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 53     */.    if( sS
33250 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
33260 78 3e 3d 30 20 26 26 20 73 53 6f 72 74 2e 70 4f  x>=0 && sSort.pO
33270 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
33280 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
33290 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 73 53  angeToNoop(v, sS
332a0 6f 72 74 2e 61 64 64 72 53 6f 72 74 49 6e 64 65  ort.addrSortInde
332b0 78 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  x);.    }..    /
332c0 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
332d0 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a  rd inner loop. *
332e0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
332f0 3e 70 45 4c 69 73 74 3d 3d 70 45 4c 69 73 74 20  >pEList==pEList 
33300 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  );.    selectInn
33310 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
33320 2c 20 2d 31 2c 20 26 73 53 6f 72 74 2c 20 26 73  , -1, &sSort, &s
33330 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c  Distinct, pDest,
33340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33350 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
33360 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70  eContinueLabel(p
33370 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20  WInfo),.        
33380 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
33390 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62  te3WhereBreakLab
333a0 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20  el(pWInfo));..  
333b0 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
333c0 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
333d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
333e0 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
333f0 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fo);.  }else{.  
33400 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77    /* This case w
33410 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 20  hen there exist 
33420 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
33430 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42  ons or a GROUP B
33440 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  Y clause.    ** 
33450 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e  or both */.    N
33460 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
33470 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
33480 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  xt for processin
33490 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f  g aggregate info
334a0 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  rmation */.    i
334b0 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20  nt iAMem;       
334c0 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
334d0 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72  address for stor
334e0 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55  ing current GROU
334f0 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
33500 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iBMem;          
33510 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
33520 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75  ress for previou
33530 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  s GROUP BY */.  
33540 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20    int iUseFlag; 
33550 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64        /* Mem add
33560 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61  ress holding fla
33570 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  g indicating tha
33580 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20  t at least.     
33590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
335a0 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66     ** one row of
335b0 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   the input to th
335c0 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73  e aggregator has
335d0 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20   been.          
335e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
335f0 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
33600 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67    int iAbortFlag
33610 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64  ;     /* Mem add
33620 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65  ress which cause
33630 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66  s query abort if
33640 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20   positive */.   
33650 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74   int groupBySort
33660 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d  ;    /* Rows com
33670 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e  e from source in
33680 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20   GROUP BY order 
33690 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45  */.    int addrE
336a0 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  nd;        /* En
336b0 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20  d of processing 
336c0 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20  for this SELECT 
336d0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50  */.    int sortP
336e0 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73  Tab = 0;   /* Ps
336f0 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74  eudotable used t
33700 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67  o decode sorting
33710 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20   results */.    
33720 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b  int sortOut = 0;
33730 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65      /* Output re
33740 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20  gister from the 
33750 73 6f 72 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  sorter */.    in
33760 74 20 6f 72 64 65 72 42 79 47 72 70 20 3d 20 30  t orderByGrp = 0
33770 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65  ; /* True if the
33780 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 4f 52   GROUP BY and OR
33790 44 45 52 20 42 59 20 61 72 65 20 74 68 65 20 73  DER BY are the s
337a0 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  ame */..    /* R
337b0 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c  emove any and al
337c0 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77 65 65  l aliases betwee
337d0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
337e0 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
337f0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
33800 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
33810 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
33820 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20    int k;        
33830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33840 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
33850 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
33860 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
33870 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f  Item;  /* For lo
33880 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65  oping over expre
33890 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20  ssion in a list 
338a0 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  */..      for(k=
338b0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
338c0 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73  , pItem=p->pELis
338d0 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  t->a; k>0; k--, 
338e0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
338f0 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
33900 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
33910 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72  .      for(k=pGr
33920 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49  oupBy->nExpr, pI
33930 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b  tem=pGroupBy->a;
33940 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d   k>0; k--, pItem
33950 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
33960 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d  em->u.x.iAlias =
33970 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
33980 20 20 61 73 73 65 72 74 28 20 36 36 3d 3d 73 71    assert( 66==sq
33990 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 30 29  lite3LogEst(100)
339a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
339b0 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 36 36 20 29  >nSelectRow>66 )
339c0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
339d0 20 36 36 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   66;.    }else{.
339e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d        assert( 0=
339f0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
33a00 29 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  ) );.      p->nS
33a10 65 6c 65 63 74 52 6f 77 20 3d 20 30 3b 0a 20 20  electRow = 0;.  
33a20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
33a30 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47  here is both a G
33a40 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f  ROUP BY and an O
33a50 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
33a60 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20 20 20  nd they are.    
33a70 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68  ** identical, th
33a80 65 6e 20 69 74 20 6d 61 79 20 62 65 20 70 6f 73  en it may be pos
33a90 73 69 62 6c 65 20 74 6f 20 64 69 73 61 62 6c 65  sible to disable
33aa0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
33ab0 61 75 73 65 20 0a 20 20 20 20 2a 2a 20 6f 6e 20  ause .    ** on 
33ac0 74 68 65 20 67 72 6f 75 6e 64 73 20 74 68 61 74  the grounds that
33ad0 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 77 69   the GROUP BY wi
33ae0 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74  ll cause element
33af0 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 0a 20  s to come out . 
33b00 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72     ** in the cor
33b10 72 65 63 74 20 6f 72 64 65 72 2e 20 49 74 20 61  rect order. It a
33b20 6c 73 6f 20 6d 61 79 20 6e 6f 74 20 2d 20 74 68  lso may not - th
33b30 65 20 47 52 4f 55 50 20 42 59 20 6d 69 67 68 74  e GROUP BY might
33b40 20 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 64 61   use a.    ** da
33b50 74 61 62 61 73 65 20 69 6e 64 65 78 20 74 68 61  tabase index tha
33b60 74 20 63 61 75 73 65 73 20 72 6f 77 73 20 74 6f  t causes rows to
33b70 20 62 65 20 67 72 6f 75 70 65 64 20 74 6f 67 65   be grouped toge
33b80 74 68 65 72 20 61 73 20 72 65 71 75 69 72 65 64  ther as required
33b90 0a 20 20 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20  .    ** but not 
33ba0 61 63 74 75 61 6c 6c 79 20 73 6f 72 74 65 64 2e  actually sorted.
33bb0 20 45 69 74 68 65 72 20 77 61 79 2c 20 72 65 63   Either way, rec
33bc0 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
33bd0 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 4f 52 44  t the.    ** ORD
33be0 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20  ER BY and GROUP 
33bf0 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 74  BY clauses are t
33c00 68 65 20 73 61 6d 65 20 62 79 20 73 65 74 74 69  he same by setti
33c10 6e 67 20 74 68 65 20 6f 72 64 65 72 42 79 47 72  ng the orderByGr
33c20 70 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c  p.    ** variabl
33c30 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  e.  */.    if( s
33c40 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
33c50 6d 70 61 72 65 28 70 47 72 6f 75 70 42 79 2c 20  mpare(pGroupBy, 
33c60 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 2c 20  sSort.pOrderBy, 
33c70 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
33c80 6f 72 64 65 72 42 79 47 72 70 20 3d 20 31 3b 0a  orderByGrp = 1;.
33c90 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 43      }. .    /* C
33ca0 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f  reate a label to
33cb0 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65   jump to when we
33cc0 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74   want to abort t
33cd0 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  he query */.    
33ce0 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65  addrEnd = sqlite
33cf0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
33d00 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  );..    /* Conve
33d10 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  rt TK_COLUMN nod
33d20 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  es into TK_AGG_C
33d30 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65  OLUMN and make e
33d40 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a  ntries in.    **
33d50 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c   sAggInfo for al
33d60 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  l TK_AGG_FUNCTIO
33d70 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65  N nodes in expre
33d80 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20  ssions of the.  
33d90 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
33da0 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ement..    */.  
33db0 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
33dc0 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
33dd0 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
33de0 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43   pParse;.    sNC
33df0 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
33e00 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 75 4e  List;.    sNC.uN
33e10 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41  C.pAggInfo = &sA
33e20 67 67 49 6e 66 6f 3b 0a 20 20 20 20 56 56 41 5f  ggInfo;.    VVA_
33e30 4f 4e 4c 59 28 20 73 4e 43 2e 6e 63 46 6c 61 67  ONLY( sNC.ncFlag
33e40 73 20 3d 20 4e 43 5f 55 41 67 67 49 6e 66 6f 3b  s = NC_UAggInfo;
33e50 20 29 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   ).    sAggInfo.
33e60 6d 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e  mnReg = pParse->
33e70 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67  nMem+1;.    sAgg
33e80 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c  Info.nSortingCol
33e90 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f  umn = pGroupBy ?
33ea0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
33eb0 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e   : 0;.    sAggIn
33ec0 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  fo.pGroupBy = pG
33ed0 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69  roupBy;.    sqli
33ee0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
33ef0 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69  gList(&sNC, pELi
33f00 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
33f10 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
33f20 73 74 28 26 73 4e 43 2c 20 73 53 6f 72 74 2e 70  st(&sNC, sSort.p
33f30 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66  OrderBy);.    if
33f40 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20  ( pHaving ){.   
33f50 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
33f60 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
33f70 74 28 20 70 57 68 65 72 65 3d 3d 70 2d 3e 70 57  t( pWhere==p->pW
33f80 68 65 72 65 20 29 3b 0a 20 20 20 20 20 20 20 20  here );.        
33f90 61 73 73 65 72 74 28 20 70 48 61 76 69 6e 67 3d  assert( pHaving=
33fa0 3d 70 2d 3e 70 48 61 76 69 6e 67 20 29 3b 0a 20  =p->pHaving );. 
33fb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
33fc0 47 72 6f 75 70 42 79 3d 3d 70 2d 3e 70 47 72 6f  GroupBy==p->pGro
33fd0 75 70 42 79 20 29 3b 0a 20 20 20 20 20 20 20 20  upBy );.        
33fe0 68 61 76 69 6e 67 54 6f 57 68 65 72 65 28 70 50  havingToWhere(pP
33ff0 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20  arse, p);.      
34000 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
34010 68 65 72 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  here;.      }.  
34020 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
34030 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
34040 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b  (&sNC, pHaving);
34050 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
34060 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  nfo.nAccumulator
34070 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   = sAggInfo.nCol
34080 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  umn;.    if( p->
34090 70 47 72 6f 75 70 42 79 3d 3d 30 20 26 26 20 70  pGroupBy==0 && p
340a0 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 26 26 20  ->pHaving==0 && 
340b0 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3d 3d  sAggInfo.nFunc==
340c0 31 20 29 7b 0a 20 20 20 20 20 20 6d 69 6e 4d 61  1 ){.      minMa
340d0 78 46 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75  xFlag = minMaxQu
340e0 65 72 79 28 64 62 2c 20 73 41 67 67 49 6e 66 6f  ery(db, sAggInfo
340f0 2e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 2c  .aFunc[0].pExpr,
34100 20 26 70 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79   &pMinMaxOrderBy
34110 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
34120 20 20 20 20 6d 69 6e 4d 61 78 46 6c 61 67 20 3d      minMaxFlag =
34130 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
34140 4f 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  ORMAL;.    }.   
34150 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
34160 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29  Info.nFunc; i++)
34170 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
34180 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
34190 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b  (sAggInfo.aFunc[
341a0 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  i].pExpr, EP_xIs
341b0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
341c0 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20   sNC.ncFlags |= 
341d0 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20  NC_InAggFunc;.  
341e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
341f0 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
34200 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  NC, sAggInfo.aFu
34210 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70  nc[i].pExpr->x.p
34220 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43  List);.      sNC
34230 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f  .ncFlags &= ~NC_
34240 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d  InAggFunc;.    }
34250 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78  .    sAggInfo.mx
34260 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
34270 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  em;.    if( db->
34280 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
34290 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
342a0 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
342b0 45 4e 41 42 4c 45 44 0a 20 20 20 20 69 66 28 20  ENABLED.    if( 
342c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
342d0 63 65 20 26 20 30 78 34 30 30 20 29 7b 0a 20 20  ce & 0x400 ){.  
342e0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
342f0 20 20 53 45 4c 45 43 54 54 52 41 43 45 28 30 78    SELECTTRACE(0x
34300 34 30 30 2c 70 50 61 72 73 65 2c 70 2c 28 22 41  400,pParse,p,("A
34310 66 74 65 72 20 61 67 67 72 65 67 61 74 65 20 61  fter aggregate a
34320 6e 61 6c 79 73 69 73 3a 5c 6e 22 29 29 3b 0a 20  nalysis:\n"));. 
34330 20 20 20 20 20 73 71 6c 69 74 65 33 54 72 65 65       sqlite3Tree
34340 56 69 65 77 53 65 6c 65 63 74 28 30 2c 20 70 2c  ViewSelect(0, p,
34350 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   0);.      for(i
34360 69 3d 30 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f  i=0; ii<sAggInfo
34370 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 69 2b 2b 29 7b  .nColumn; ii++){
34380 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34390 44 65 62 75 67 50 72 69 6e 74 66 28 22 61 67 67  DebugPrintf("agg
343a0 2d 63 6f 6c 75 6d 6e 5b 25 64 5d 20 69 4d 65 6d  -column[%d] iMem
343b0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
343c0 20 20 20 20 69 69 2c 20 73 41 67 67 49 6e 66 6f      ii, sAggInfo
343d0 2e 61 43 6f 6c 5b 69 69 5d 2e 69 4d 65 6d 29 3b  .aCol[ii].iMem);
343e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
343f0 54 72 65 65 56 69 65 77 45 78 70 72 28 30 2c 20  TreeViewExpr(0, 
34400 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 69  sAggInfo.aCol[ii
34410 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
34420 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
34430 69 3d 30 3b 20 69 69 3c 73 41 67 67 49 6e 66 6f  i=0; ii<sAggInfo
34440 2e 6e 46 75 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20  .nFunc; ii++){. 
34450 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
34460 62 75 67 50 72 69 6e 74 66 28 22 61 67 67 2d 66  bugPrintf("agg-f
34470 75 6e 63 5b 25 64 5d 3a 20 69 4d 65 6d 3d 25 64  unc[%d]: iMem=%d
34480 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
34490 20 69 69 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46   ii, sAggInfo.aF
344a0 75 6e 63 5b 69 69 5d 2e 69 4d 65 6d 29 3b 0a 20  unc[ii].iMem);. 
344b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 72         sqlite3Tr
344c0 65 65 56 69 65 77 45 78 70 72 28 30 2c 20 73 41  eeViewExpr(0, sA
344d0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 69 5d  ggInfo.aFunc[ii]
344e0 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
344f0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
34500 0a 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73  ...    /* Proces
34510 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  sing for aggrega
34520 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42  tes with GROUP B
34530 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72  Y is very differ
34540 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d  ent and.    ** m
34550 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78  uch more complex
34560 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73   than aggregates
34570 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50   without a GROUP
34580 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   BY..    */.    
34590 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
345a0 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
345b0 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79  KeyInfo;  /* Key
345c0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
345d0 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79  for the group by
345e0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
345f0 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
34600 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63       /* A-vs-B c
34610 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20  omparision jump 
34620 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
34630 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20  rOutputRow;  /* 
34640 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74  Start of subrout
34650 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
34660 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f   a result row */
34670 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75  .      int regOu
34680 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65  tputRow;   /* Re
34690 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
346a0 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74  ister for output
346b0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
346c0 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74       int addrSet
346d0 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20  Abort;   /* Set 
346e0 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61  the abort flag a
346f0 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20  nd return */.   
34700 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66     int addrTopOf
34710 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66  Loop;  /* Top of
34720 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20   the input loop 
34730 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
34740 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20  rSortingIdx; /* 
34750 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
34760 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72  eral for the sor
34770 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ting index */.  
34780 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65      int addrRese
34790 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f  t;      /* Subro
347a0 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74  utine for resett
347b0 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61  ing the accumula
347c0 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tor */.      int
347d0 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20   regReset;      
347e0 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
347f0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
34800 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65  reset subroutine
34810 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   */..      /* If
34820 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55   there is a GROU
34830 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d  P BY clause we m
34840 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74  ight need a sort
34850 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20  ing index to.   
34860 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20     ** implement 
34870 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68  it.  Allocate th
34880 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  at sorting index
34890 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72   now.  If it tur
348a0 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20  ns out.      ** 
348b0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e  that we do not n
348c0 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c  eed it after all
348d0 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f  , the OP_SorterO
348e0 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  pen instruction.
348f0 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65        ** will be
34900 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
34910 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20  a Noop.  .      
34920 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66  */.      sAggInf
34930 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70  o.sortingIdx = p
34940 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
34950 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
34960 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
34970 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ist(pParse, pGro
34980 75 70 42 79 2c 20 30 2c 20 73 41 67 67 49 6e 66  upBy, 0, sAggInf
34990 6f 2e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  o.nColumn);.    
349a0 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78    addrSortingIdx
349b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
349c0 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp4(v, OP_Sorte
349d0 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20  rOpen, .        
349e0 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
349f0 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e  ngIdx, sAggInfo.
34a00 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20  nSortingColumn, 
34a10 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63  .          0, (c
34a20 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
34a30 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20  4_KEYINFO);..   
34a40 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
34a50 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
34a60 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20  s used by GROUP 
34a70 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f  BY aggregate pro
34a80 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f  cessing.      */
34a90 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20  .      iUseFlag 
34aa0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
34ab0 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c  ;.      iAbortFl
34ac0 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
34ad0 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75  Mem;.      regOu
34ae0 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72  tputRow = ++pPar
34af0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
34b00 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
34b10 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
34b20 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72  abel(v);.      r
34b30 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72  egReset = ++pPar
34b40 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
34b50 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69  addrReset = sqli
34b60 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
34b70 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d  (v);.      iAMem
34b80 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
34b90 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
34ba0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
34bb0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
34bc0 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65    iBMem = pParse
34bd0 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
34be0 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
34bf0 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
34c00 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
34c10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
34c20 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62  _Integer, 0, iAb
34c30 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
34c40 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
34c50 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61  "clear abort fla
34c60 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
34c70 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
34c80 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
34c90 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
34ca0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
34cb0 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d   "indicate accum
34cc0 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b  ulator empty"));
34cd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
34ce0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
34cf0 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69  ull, 0, iAMem, i
34d00 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e  AMem+pGroupBy->n
34d10 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20  Expr-1);..      
34d20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20  /* Begin a loop 
34d30 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
34d40 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77  t all source row
34d50 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  s in GROUP BY or
34d60 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  der..      ** Th
34d70 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65  is might involve
34d80 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f   two separate lo
34d90 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53  ops with an OP_S
34da0 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20  ort in between, 
34db0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d  or.      ** it m
34dc0 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65  ight be a single
34dd0 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20   loop that uses 
34de0 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72  an index to extr
34df0 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  act information.
34e00 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
34e10 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62  right order to b
34e20 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20  egin with..     
34e30 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
34e40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
34e50 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
34e60 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
34e70 20 20 20 20 20 53 45 4c 45 43 54 54 52 41 43 45       SELECTTRACE
34e80 28 31 2c 70 50 61 72 73 65 2c 70 2c 28 22 57 68  (1,pParse,p,("Wh
34e90 65 72 65 42 65 67 69 6e 5c 6e 22 29 29 3b 0a 20  ereBegin\n"));. 
34ea0 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
34eb0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
34ec0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
34ed0 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70  , pWhere, pGroup
34ee0 42 79 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  By, 0,.         
34ef0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 7c   WHERE_GROUPBY |
34f00 20 28 6f 72 64 65 72 42 79 47 72 70 20 3f 20 57   (orderByGrp ? W
34f10 48 45 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50  HERE_SORTBYGROUP
34f20 20 3a 20 30 29 2c 20 30 0a 20 20 20 20 20 20 29   : 0), 0.      )
34f30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
34f40 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
34f50 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69  ect_end;.      i
34f60 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  f( sqlite3WhereI
34f70 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
34f80 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  ==pGroupBy->nExp
34f90 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  r ){.        /* 
34fa0 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73  The optimizer is
34fb0 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72   able to deliver
34fc0 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62   rows in group b
34fd0 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20  y order so.     
34fe0 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20     ** we do not 
34ff0 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54  have to sort.  T
35000 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
35010 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62  ral table will b
35020 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e  e.        ** can
35030 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63  celled later bec
35040 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65  ause we still ne
35050 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b  ed to use the pK
35060 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a  eyInfo.        *
35070 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42  /.        groupB
35080 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  ySort = 0;.     
35090 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
350a0 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69  /* Rows are comi
350b0 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65  ng out in undete
350c0 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57  rmined order.  W
350d0 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20  e have to push. 
350e0 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72         ** each r
350f0 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e  ow into a sortin
35100 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61  g index, termina
35110 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f  te the first loo
35120 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  p,.        ** th
35130 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65  en loop over the
35140 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69   sorting index i
35150 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74  n order to get t
35160 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20  he output.      
35170 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f    ** in sorted o
35180 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a  rder.        */.
35190 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42          int regB
351a0 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ase;.        int
351b0 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20   regRecord;.    
351c0 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20      int nCol;.  
351d0 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70        int nGroup
351e0 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70  By;..        exp
351f0 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50  lainTempTable(pP
35200 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
35210 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73     (sDistinct.is
35220 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  Tnct && (p->selF
35230 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74  lags&SF_Distinct
35240 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20  )==0) ?.        
35250 20 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53              "DIS
35260 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20  TINCT" : "GROUP 
35270 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67  BY");..        g
35280 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a  roupBySort = 1;.
35290 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79          nGroupBy
352a0 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   = pGroupBy->nEx
352b0 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c  pr;.        nCol
352c0 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a 20 20 20   = nGroupBy;.   
352d0 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
352e0 79 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  y;.        for(i
352f0 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
35300 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
35310 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67          if( sAgg
35320 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f  Info.aCol[i].iSo
35330 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
35340 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f  .            nCo
35350 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  l++;.           
35360 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
35370 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
35380 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71      regBase = sq
35390 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
353a0 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b  e(pParse, nCol);
353b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
353c0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
353d0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
353e0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
353f0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
35400 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73  pGroupBy, regBas
35410 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
35420 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 3b 0a    j = nGroupBy;.
35430 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
35440 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
35450 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
35460 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
35470 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
35480 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69  &sAggInfo.aCol[i
35490 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
354a0 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
354b0 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
354c0 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
354d0 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20  j + regBase;.   
354e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
354f0 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d  ExprCodeGetColum
35500 6e 54 6f 52 65 67 28 70 50 61 72 73 65 2c 20 0a  nToReg(pParse, .
35510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
35530 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d  Col->pTab, pCol-
35540 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e  >iColumn, pCol->
35550 69 54 61 62 6c 65 2c 20 72 31 29 3b 0a 20 20 20  iTable, r1);.   
35560 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
35570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35580 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52    }.        regR
35590 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
355a0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
355b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
355c0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
355d0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
355e0 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65  egBase, nCol, re
355f0 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
35600 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
35610 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
35620 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f  Insert, sAggInfo
35630 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67  .sortingIdx, reg
35640 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
35650 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
35660 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
35670 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
35680 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
35690 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
356a0 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  e, regBase, nCol
356b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
356c0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
356d0 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  o);.        sAgg
356e0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50  Info.sortingIdxP
356f0 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d  Tab = sortPTab =
35700 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
35710 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74  .        sortOut
35720 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
35730 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
35740 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
35750 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
35760 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54  enPseudo, sortPT
35770 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f  ab, sortOut, nCo
35780 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
35790 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
357a0 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
357b0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
357c0 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  Idx, addrEnd);. 
357d0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
357e0 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59  nt((v, "GROUP BY
357f0 20 73 6f 72 74 22 29 29 3b 20 56 64 62 65 43 6f   sort")); VdbeCo
35800 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
35810 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53     sAggInfo.useS
35820 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20  ortingIdx = 1;. 
35830 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
35840 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
35850 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 7d 0a 0a  rse);..      }..
35860 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
35870 69 6e 64 65 78 20 6f 72 20 74 65 6d 70 6f 72 61  index or tempora
35880 72 79 20 74 61 62 6c 65 20 75 73 65 64 20 62 79  ry table used by
35890 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 73 6f   the GROUP BY so
358a0 72 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  rt.      ** will
358b0 20 6e 61 74 75 72 61 6c 6c 79 20 64 65 6c 69 76   naturally deliv
358c0 65 72 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6f  er rows in the o
358d0 72 64 65 72 20 72 65 71 75 69 72 65 64 20 62 79  rder required by
358e0 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
358f0 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 2c 20 63      ** clause, c
35900 61 6e 63 65 6c 20 74 68 65 20 65 70 68 65 6d 65  ancel the epheme
35910 72 61 6c 20 74 61 62 6c 65 20 6f 70 65 6e 20 63  ral table open c
35920 6f 64 65 64 20 65 61 72 6c 69 65 72 2e 0a 20 20  oded earlier..  
35930 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
35940 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
35950 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f  ization - the co
35960 72 72 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f  rrect answer sho
35970 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61 72  uld result regar
35980 64 6c 65 73 73 2e 0a 20 20 20 20 20 20 2a 2a 20  dless..      ** 
35990 55 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47  Use the SQLITE_G
359a0 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67  roupByOrder flag
359b0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53   with SQLITE_TES
359c0 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 20  TCTRL_OPTIMIZER 
359d0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 73  to .      ** dis
359e0 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d 69  able this optimi
359f0 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74 69  zation for testi
35a00 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f  ng purposes.  */
35a10 0a 20 20 20 20 20 20 69 66 28 20 6f 72 64 65 72  .      if( order
35a20 42 79 47 72 70 20 26 26 20 4f 70 74 69 6d 69 7a  ByGrp && Optimiz
35a30 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
35a40 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f   SQLITE_GroupByO
35a50 72 64 65 72 29 20 0a 20 20 20 20 20 20 20 26 26  rder) .       &&
35a60 20 28 67 72 6f 75 70 42 79 53 6f 72 74 20 7c 7c   (groupBySort ||
35a70 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 53   sqlite3WhereIsS
35a80 6f 72 74 65 64 28 70 57 49 6e 66 6f 29 29 0a 20  orted(pWInfo)). 
35a90 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
35aa0 73 53 6f 72 74 2e 70 4f 72 64 65 72 42 79 20 3d  sSort.pOrderBy =
35ab0 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
35ac0 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
35ad0 6f 6f 70 28 76 2c 20 73 53 6f 72 74 2e 61 64 64  oop(v, sSort.add
35ae0 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20  rSortIndex);.   
35af0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45     }..      /* E
35b00 76 61 6c 75 61 74 65 20 74 68 65 20 63 75 72 72  valuate the curr
35b10 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
35b20 6d 73 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20  ms and store in 
35b30 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20  b0, b1, b2....  
35b40 20 20 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65      ** (b0 is me
35b50 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42  mory location iB
35b60 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d  Mem+0, b1 is iBM
35b70 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72  em+1, and so for
35b80 74 68 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  th).      ** The
35b90 6e 20 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75  n compare the cu
35ba0 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74  rrent GROUP BY t
35bb0 65 72 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65  erms against the
35bc0 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a   GROUP BY terms.
35bd0 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
35be0 65 20 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63  e previous row c
35bf0 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
35c00 69 6e 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e  in a0, a1, a2...
35c10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
35c20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20  addrTopOfLoop = 
35c30 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
35c40 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
35c50 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
35c60 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
35c70 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
35c80 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
35c90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
35ca0 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44  p3(v, OP_SorterD
35cb0 61 74 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ata, sAggInfo.so
35cc0 72 74 69 6e 67 49 64 78 2c 0a 20 20 20 20 20 20  rtingIdx,.      
35cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ce0 20 20 20 20 73 6f 72 74 4f 75 74 2c 20 73 6f 72      sortOut, sor
35cf0 74 50 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a  tPTab);.      }.
35d00 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
35d10 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
35d20 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
35d30 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20  if( groupBySort 
35d40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
35d50 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
35d60 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72  , OP_Column, sor
35d70 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b  tPTab, j, iBMem+
35d80 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  j);.        }els
35d90 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  e{.          sAg
35da0 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65  gInfo.directMode
35db0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
35dc0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
35dd0 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79  pParse, pGroupBy
35de0 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42  ->a[j].pExpr, iB
35df0 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
35e00 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
35e10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
35e20 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
35e30 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70   iAMem, iBMem, p
35e40 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a  GroupBy->nExpr,.
35e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e60 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
35e70 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52  )sqlite3KeyInfoR
35e80 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34  ef(pKeyInfo), P4
35e90 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
35ea0 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
35eb0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
35ec0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
35ed0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
35ee0 50 5f 4a 75 6d 70 2c 20 61 64 64 72 31 2b 31 2c  P_Jump, addr1+1,
35ef0 20 30 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64   0, addr1+1); Vd
35f00 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
35f10 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
35f20 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73  e code that runs
35f30 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52   whenever the GR
35f40 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a  OUP BY changes..
35f50 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73        ** Changes
35f60 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59   in the GROUP BY
35f70 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79   are detected by
35f80 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f   the previous co
35f90 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63  de.      ** bloc
35fa0 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  k.  If there wer
35fb0 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68  e no changes, th
35fc0 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70  is block is skip
35fd0 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ped..      **.  
35fe0 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65      ** This code
35ff0 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20   copies current 
36000 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69  group by terms i
36010 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20  n b0,b1,b2,.... 
36020 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20       ** over to 
36030 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68  a0,a1,a2.  It th
36040 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74  en calls the out
36050 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  put subroutine. 
36060 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
36070 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65  ts the aggregate
36080 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
36090 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72  isters in prepar
360a0 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66  ation.      ** f
360b0 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55  or the next GROU
360c0 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20  P BY batch..    
360d0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
360e0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
360f0 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41  Parse, iBMem, iA
36100 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Mem, pGroupBy->n
36110 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
36120 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
36130 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
36140 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
36150 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
36160 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
36170 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22  "output one row"
36180 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
36190 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
361a0 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46  P_IfPos, iAbortF
361b0 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 20 56  lag, addrEnd); V
361c0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
361d0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
361e0 74 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f  t((v, "check abo
361f0 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
36200 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
36210 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
36220 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
36230 65 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62  eset);.      Vdb
36240 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65  eComment((v, "re
36250 73 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22  set accumulator"
36260 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ));..      /* Up
36270 64 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61  date the aggrega
36280 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20  te accumulators 
36290 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  based on the con
362a0 74 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  tent of.      **
362b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
362c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
362d0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
362e0 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
362f0 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
36300 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
36310 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
36320 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36330 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
36340 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 1, iUseFlag);.
36350 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
36360 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
36370 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61  data in accumula
36380 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
36390 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
363a0 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  p.      */.     
363b0 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
363c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
363d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
363e0 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20   OP_SorterNext, 
363f0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
36400 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f  Idx, addrTopOfLo
36410 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  op);.        Vdb
36420 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
36430 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36440 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
36450 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
36460 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
36470 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61  hangeToNoop(v, a
36480 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a  ddrSortingIdx);.
36490 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
364a0 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e  * Output the fin
364b0 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  al row of result
364c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
364d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
364e0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
364f0 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64  egOutputRow, add
36500 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
36510 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
36520 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c  v, "output final
36530 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20   row"));..      
36540 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65  /* Jump over the
36550 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20   subroutines.   
36560 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
36570 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
36580 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20  ddrEnd);..      
36590 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
365a0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
365b0 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72  tputs a single r
365c0 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
365d0 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20  .      ** set.  
365e0 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  This subroutine 
365f0 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74  first looks at t
36600 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66  he iUseFlag.  If
36610 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20   iUseFlag.      
36620 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ** is less than 
36630 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
36640 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
36650 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
36660 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
36670 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66  ocessing calls f
36680 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  or the query to 
36690 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72  abort, this subr
366a0 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
366b0 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69  increments the i
366c0 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79  AbortFlag memory
366d0 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65   location before
366e0 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20   returning in.  
366f0 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20      ** order to 
36700 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65  signal the calle
36710 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20  r to abort..    
36720 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53    */.      addrS
36730 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65  etAbort = sqlite
36740 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
36750 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
36760 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
36770 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
36780 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
36790 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
367a0 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61  , "set abort fla
367b0 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
367c0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
367d0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
367e0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
367f0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
36800 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
36810 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
36820 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
36830 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
36840 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
36850 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
36860 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
36870 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72  , iUseFlag, addr
36880 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20  OutputRow+2);.  
36890 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
368a0 28 76 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  (v);.      VdbeC
368b0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75  omment((v, "Grou
368c0 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72  pby result gener
368d0 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74  ator entry point
368e0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
368f0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
36900 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
36910 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
36920 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
36930 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41  ions(pParse, &sA
36940 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73  ggInfo);.      s
36950 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
36960 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e  e(pParse, pHavin
36970 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  g, addrOutputRow
36980 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  +1, SQLITE_JUMPI
36990 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
369a0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
369b0 61 72 73 65 2c 20 70 2c 20 2d 31 2c 20 26 73 53  arse, p, -1, &sS
369c0 6f 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ort,.           
369d0 20 20 20 20 20 20 20 20 20 20 20 26 73 44 69 73             &sDis
369e0 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
369f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a00 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
36a10 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72  w+1, addrSetAbor
36a20 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
36a30 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
36a40 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
36a50 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
36a60 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
36a70 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75  end groupby resu
36a80 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b  lt generator"));
36a90 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
36aa0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
36ab0 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74   that will reset
36ac0 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63   the group-by ac
36ad0 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20  cumulator.      
36ae0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
36af0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
36b00 28 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  (v, addrReset);.
36b10 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
36b20 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
36b30 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
36b40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
36b50 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
36b60 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20   regReset);.    
36b70 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66   .    } /* endif
36b80 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69   pGroupBy.  Begi
36b90 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
36ba0 69 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55  ies without GROU
36bb0 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73  P BY: */.    els
36bc0 65 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e {.#ifndef SQLI
36bd0 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
36be0 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  NT.      Table *
36bf0 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
36c00 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65  (pTab = isSimple
36c10 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e  Count(p, &sAggIn
36c20 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  fo))!=0 ){.     
36c30 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c     /* If isSimpl
36c40 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73  eCount() returns
36c50 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
36c60 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c  Table structure,
36c70 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
36c80 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
36c90 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
36ca0 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  m:.        **.  
36cb0 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
36cc0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
36cd0 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a  <tbl>.        **
36ce0 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72  .        ** wher
36cf0 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
36d00 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72  cture returned r
36d10 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20  epresents table 
36d20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a  <tbl>..        *
36d30 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
36d40 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  s statement is s
36d50 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74  o common that it
36d60 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70   is optimized sp
36d70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20  ecially. The.   
36d80 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74       ** OP_Count
36d90 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
36da0 65 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20  executed either 
36db0 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61  on the intkey ta
36dc0 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  ble that.       
36dd0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
36de0 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20   data for table 
36df0 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20  <tbl> or on one 
36e00 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20  of its indexes. 
36e10 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  It.        ** is
36e20 20 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75   better to execu
36e30 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20  te the op on an 
36e40 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65  index, as indexe
36e50 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20  s are almost.   
36e60 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
36e70 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73  pread across les
36e80 73 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65  s pages than the
36e90 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ir corresponding
36ea0 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20   tables..       
36eb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
36ec0 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69  t int iDb = sqli
36ed0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
36ee0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
36ef0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
36f00 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
36f10 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Csr = pParse->nT
36f20 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72  ab++;     /* Cur
36f30 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72  sor to scan b-tr
36f40 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e  ee */.        In
36f50 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
36f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f70 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
36f80 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
36f90 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
36fa0 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Info = 0;       
36fb0 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e          /* Keyin
36fc0 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69  fo for scanned i
36fd0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
36fe0 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30  Index *pBest = 0
36ff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37000 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64       /* Best ind
37010 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20  ex found so far 
37020 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
37030 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75  Root = pTab->tnu
37040 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
37050 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
37060 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a  scanned b-tree *
37070 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  /..        sqlit
37080 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
37090 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
370a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
370b0 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
370c0 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
370d0 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
370e0 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  e);..        /* 
370f0 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69  Search for the i
37100 6e 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68  ndex that has th
37110 65 20 6c 6f 77 65 73 74 20 73 63 61 6e 20 63 6f  e lowest scan co
37120 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  st..        **. 
37130 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 31 2d         ** (2011-
37140 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f  04-15) Do not do
37150 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20   a full scan of 
37160 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69 6e 64  an unordered ind
37170 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ex..        **. 
37180 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 33 2d         ** (2013-
37190 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f  10-03) Do not co
371a0 75 6e 74 20 74 68 65 20 65 6e 74 72 69 65 73 20  unt the entries 
371b0 69 6e 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  in a partial ind
371c0 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ex..        **. 
371d0 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61         ** In pra
371e0 63 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66  ctice the KeyInf
371f0 6f 20 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c  o structure will
37200 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74   not be used. It
37210 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20   is only .      
37220 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b    ** passed to k
37230 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20  eep OP_OpenRead 
37240 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a  happy..        *
37250 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 48  /.        if( !H
37260 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
37270 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pBest = sqlite3P
37280 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
37290 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  Tab);.        fo
372a0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
372b0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
372c0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
372d0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
372e0 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a  ->bUnordered==0.
372f0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49             && pI
37300 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61  dx->szIdxRow<pTa
37310 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20 20 20  b->szTabRow.    
37320 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e         && pIdx->
37330 70 50 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30  pPartIdxWhere==0
37340 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
37350 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e  !pBest || pIdx->
37360 73 7a 49 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e  szIdxRow<pBest->
37370 73 7a 49 64 78 52 6f 77 29 0a 20 20 20 20 20 20  szIdxRow).      
37380 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
37390 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b     pBest = pIdx;
373a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
373b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
373c0 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20  f( pBest ){.    
373d0 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42        iRoot = pB
373e0 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  est->tnum;.     
373f0 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
37400 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
37410 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 42  Index(pParse, pB
37420 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  est);.        }.
37430 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  .        /* Open
37440 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
37450 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68 65  sor, execute the
37460 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65   OP_Count, close
37470 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a   the cursor. */.
37480 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
37490 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
374a0 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73  OP_OpenRead, iCs
374b0 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31  r, iRoot, iDb, 1
374c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
374d0 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
374e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
374f0 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
37500 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f  (char *)pKeyInfo
37510 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
37520 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
37530 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
37540 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20  p2(v, OP_Count, 
37550 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61  iCsr, sAggInfo.a
37560 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20  Func[0].iMem);. 
37570 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
37580 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
37590 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20  lose, iCsr);.   
375a0 20 20 20 20 20 65 78 70 6c 61 69 6e 53 69 6d 70       explainSimp
375b0 6c 65 43 6f 75 6e 74 28 70 50 61 72 73 65 2c 20  leCount(pParse, 
375c0 70 54 61 62 2c 20 70 42 65 73 74 29 3b 0a 20 20  pTab, pBest);.  
375d0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
375e0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
375f0 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20  BTREECOUNT */.  
37600 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
37610 20 54 68 69 73 20 63 61 73 65 20 72 75 6e 73 20   This case runs 
37620 69 66 20 74 68 65 20 61 67 67 72 65 67 61 74 65  if the aggregate
37630 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59   has no GROUP BY
37640 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20   clause.  The.  
37650 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
37660 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70  ing is much simp
37670 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72 65 20  ler since there 
37680 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  is only a single
37690 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20   row.        ** 
376a0 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20  of output..     
376b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
376c0 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42  sert( p->pGroupB
376d0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  y==0 );.        
376e0 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
376f0 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
37700 66 6f 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  fo);..        /*
37710 20 49 66 20 74 68 69 73 20 71 75 65 72 79 20 69   If this query i
37720 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
37730 72 20 74 68 65 20 6d 69 6e 2f 6d 61 78 20 6f 70  r the min/max op
37740 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 68 65 6e  timization, then
37750 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 69 6e 4d  .        ** minM
37760 61 78 46 6c 61 67 20 77 69 6c 6c 20 68 61 76 65  axFlag will have
37770 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
37780 20 73 65 74 20 74 6f 20 65 69 74 68 65 72 0a 20   set to either. 
37790 20 20 20 20 20 20 20 2a 2a 20 57 48 45 52 45 5f         ** WHERE_
377a0 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57  ORDERBY_MIN or W
377b0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58  HERE_ORDERBY_MAX
377c0 20 61 6e 64 20 70 4d 69 6e 4d 61 78 4f 72 64 65   and pMinMaxOrde
377d0 72 42 79 20 77 69 6c 6c 0a 20 20 20 20 20 20 20  rBy will.       
377e0 20 2a 2a 20 62 65 20 61 6e 20 61 70 70 72 6f 70   ** be an approp
377f0 72 69 61 74 65 20 4f 52 44 45 52 20 42 59 20 65  riate ORDER BY e
37800 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 68  xpression for th
37810 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  e optimization..
37820 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
37830 20 20 20 61 73 73 65 72 74 28 20 6d 69 6e 4d 61     assert( minMa
37840 78 46 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44  xFlag==WHERE_ORD
37850 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 7c 7c 20 70  ERBY_NORMAL || p
37860 4d 69 6e 4d 61 78 4f 72 64 65 72 42 79 21 3d 30  MinMaxOrderBy!=0
37870 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
37880 72 74 28 20 70 4d 69 6e 4d 61 78 4f 72 64 65 72  rt( pMinMaxOrder
37890 42 79 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78  By==0 || pMinMax
378a0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
378b0 31 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 53 45  1 );..        SE
378c0 4c 45 43 54 54 52 41 43 45 28 31 2c 70 50 61 72  LECTTRACE(1,pPar
378d0 73 65 2c 70 2c 28 22 57 68 65 72 65 42 65 67 69  se,p,("WhereBegi
378e0 6e 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  n\n"));.        
378f0 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
37900 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
37910 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
37920 65 72 65 2c 20 70 4d 69 6e 4d 61 78 4f 72 64 65  ere, pMinMaxOrde
37930 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rBy,.           
37940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37950 20 20 20 20 20 20 20 20 30 2c 20 6d 69 6e 4d 61          0, minMa
37960 78 46 6c 61 67 2c 20 30 29 3b 0a 20 20 20 20 20  xFlag, 0);.     
37970 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
37980 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
37990 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
379a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
379b0 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
379c0 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
379d0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  Info);.        i
379e0 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  f( sqlite3WhereI
379f0 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
37a00 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
37a10 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
37a20 76 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  v, sqlite3WhereB
37a30 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
37a40 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  ));.          Vd
37a50 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
37a60 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20  s() by index",. 
37a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
37a80 6d 69 6e 4d 61 78 46 6c 61 67 3d 3d 57 48 45 52  minMaxFlag==WHER
37a90 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d  E_ORDERBY_MIN?"m
37aa0 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20  in":"max")));.  
37ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
37ac0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
37ad0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
37ae0 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
37af0 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
37b00 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
37b10 7d 0a 0a 20 20 20 20 20 20 73 53 6f 72 74 2e 70  }..      sSort.p
37b20 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
37b30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
37b40 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
37b50 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20  aving, addrEnd, 
37b60 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
37b70 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74  L);.      select
37b80 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
37b90 2c 20 70 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a  , p, -1, 0, 0, .
37ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37bb0 20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64        pDest, add
37bc0 72 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a  rEnd, addrEnd);.
37bd0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
37be0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
37bf0 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  l(v, addrEnd);. 
37c00 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66     .  } /* endif
37c10 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
37c20 20 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74   */..  if( sDist
37c30 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d  inct.eTnctType==
37c40 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
37c50 4e 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20  NORDERED ){.    
37c60 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
37c70 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
37c80 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  CT");.  }..  /* 
37c90 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
37ca0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
37cb0 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  then we need to 
37cc0 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73  sort the results
37cd0 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74  .  ** and send t
37ce0 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  hem to the callb
37cf0 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  ack one by one..
37d00 20 20 2a 2f 0a 20 20 69 66 28 20 73 53 6f 72 74    */.  if( sSort
37d10 2e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  .pOrderBy ){.   
37d20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
37d30 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
37d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
37d50 53 6f 72 74 2e 6e 4f 42 53 61 74 3e 30 20 3f 20  Sort.nOBSat>0 ? 
37d60 22 52 49 47 48 54 20 50 41 52 54 20 4f 46 20 4f  "RIGHT PART OF O
37d70 52 44 45 52 20 42 59 22 3a 22 4f 52 44 45 52 20  RDER BY":"ORDER 
37d80 42 59 22 29 3b 0a 20 20 20 20 61 73 73 65 72 74  BY");.    assert
37d90 28 20 70 2d 3e 70 45 4c 69 73 74 3d 3d 70 45 4c  ( p->pEList==pEL
37da0 69 73 74 20 29 3b 0a 20 20 20 20 67 65 6e 65 72  ist );.    gener
37db0 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72  ateSortTail(pPar
37dc0 73 65 2c 20 70 2c 20 26 73 53 6f 72 74 2c 20 70  se, p, &sSort, p
37dd0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44  EList->nExpr, pD
37de0 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  est);.  }..  /* 
37df0 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69  Jump here to ski
37e00 70 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  p this query.  *
37e10 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
37e20 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
37e30 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  End);..  /* The 
37e40 53 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20  SELECT has been 
37e50 63 6f 64 65 64 2e 20 49 66 20 74 68 65 72 65 20  coded. If there 
37e60 69 73 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74  is an error in t
37e70 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75  he Parse structu
37e80 72 65 2c 0a 20 20 2a 2a 20 73 65 74 20 74 68 65  re,.  ** set the
37e90 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 20   return code to 
37ea0 31 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 20  1. Otherwise 0. 
37eb0 2a 2f 0a 20 20 72 63 20 3d 20 28 70 50 61 72 73  */.  rc = (pPars
37ec0 65 2d 3e 6e 45 72 72 3e 30 29 3b 0a 0a 20 20 2f  e->nErr>0);..  /
37ed0 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20  * Control jumps 
37ee0 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20 65 72  to here if an er
37ef0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
37f00 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f  ed above, or upo
37f10 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75  n.  ** successfu
37f20 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20  l coding of the 
37f30 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c  SELECT..  */.sel
37f40 65 63 74 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74  ect_end:.  sqlit
37f50 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
37f60 28 64 62 2c 20 70 4d 69 6e 4d 61 78 4f 72 64 65  (db, pMinMaxOrde
37f70 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  rBy);.  sqlite3D
37f80 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e  bFree(db, sAggIn
37f90 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  fo.aCol);.  sqli
37fa0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73 41  te3DbFree(db, sA
37fb0 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a 23  ggInfo.aFunc);.#
37fc0 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
37fd0 4e 41 42 4c 45 44 0a 20 20 53 45 4c 45 43 54 54  NABLED.  SELECTT
37fe0 52 41 43 45 28 30 78 31 2c 70 50 61 72 73 65 2c  RACE(0x1,pParse,
37ff0 70 2c 28 22 65 6e 64 20 70 72 6f 63 65 73 73 69  p,("end processi
38000 6e 67 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20 28  ng\n"));.  if( (
38010 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
38020 63 65 20 26 20 30 78 32 30 30 30 29 21 3d 30 20  ce & 0x2000)!=0 
38030 26 26 20 45 78 70 6c 61 69 6e 51 75 65 72 79 50  && ExplainQueryP
38040 6c 61 6e 50 61 72 65 6e 74 28 70 50 61 72 73 65  lanParent(pParse
38050 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
38060 74 65 33 54 72 65 65 56 69 65 77 53 65 6c 65 63  te3TreeViewSelec
38070 74 28 30 2c 20 70 2c 20 30 29 3b 0a 20 20 7d 0a  t(0, p, 0);.  }.
38080 23 65 6e 64 69 66 0a 20 20 45 78 70 6c 61 69 6e  #endif.  Explain
38090 51 75 65 72 79 50 6c 61 6e 50 6f 70 28 70 50 61  QueryPlanPop(pPa
380a0 72 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  rse);.  return r
380b0 63 3b 0a 7d 0a                                   c;.}.